最左原则,这种情况为什么会用到索引?

发布于 2022-09-12 03:13:07 字数 1485 浏览 24 评论 0

建表语句:

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

插入的数据:
截屏2020-06-12 下午2.35.19.png

查询的语句:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜心 2022-09-19 03:13:07

自问自答,原因找到了,是因为覆盖索引的问题,虽然是select * ,但是所有的字段都是索引字段,所以走了覆盖索引逻辑,不再满足最左原则,参考文章:https://segmentfault.com/a/11...

心病无药医 2022-09-19 03:13:07

Mysql新版的查询优化器,会自动优化查询顺序

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文