Mysql中有哪些减少回表的操作?


回表是指,InnoDB 在普通索引 a 上查到主键 id 的值后,再根据一个个主键 id 的值到主键索引上去查整行数据的过程。

  • 使用覆盖索引

    • 如果 select 的数据列只用从索引中就能够取得,不必从数据区中读取,这时候使用的索引就叫做覆盖索引

    • Explain 中 Using index,表示这个语句使用了覆盖索引。

  • 索引下推

    在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

  • join语句中的MRR优化,通过这个优化的主要目的是尽量使用顺序读盘

    • 回表肯定是一行行搜索主键索引的。虽然“按行查”这个机制不能改,但是调整查询的顺序,还是能够加速的。

    • 在join的时候,会一次取出一批数据的字段到join_buffer中,然后批量join,对这批数据进行递增排序,因为按照主键的递增顺序查询的话,对磁盘的读比较接近顺序读,能够提升读性能。顺序读,利用到了磁盘预读,会一次读取一个数据页(索引页)到内存中,下次查询相邻的数据就可以直接从内存中读

  • 利用延迟关联或者子查询优化超多分页场景

  • Mysql在进行order by 排序的时候,如果 MySQL 认为内存足够大,会优先选择全字段排序,把需要的字段都放到 sort_buffer 中,这样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM