索引

如何避免回表查询?什么是索引覆盖? | 1分钟MySQL优化系列

原创: 58沈剑大佬
这篇文章写的太好了,正中尿点。

什么是回表查询?

InnoDB有两大类索引:1.聚集索引 2.普通索引

\color{red}{InnoDB聚集索引的叶子节点存储行记录,}因此, InnoDB必须要有,且只有一个聚集索引:

  • 如果表定义了PK,则PK就是聚集索引;

  • 如果表没有定义PK,则第一个not NULL unique列是聚集索引;

  • 否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

\color{green}{画外音:所以PK查询非常快,直接定位行记录。}

\color{red}{InnoDB普通索引的叶子节点存储主键值。主键值、主键值、主键值!!!!}

结论
从普通索引无法直接定位行记录,需要通过普通索引树检索到主键值然后再通过聚集索引树最终定位到行数据,此为回表查询也。

来个图压压惊

什么是索引覆盖?

explain的输出结果Extra字段为Using index时,能够触发索引覆盖。
\color{red}{只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。}

如何实现索引覆盖?

盗一张图过来

盗两张图过来
盗三张图过来

哪些场景,可以利用索引覆盖来优化SQL?

  • 全表count查询优化 select count() 不要用* 括号里最好用索引字段

  • 列查询回表优化

select id,name,sex ... where name='shenjian';
这个例子不再赘述,将单列索引(name)升级为联合索引(name, sex),即可避免回表。

  • 分页查询
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容