範圍查詢複合索引中的高基數列放置
當使用涉及範圍條件的複合索引查詢表時,索引中的列可以顯著影響性能。
考慮具有主鍵的表檔(did, filename) 和兩個複合索引:INDEX(filetime, ext) 和 INDEX(ext, filetime)。兩個索引都包含 filetime 列,該列的基數高於 ext。
查詢:
WHERE ext = '...' AND filetime BETWEEN ... AND ...
需要基於 ext 和 filetime 存取資料。問題出現了:對於這樣的查詢,哪一個索引是最佳的?
分析
要確定最佳索引,我們可以使用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' + INTERVAL 1 MONTH; -- Force low-cardinality ext first FORCE INDEX(ef) SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
輸出顯示INDEX(ext, filetime) (ef)的行數明顯較低,表示效率較高
優化器追蹤
要進一步分析最佳化器的行為,我們可以使用最佳化器追蹤:
SELECT explain_format = 'JSON'; SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
追蹤顯示最佳化器選擇INDEX(ext, filetime),因為它可以使用索引的兩個欄位來過濾和取得資料。相較之下,INDEX(filetime, ext)只能使用第一列(filetime)進行篩選。
結論
根據分析,可以得出以下結論繪製:
以上是哪一種複合索引最適合範圍查詢:高基底數列與低基數列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!