适合建索引的情况
- 频繁作为WHERE条件语句查询的字段
- 关联字段需要建索引
- 排序字段可以建索引
- 分组字段需要建索引
- 使用到聚合函数的字段
不适合建索引的情况
- 频繁更新的字段
- WHERE条件用不到的字段
- 表数据量较小
- 数据重复较为均匀,例如性别,布尔类型等
- WHERE条件中参与列计算的字段
索引失效的情况
- 选择列用到*号,给name加索引
- 不遵循复合索引的字段顺序,复合索引具有传递性,如果中间某个字段无效索引,则后面的字段也不会索。给name,age,phone加复合索引
- 复合索引全部使
- 复合索引无效
- 复合索引部分有效,这里虽然使用到里复合索引,但真正的只有name字段使用到了索引,而phone字段没有使用索引。可以通过key_len与全部使用索引比较,这个较少说明索引的字段少于正常,间接反映age和phone字段没有参与索引
- 复合索引全部使
- 复合索引字段用到>和<查找,这里age字段使用大于号,后面的phone字段没有索引,从key_len显示出来的结果可以看出。
- 在索引列上做计算,给age加索引
- 在索引列上做类型转换,MySQL5.7 +以上
- 在索引列做函数计算
- 在索引列上使用不等于!=或<>
- 在索引列上使用IS NULL或IS NOT NULL,可能会导致索引无效
- 在索引列上使用like,并且最左边有%,右边有%则可以
- WHERE语句里出现OR
复合索引相关测试
1、复合索引使用> 或 <符号
可以看出这个是使用了复合索引的,但是key_len为65说明phone并没有用到索引。
2、复合索引进行运算
复合索引只有name有效。
3、复合索引不等于<>或!=
复合索引phone无效。
4、复合索引使用IS NULL
奇迹的是IS NULL竟然对复合索引无效,而且不管位置在哪。
但是对于IS NOT NULL,当在第一个字段时索引无效,而在第二个字段时,phone无效。
5、复合索引使用LIKE
LIKE的使用与单索引效果一致。
6、复合索引使用OR
OR简直是大杀器,不管在哪里用都会导致索引失效。