首頁 >資料庫 >mysql教程 >哪一種複合索引最適合範圍查詢:高基底數列與低基數列?

哪一種複合索引最適合範圍查詢:高基底數列與低基數列?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-24 14:10:47252瀏覽

Which Composite Index is Optimal for Range Queries: High vs. Low Cardinality Columns?

範圍查詢複合索引中的高基數列放置

當使用涉及範圍條件的複合索引查詢表時,索引中的列可以顯著影響性能。

考慮具有主鍵的表檔(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)進行篩選。

結論

根據分析,可以得出以下結論繪製:

  • 對於範圍查詢中使用的複合索引,相等謂詞涉及的欄位(本例中為ext case) 應放在索引定義的第一位。
  • 當索引中的欄位按照它們在 WHERE 子句中的使用順序進行排序時,查詢效能會提高。
  • 基數單獨的因素並不是決定最佳指標的決定性因素。在範圍列具有較高基數但等式列涉及等式謂詞的場景中,將等式列放在第一位會產生更好的效能。

以上是哪一種複合索引最適合範圍查詢:高基底數列與低基數列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn