Sql优化之回表
内容提要
本文介绍了MySQL性能问题,重点是高并发访问和慢SQL。通过创建适当的索引来提高执行效率,并解决回表问题。减少回表次数和使用索引下推等技术可以提高MySQL性能。
延伸解读
回表为何成为性能瓶颈
回表是指通过辅助索引找到主键后,再根据主键到聚簇索引中读取完整行数据的过程。每次回表都意味着额外的随机I/O,在高并发或批量操作时,累积的I/O开销会显著拖慢响应。文章中的案例显示,即使SQL用到了索引且执行很快,仍可能因回表次数多而存在优化空间。理解回表的本质,是判断SQL能否进一步优化的关键。
覆盖索引:从源头避免回表
覆盖索引并非一种索引结构,而是一种优化手段:当查询所需的列全部包含在辅助索引(含主键)中时,数据库无需回表即可返回结果。例如将select *改为只查询id、shop_id、shop_type,就能利用组合唯一索引直接获取数据。文章建议在编写SQL时只查询业务必需的最小列集,这既能减少网络传输和内存占用,也为使用覆盖索引创造了条件。
更新语句:用主键替代唯一索引
文章对比了两种更新写法:按唯一索引更新和按主键更新。虽然两者都能定位到同一行,但执行过程不同。按唯一索引更新时,MySQL需要先通过辅助索引找到主键,再回表读取数据行,最后更新;而直接按主键更新则省去了第一步,直接回表并更新。因此,在已知主键的情况下,优先使用主键作为更新条件,可以减少一次索引查找,降低回表开销。
索引下推:减少回表的5.6新特性
索引下推(ICP)是MySQL 5.6引入的优化技术,核心是在遍历联合索引时,先利用索引中包含的列过滤掉不满足条件的记录,再对剩余记录回表。例如查询shop_id<102 and shop_type=1时,未开启ICP会先回表再过滤,可能产生多次回表;开启后直接在索引层过滤shop_type,只回表一次。文章提醒,ICP仅适用于select和二级索引,且子查询、存储过程等条件无法下推。
Q&A
什么是MySQL中的回表?
回表是指通过索引查找主键后,再查询完整数据的过程。
如何减少MySQL中的回表次数?
可以通过创建适当的索引、使用覆盖索引和索引下推等技术来减少回表次数。
什么是覆盖索引,它如何提高查询效率?
覆盖索引允许直接从索引中获取所需字段,避免回表,从而提高查询效率。
索引下推是什么,它的优势是什么?
索引下推是MySQL 5.6的新特性,可以在遍历联合索引时先过滤不符合条件的记录,从而减少回表次数。
在编写SQL时,如何优化查询的数据列?
应尽量减少查询的数据列,以满足业务的最小列集合,从而优化性能。
为什么减少回表对MySQL性能重要?
减少回表可以显著提高MySQL性能,降低数据库响应时间,避免性能下降。