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

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

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

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 子句中的使用順序進行排序時,查詢效能會提高。
  • 基數本身並不是決定索引的決定性因素。最優指標。在範圍列具有較高基數但等式列涉及等式謂詞的情況下,將等式列放在第一位會產生更好的性能。
最新教學 更多>
  • 如何在 MPI 中有效發送和接收二維數組?
    如何在 MPI 中有效發送和接收二維數組?
    使用MPI 發送和接收2D 數組使用MPI 發送和接收2D 數組問題:您有一個大型2D 矩陣,需要跨多個處理使用MPI 的節點。節點之間唯一的通訊涉及在每個時間步後共享邊緣值。 方法:// (assume A is a 2D array) if (myrank == 0) { for (i = ...
    程式設計 發佈於2024-12-22
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-22
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-22
  • 如何在 CSS 媒體查詢中使用「OR」邏輯組合多個條件?
    如何在 CSS 媒體查詢中使用「OR」邏輯組合多個條件?
    使用OR 邏輯組合CSS 媒體查詢中的多個條件在CSS 媒體查詢中,使用「OR」邏輯指定多個條件可能很有用用於定位具有不同螢幕尺寸或方面的裝置。雖然問題中提供的程式碼不正確,但有一個簡單的方法可以實現所需的結果。 要使用「OR」邏輯指定多個條件,請用逗號分隔:@media screen and (m...
    程式設計 發佈於2024-12-21
  • 為什麼我的 Go 程式碼中出現「已匯入但未使用」錯誤?
    為什麼我的 Go 程式碼中出現「已匯入但未使用」錯誤?
    Go 中錯誤:「已匯入且未使用」Go 中匯入套件時,出現「已匯入且未使用」錯誤如果匯入的包未在目前文件中使用。 在您的情況下,您匯入了「./api」套件。編譯器偵測到您尚未在程式碼中使用此套件。要解決此錯誤,您需要實際利用套件中的某些內容。 您已經提到您在main 函數中使用api 包,但您的程式碼...
    程式設計 發佈於2024-12-21
  • 如何在 Python 列表推導式中使用 if/else 邏輯?
    如何在 Python 列表推導式中使用 if/else 邏輯?
    使用if/else 進行列表推導式:語法與用法在Python 中使用清單推導式時,會遇到合併if /else 邏輯的情況處理條件操作。本文介紹了此類場景的正確語法。 一個常見任務是根據來源序列建立一個列表,並使用以下包含 if/else 結構的 for 迴圈:results = [] for x i...
    程式設計 發佈於2024-12-21
  • 如何使用 JavaScript 轉義 JSON 字串中的換行符號?
    如何使用 JavaScript 轉義 JSON 字串中的換行符號?
    JavaScript 中使用換行符轉義JSON 字符串在JavaScript 中,構造JSON 字符串需要轉義特殊字符,包括換行符。為此,請按照下列步驟操作:1。字串化 JSON 物件:使用 JSON.stringify() 將 JSON 物件轉換為字串。 2.轉義換行符:利用 .replace()...
    程式設計 發佈於2024-12-21
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-12-21
  • 為什麼 SimpleDateFormat 錯誤地解析「YYYY-MM-dd HH:mm」?
    為什麼 SimpleDateFormat 錯誤地解析「YYYY-MM-dd HH:mm」?
    SimpleDateFormat 錯誤解析「YYYY-MM-dd HH:mm」試著解析格式為「YYYY-MM」的字串時-dd HH:mm" 到日期,一些開發人員遇到意外的日期結果。當使用SimpleDateFormat 類別並將lenient 設定設為false 時,會發生這種情況。 St...
    程式設計 發佈於2024-12-21
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-21
  • 如何在Python中高效率計算列表的平均值?
    如何在Python中高效率計算列表的平均值?
    在Python中計算清單的平均值確定清單的算術平均值或平均值對於統計分析至關重要。在 Python 中,有多種方法可用於此操作。以下是對每種方法的詳細探索:Python >= 3.8:statistics.fmean統計模組提供了浮點數的數值穩定性,確保準確的結果。這是Python 3.8及更高版本...
    程式設計 發佈於2024-12-21
  • 如何設計與標準庫正確整合的自訂 STL 容器?
    如何設計與標準庫正確整合的自訂 STL 容器?
    編寫自訂STL 容器的指南設計符合STL 約定的新容器時,遵循某些指南至關重要以確保其正確行為並與STL 庫整合。 迭代器介面:迭代器介面:定義一個具有適當的iterator_category標記的迭代器類,例如input_iterator_tag、output_iterator_tag、forwa...
    程式設計 發佈於2024-12-21
  • 為什麼 REST API 使用不同的 HTTP 方法(PUT、DELETE、POST、GET)?
    為什麼 REST API 使用不同的 HTTP 方法(PUT、DELETE、POST、GET)?
    REST API:HTTP 方法(PUT、DELETE、POST、GET)的重要性在RESTful API 領域,一個基本的問題出現了:為什麼要使用多種HTTP 請求類型,例如PUT、DELETE、POST 和GET?重要的是要了解 REST 的目的不僅僅是使用最簡單的方法存取資料。 REST 的角...
    程式設計 發佈於2024-12-21
  • 為什麼我的行動媒體查詢無法在行動裝置上運行?
    為什麼我的行動媒體查詢無法在行動裝置上運行?
    行動媒體查詢在行動裝置上不起作用:故障排除提示許多開發人員面臨行動裝置上CSS3 媒體查詢無回應的問題。如果您遇到此問題,讓我們根據您的查詢探索潛在的解決方案:在您的樣式表中,您正在使用行動裝置的媒體查詢,但在實際查看時它們似乎不起作用手機。相反,會顯示預設 CSS。 解決方案:驗證媒體查詢語法: ...
    程式設計 發佈於2024-12-21
  • 為什麼在 C++ 中使用 `` 時,`printf` 在 `std::printf` 和 `printf` 中都可以運作?
    為什麼在 C++ 中使用 `` 時,`printf` 在 `std::printf` 和 `printf` 中都可以運作?
    cstdio Stdio.h 命名空間cstdio Stdio.h 命名空間在 的C 參考文件中,它聲稱所有庫元素都駐留在std命名空間內。然而,實驗表明 std::printf 和 printf 函數呼叫都可以工作。這是否表示 C 頭檔案將符號名稱匯入 std 和全域命名空間? 答案包括 將符號...
    程式設計 發佈於2024-12-21

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

Copyright© 2022 湘ICP备2022001581号-3