具有範圍查詢的複合索引中的高基數列放置
當使用涉及範圍條件的複合索引查詢表時,索引中的列可以顯著影響效能。
考慮具有主鍵(did、檔案名稱)和兩個複合索引的表格檔案: INDEX(檔案時間, ext) 和 INDEX(ext, 檔案時間)。兩個索引都包含 filetime 列,該列的基數高於 ext。
查詢:
WHERE ext = '...' AND filetime BETWEEN ... AND ...
需要基於 ext 和檔案時間存取資料。問題出現了:對於這樣的查詢,哪一個索引是最佳的?
分析
要確定最佳索引,我們可以使用 FORCE INDEX 並檢查執行計劃:
-- Force range on filetime first FORCE INDEX(fe) SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime = '2015-01-01' AND filetime輸出顯示 INDEX(ext, filetime) (ef) 的行數顯著降低,表示掃描效率較高。
Optimizer Trace
為了進一步分析優化器的行為,我們可以使用優化器追蹤:
SELECT explain_format = 'JSON'; SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime追蹤顯示優化器選擇 INDEX(ext, filetime) 因為它可以使用索引的兩列來過濾和獲取資料。相較之下,INDEX(filetime, ext)只能使用第一列(filetime)進行篩選。
結論
根據分析,可以得出以下結論繪製:
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3