索引失效情况
1 索引列运算
不要在索引列上进行运算操作, 索引将失效。
目前表格拥有的索引:
show index from tb_user;
当根据phone字段进行函数运算操作之后,索引失效。
explain select * from tb_user where substring(phone,10,2) = '15';
当根据phone字段进行等值匹配查询时, 索引生效。( 没有进行运算 )
explain select * from tb_user where phone = '17799990015';
2 字符串不加引号
字符串类型字段使用时,不加引号,索引将失效。
explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';
explain select * from tb_user where profession = '软件工程' and age = 31 and status = 0;
status = 0 未加引号,status 字段的索引失效。
explain select * from tb_user where phone = '17799990015';
explain select * from tb_user where phone = 17799990015;
未加引号,phone字段的索引失效。
3 模糊查询
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
explain select * from tb_user where profession like '软件%';
尾部模糊查询,索引不失效。
explain select * from tb_user where profession like '%工程';
头部模糊查询,索引失效。
在like模糊查询中,在关键字后面加%,索引可以生效。而如果在关键字前面加了%,索引将会失效。
4 or连接条件
用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
explain select * from tb_user where id = 10 or age = 23;
id为主键,具有主键索引,age不具有索引,所以,id的索引会失效。
对age建立索引
create index idx_user_age on tb_user(age);
explain select * from tb_user where id = 10 or age = 23;
age字段加了索引之后,索引生效。
5 数据分布影响
如果MySQL评估使用索引比全表更慢,则不使用索引。
查询数据时,与查询全表速度相近,MySQL不会使用索引,会进行全表查询。
MySQL在查询时,会评估使用索引的效率与走全表扫描的效率,如果走全表扫描更快,则放弃索引,走全表扫描。 因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不如走全表扫描来的快,此时索引就会失效。
是否会使用索引取决于MySQL评估,走索引快,还是全表扫描快。是否走索引,得具体情况具体分析,并不是固定的。(由MySQL进行判断)