MySql回表以及产生原因
MySql回表以及产生原因
在SQL优化里面经常提到,如在非主键索引的情况下尽量避免使用select*from;
究其原因就是今天我要记录的Mysql回表查询。
Mysql回表指的是在InnoDB存储引擎下,二级索引查询到的索引列,如果需要查找所有列的数据,则需要到主键索引里面去取出数据。这个过程就称为回表。因为行的数据都是存在主键B+tree的叶子节点里面,二级索引的B+树叶子节点都是存放的(索引列,主键)。
所以这里我们就引出了第二个约定,尽量使用覆盖索引,其本质也是为了避免回表查询。
回表小结
基于非主键索引的查询需要多扫描一棵索引树,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
在应用中应该尽量使用主键查询,这里表中就四条数据,如果数据量大的话,就可以明显的看出使用主键查询效率更高。
使用聚集索引(主键或第一个唯一索引)就不会回表,普通索引就会回表。
如何避免回表
实现覆盖索引
常见的方法是将被查询的字段,建立到联合索引中。
解释性SQL的explain的输出结果Extra字段为Using index时表示触发了索引覆盖。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通