」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 哪一種複合索引最適合範圍查詢:高基底數列與低基數列?

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

發佈於2024-12-21
瀏覽:400

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

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

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

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

結論

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

  • 對於範圍查詢中使用的複合索引,等式謂詞中涉及的列(本例中為ext)應放在索引的前面定義。
  • 當索引中的欄位依照它們在 WHERE 子句中的使用順序進行排序時,查詢效能會提高。
  • 基數本身並不是決定索引的決定性因素。最優指標。在範圍列具有較高基數但等式列涉及等式謂詞的情況下,將等式列放在第一位會產生更好的性能。
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3