一、单表查询时索引失效
1、mysql查询单表时,查询得到的结果集占数据总量很大比例,mysql会认为全表扫描会优于索引,则不走索引。
例:比如企业人员信息表 (userInfo),字段(user_id、user_name、user_type(vachar)),假设企业里有10w人,一千个管理层user_type为1,9万9千人为普通员工user_type为2,
sql:select * from userInfo where user_type='2' 这时user_type字段索引可能会失效
2、查询时where条件后的字段类型要与表结构中该字段类型一致,
例:select * from userInfo where user_type=2 ,user_type在表结构中时字符类型,查询时没用有单引号包含起来则不走索引。
3、在where条件后对索引字段加了函数转换或者运算逻辑(+、-、*、/、!、<>、%、like'%_'(%放在前面)、or、in (疑问、可能存在成本问题)、exist等)的处理,比如对时间戳字段进行日期格式化函数都会引起索引失效。
二、多表关联查询时索引失效
1、在表结构设计阶段主表与关联表之间的关联字段的数据类型、数据长度、字段的编码格式以及字段的排序规则需要保持一致
三、组合索引
1、当一张表的查询方式比较固定,这时候可以尝试创建聚集索引,查询时应当遵从组合索引的规则,最左原则,查询时使用最频繁的一列放在最左边,
例:index(user_id,user_name,user_type)这是一个组合索引,当查询时如果想走索引则
sql:select * from userInfo where user_id='001' and user_name='小张' and user_type='1';这个时候是走了索引的,但是
select * from userInfo where user_name='小张' and user_type='1';这时user_id没有在where条件内将不走索引;
此例,user_id字段必须出现在where后面,不然索引将不会生效。