主博客:
【MySQL精通之路】SQL優化(1)-查詢優化-CSDN博客
上一篇:
【MySQL精通之路】SQL優化(1)-查詢優化(10)-外部聯接簡化-CSDN博客
下一篇:
當基表很大且未存儲在存儲引擎的緩存中時,使用輔助索引上的范圍掃描讀取行可能會導致對基表的多次隨機磁盤訪問。通過磁盤掃描多范圍讀取(MRR)優化,MySQL試圖通過首先僅掃描索引并收集相關行的key來減少范圍掃描的隨機磁盤訪問次數。然后對鍵進行排序,最后使用主鍵的順序從基表中檢索行。磁盤掃描MRR的動機是減少隨機磁盤訪問的次數,而不是實現對基表數據的更有序的掃描。
多范圍讀取優化提供了以下好處:
MRR使數據行能夠基于索引元組按順序訪問,而不是按隨機順序訪問。服務器獲取一組滿足查詢條件的索引元組,根據數據行ID順序對其進行排序,并使用排序后的元組按順序檢索數據行。這使得數據訪問更加高效且成本更低。
MRR允許批量處理需要通過索引元組訪問數據行的操作的密鑰訪問請求,例如范圍索引掃描和使用聯接屬性索引的等聯接。MRR對一系列索引范圍進行迭代,以獲得合格的索引元組。隨著這些結果的積累,它們被用來訪問相應的數據行。在開始讀取數據行之前,不必獲取所有索引元組。
在虛擬生成列上創建的輔助索引不支持MRR優化。InnoDB支持虛擬生成列的二級索引。
以下場景說明了MRR優化何時是有利的:
場景A:MRR可用于InnoDB和MyISAM表,用于索引范圍掃描和等聯接操作。
1.索引元組的一部分被累積在緩沖器中。
2.緩沖區中的元組按其數據行ID進行排序。
3.根據排序后的索引元組序列來訪問數據行。
場景B:MRR可用于NDB表,用于多個范圍索引掃描或按屬性執行等聯接。
1.一部分范圍,可能是單鍵范圍,被累積在提交查詢的中心節點上的緩沖區中。
2.范圍被發送到訪問數據行的執行節點。
3.訪問的行被打包到包中,并發送回中心節點。
4.接收到的具有數據行的包被放置在緩沖區中。
5.從緩沖區讀取數據行。
當使用MRR時,EXPLAIN輸出中的Extra列顯示Using MRR。
如果不需要訪問完整的表行來生成查詢結果,那么InnoDB和MyISAM不使用MRR。
如果結果可以完全基于索引元組中的信息(通過覆蓋索引)產生,則是這種情況;MRR沒有任何好處。
兩個優化器開關系統變量標志為MRR優化的使用提供了接口。mrr標志控制是否啟用mrr。如果啟用了mrr(啟用),則基于mrr_cost_based標志控制優化器是嘗試使用和不使用mrr(啟用)之間進行基于成本的選擇,還是盡可能使用mrr。
默認情況下,mrr處于啟用狀態,mrr_cost_based處于啟用狀態。
請參閱“可切換優化”。
對于MRR,存儲引擎使用read_rnd_buffer_size系統變量的值作為可以為其緩沖區分配多少內存的準則。
引擎最多使用read_rnd_buffer_size字節,并確定單次處理的范圍數。