MySQL中的回表是什么?
什么是回表
回表指查询时,通过二级索引 (非主键索引) 获取主键值 (指针),再到主键索引中查找数据的情况。
原因:二级索引只存储索引列的值和主键值,如果所要查询的字段不在二级索引的索引列中,这个时候要回到主键索引中查找完整的数据行获取数据。
回表的影响:增加磁盘I/O,而且是随机I/O。因为在二级索引中,索引是按索引列的值排序,而非主键值排序。但数据行的排序是主键值的排序,这会造成从二级索引中查询到的一组数据的主键值可能不是有序的,也就是每次都需要随机I/O。
如何减少回表
少用Select *
对于一个表 table(col1, col2, col3),假设col1是主键,col2为二级索引。当我要通过col2查询col1时,我可以通过 select col1 from table where col2 = ?
,也可以通过select * from table where col2 = ?
。
前者可以使用二级索引而不回表,因为col2的值和col1 (主键)的值存储在二级索引中,后者使用索引,但要回表,因为select *
也需要col3的数据,二级索引中没有col3的数据,需要回到主键索引中查找。
覆盖索引和索引下推
覆盖索引是索引列完全包含查询条件,比如上面的二级索引和select col1 from table where col2 = ?
,覆盖索引是不回表的。
索引下推是指索引列不完全包含查询条件时,已匹配查询条件的索引列,可以将索引下推到引擎层进行数据过滤,再回表查找,减少了回表操作,减少磁盘I/O。
本文标题:MySQL中的回表是什么?
文章作者:Crowntit
发布时间:2025-05-26
最后更新:2025-05-26
版权声明:本文为原创文章,转载请附上原文出处链接。