回表是指,InnoDB 在普通索引 a 上查到主键 id 的值后,再根据一个个主键 id 的值到主键索引上去查整行数据的过程。
- 使用覆盖索引
- 如果 select 的数据列只用从索引中就能够取得,不必从数据区中读取,这时候使用的索引就叫做 覆盖索引。
- Explain 中
Using index
,表示这个语句使用了覆盖索引。 - 索引下推 在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数
- join语句中的
MRR
优化,通过这个优化的主要目的是尽量使用顺序读盘。 - 回表肯定是一行行搜索主键索引的。虽然”按行查”这个机制不能改,但是调整查询的顺序,还是能够加速的。
- 在join的时候,会一次取出一批数据的字段到
join_buffer
中,然后批量join,对这批数据进行递增排序,因为 按照主键的递增顺序查询的话,对磁盘的读比较接近顺序读,能够提升读性能。顺序读,利用到了磁盘预读,会一次读取一个数据页(索引页)到内存中,下次查询相邻的数据就可以直接从内存中读 - 利用延迟关联或者子查询优化超多分页场景
- Mysql在进行order by 排序的时候,如果 MySQL 认为内存足够大,会优先选择全字段排序,把需要的字段都放到
sort_buffer
中,这样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。
Original: https://www.cnblogs.com/dong320/p/14888559.html
Author: 轨迹320
Title: Mysql中有哪些减少回表的操作?
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573460/
转载文章受原作者版权保护。转载请注明原作者出处!