1. 程式人生 > 其它 >Mysql中有哪些減少回表的操作?

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

回表是指,InnoDB 在普通索引 a 上查到主鍵 id 的值後,再根據一個個主鍵 id 的值到主鍵索引上去查整行資料的過程。

  • 使用覆蓋索引

    • 如果 select 的資料列只用從索引中就能夠取得,不必從資料區中讀取,這時候使用的索引就叫做覆蓋索引

    • Explain 中 Using index,表示這個語句使用了覆蓋索引。

  • 索引下推

    在索引遍歷過程中,對索引中包含的欄位先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數

  • join語句中的MRR優化,通過這個優化的主要目的是儘量使用順序讀盤

    • 回表肯定是一行行搜尋主鍵索引的。雖然“按行查”這個機制不能改,但是調整查詢的順序,還是能夠加速的。

    • 在join的時候,會一次取出一批資料的欄位到join_buffer中,然後批量join,對這批資料進行遞增排序,因為按照主鍵的遞增順序查詢的話,對磁碟的讀比較接近順序讀,能夠提升讀效能。順序讀,利用到了磁碟預讀,會一次讀取一個數據頁(索引頁)到記憶體中,下次查詢相鄰的資料就可以直接從記憶體中讀

  • 利用延遲關聯或者子查詢優化超多分頁場景

  • Mysql在進行order by 排序的時候,如果 MySQL 認為記憶體足夠大,會優先選擇全欄位排序,把需要的欄位都放到 sort_buffer 中,這樣排序後就會直接從記憶體裡面返回查詢結果了,不用再回到原表去取資料。