前言
之前很多面试都被问过联合索引不匹配最左原则失效的问题,当时一直以为只要不满足最左原则,联合索引就会失效,面试官也没有反馈过有什么问题,今天突然发现一条sql并没有遵循最左原则,但还是用到了联合索引。
测试
表结构:
name和age字段建立联合索引
查询覆盖索引命中的字段:
explain select age from test where age = 2644;
查询count(*) (不查询具体字段):
explain select count(*) from test where age = 2644;
查询非覆盖索引的字段:
explain select status from test where age = 2644;
扫描二维码关注公众号,回复:
10303131 查看本文章
结论
- 查询非覆盖索引字段时,不会使用索引
- 查询覆盖索引字段时,会使用索引,但是扫描的行数仍然是全表,之所以使用索引,是因为索引大小<全表大小(前提是覆盖索引不是全部字段),所以可以有效减少IO,查询优化器仍然会利用索引。
- 查询count(*)原理同上