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