针对索引字段的唯一性不高的情况下(索引的"区分度"低),优化器可能会选择全表扫描,而不是走索引。这可能是因为等值查询符合条件的记录太多了,导致了mysql认为全表扫描比用索引查找更快。
比如你对唯一性不高的字段(如性别:男/女)加了索引,这样通过索引去查找可能还需回表,还不如直接全表扫描!
若in中的数据量较大时,基本就不走索引了。如果你索引字段是一个unique,in可能就会用到索引。
如果你一定要用索引,可以用 force index。可能也和MySQL版本有关(5.6以后有做in的查询优化)
CREATE TABLE `test_a` (
id int PRIMARY KEY AUTO_INCREMENT,
`id_a` varchar(20) ,
`name` varchar(20) ,
`sort` int(11) DEFAULT NULL,
`sort1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
自增主键,mysql会自动创建唯一索引
表里记录4条
EXPLAIN SELECT * from test_a WHERE id in(1,2,3)
走索引在指定范围内进行查询 range
EXPLAIN SELECT * from test_a WHERE id in(1,2,3,4)
全表扫描,不走索引,表里有4条数据,查询也是4条,mysql判定全表扫描
mysql会根据表里的总条数和查询条数判定是否应该走索引,自己指定force index(索引名字)
mysqlunionall无法走索引11 271. like %%失效。 方案:改为like %,只写后面的%就能走索引。
2. 虽然有索引,但是查询条件没有索引列或者order by 排序没有索引列。 方案:让查询条件有索引列
3. 索引列存在null值的情况。 方案:索引列如果没有值,则给空字符串或者数字的0,总之就是不要设置null
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)