InnoDB索引,终于懂了
共 2879字,需浏览 6分钟
·
2021-03-29 21:15
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B
此时,如何来设计数据表呢?
(1)身份证作为主键;
(2)其他属性上建立索引;
id_md5(index),
name(index),
birthday(index));
(1)id_code聚集索引,关联行记录;
(2)其他索引,存储id_code属性值;
(1)以id自增列为聚集索引,关联行记录;
(2)其他索引,存储id值;
user(id PK auto inc,
id_code(index),
id_md5(index),
name(index),
birthday(index));
t(id PK, name KEY, sex, flag);
画外音:id是聚集索引,name是普通索引。
表中有四条记录:
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B
两个B+树索引分别如上图:
(1)id为PK,聚集索引,叶子节点存储行记录;
(2)name为KEY,普通索引,叶子节点存储PK值,即id;
既然从普通索引无法直接定位行记录,那普通索引的查询过程是怎么样的呢?
通常情况下,需要扫码两遍索引树。
例如:
select id,name,sex from t where name='lisi';
是如何执行的呢?
如粉红色路径,需要扫码两遍索引树:
(1)先通过普通索引定位到主键值id=5;
(2)在通过聚集索引定位到行记录;
这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
问题6:如何优化回表查询?
常见的解决方案是覆盖索引。
什么是索引覆盖(Covering index)?
额,楼主并没有在MySQL的官网找到这个概念。
画外音:治学严谨吧?
借用一下SQL-Server官网的说法。
MySQL官网,类似的说法出现在explain查询计划优化章节,即explain的输出结果Extra字段为Using index时,能够触发索引覆盖。
不管是SQL-Server官网,还是MySQL官网,都表达了:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
如何实现索引覆盖?
常见的方法是:将被查询的字段,建立到联合索引里去。
对于查询需求
画外音:属性sex不用到聚集索引查询了。
架构师之路-分享可落地的架构文章