最左原则,这种情况为什么会用到索引?
建表语句:
CREATE TABLE `user` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` char(10) NOT NULL,
`nick_name` varchar(20) NOT NULL DEFAULT '' COMMENT '昵称',
`job` varchar(20) NOT NULL DEFAULT '' COMMENT '职业',
PRIMARY KEY (`id`),
KEY `index_name` (`name`,`nick_name`,`job`)
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
插入的数据:
查询的语句:
explain select * from user where nick_name = 'ligoudan' and job = 'dog';
分析结果:
[
{
"id": 1,
"select_type": "SIMPLE",
"table": "user",
"partitions": null,
"type": "index",
"possible_keys": "index_name",
"key": "index_name",
"key_len": "204",
"ref": null,
"rows": 3,
"filtered": 33.33,
"Extra": "Using where; Using index"
}
]
查询的语句:
explain select * from user where job = 'ligoudan';
分析结果:
[
{
"id": 1,
"select_type": "SIMPLE",
"table": "user",
"partitions": null,
"type": "index",
"possible_keys": "index_name",
"key": "index_name",
"key_len": "204",
"ref": null,
"rows": 3,
"filtered": 33.33,
"Extra": "Using where; Using index"
}
]
我想不明白为什么会使用到索引,看了一些文章,最左原则,如果建了(a、b、c)的索引,说只有a 、ab 、abc会使用索引,可是我实际测试,b、c、bc这三种组合也使用到了索引,是我哪里理解不对么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
自问自答,原因找到了,是因为覆盖索引的问题,虽然是select * ,但是所有的字段都是索引字段,所以走了覆盖索引逻辑,不再满足最左原则,参考文章:https://segmentfault.com/a/11...
Mysql新版的查询优化器,会自动优化查询顺序