跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 关于覆盖索引的问题
未分類
9 5 月 2020

关于覆盖索引的问题

关于覆盖索引的问题

資深大佬 : qmzhixu 9

最近复习看到覆盖索引的概念,有一个 Innodb 表 user(id pk,age),id 为主键,使用 EXPLAIN SELECT id from user where id=1; 可以发现使用到了覆盖索引,但是执行 EXPLAIN SELECT age from user where id=1; 时发现 并未使用到覆盖索引,查的资料都说 InnoDB 聚集索引的叶子节点存储行记录应该包含有 age 这个字段的,但是这行查询并没有用到覆盖索引,是不是我理解有误了。

大佬有話說 (13)

  • 資深大佬 : snappyone

    你这个表一共就 2 列还弄啥覆盖索引

  • 資深大佬 : Jacky23333

    @snappyone 老实人

  • 主 資深大佬 : qmzhixu

    @snappyone 我是想搞懂这个原理,两个列只是方便看。。

  • 資深大佬 : Jacky23333

    聚集索引里面包含 age 字段跟 age 有没有加索引完全没有关系,你说的聚集索引其实只包含了 id 字段,你的 age 字段都没有索引那自然不会有索引覆盖

  • 主 資深大佬 : qmzhixu

    @Jacky23333 嗯,因为可以用到 id 找到叶节点里面的 age,按理也没有回表检索了,所以是不是覆盖索引都没区别了

  • 主 資深大佬 : qmzhixu

    @Jacky23333 只是执行计划里面的 extra 字段显示的是不是 Using index 而已

  • 資深大佬 : imtemp

    覆盖索引的概念理解有差异,看看这题
    https://segmentfault.com/q/1010000018998466

  • 資深大佬 : imtemp

    官方文档里面对覆盖索引的定义: https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_covering_index

  • 資深大佬 : qumingkunnan

    索引覆盖是说通过索引查数据,然后查的数据刚好被索引包含了的意思吧?那么我理解你可以再加个字段 sex(这个字段可能加索引不太合适,只举例用),然后建立一个 age,sex 的索引,然后查询 age,sex 字段,条件用 age 或者 age,sex 。应该是满足索引覆盖的,验证下

  • 主 資深大佬 : qmzhixu

    @qumingkunnan 这种肯定是可以的,我指的是在聚集索引叶节点数据,不是其他的索引

  • 資深大佬 : qumingkunnan

    @qmzhixu 接我上条回复,聚簇索引通常只是主键做索引,你说的叶子节点是聚簇索引这个存储结构的一部分,不是索引。聚簇索引是 innodb 中表的存储形式,而不仅仅是索引。

  • 資深大佬 : gmhdbjd

    没赚你的 id 不是真的聚集索引

  • 資深大佬 : Aresxue

    是否使用覆盖索引和 age 上面有没有索引有直接关系, 没有索引的话自然不会走覆盖索引, 而且你这个 age 还很有可能区分度 cardinality 不够或者数据量很小,CBO 发现全表扫描的 cost 反而比较小,那就直接扫全表喽

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具