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