MySQL 單一欄位索引和多欄位索引如何運作以及實驗

在 MySQL 中,索引是一種資料結構,能夠幫助優化查詢操作,加速資料檢索。

MySQL 單一欄位索引

MySQL 單一欄位索引是指為表中的每個欄位分別建立一個索引,也稱為單欄索引。每個索引都包含單個欄位的值,而查詢涉及到該欄位的操作可以使用索引加速執行。然而,如果查詢涉及多個欄位,每個欄位都有自己的索引,MySQL 將需要合併這些索引的結果才能返回最終結果,這可能會很慢且消耗系統資源。

MySQL 多欄位索引

MySQL 多欄位索引(也稱為複合索引或聯合索引)是建立一個涵蓋多個欄位的索引。通過創建涵蓋多個欄位的索引,MySQL 可以更有效地執行涉及這些欄位的查詢。當查詢涉及到複合索引中的所有或部分欄位時,MySQL 可以使用該索引檢索所需的數據,而無需合併多個單欄索引。這可以顯著提高涉及多個欄位的查詢效率。

MySQL 多欄位索引運作方式

當建立一個多欄位索引時,MySQL 會按照索引中定義的欄位順序建立索引。例如,如果建立一個包含 "last_name" 和 "first_name" 欄位的複合索引,那麼 MySQL 將首先按照 "last_name" 欄位進行排序,然後在每個 "last_name" 值中,再按照 "first_name" 欄位進行排序。這樣可以使 MySQL 在查詢時快速定位到所需的數據,而不需要進行額外的排序操作。

當一個查詢涉及到多個欄位時,MySQL 可以使用多欄位索引進行查詢優化。如果查詢涉及到多欄位,MySQL 將使用複合索引中所有涉及的欄位進行查詢。如果查詢涉及到複合索引中的第一個欄位,MySQL 可以直接使用複合索引進行查詢。如果查詢涉及到複合索引中的其他欄位,MySQL 也可以使用索引中的部分資訊,以加速查詢操作。

需要注意的是,當一個查詢只涉及到複合索引中的一部分欄位時,MySQL 可能無法使用該索引進行查詢優化。因此,在設計多欄位索引時,需要根據實際查詢需求來考慮索引中包含哪些欄位,以達到最佳的查詢優化效果。

MySQL 欄位索引實驗

實驗情境:9260825 個資料列

目前索引為:a_b_c_date

使用 date 做查詢的狀況:EXPLAIN SELECT * FROM data_rows WHERE date = '2023-02-28';

select_type: SIMPLE
type: ALL
possible_keys: null
key: null
rows: 9260825
filtered: 10.00
Extra: Using where

加上單一欄位 date 索引

相同的查詢解釋:EXPLAIN SELECT * FROM data_rows WHERE date = '2023-02-28';

select_type: SIMPLE
type: ref
possible_keys: date_index
key: date_index
rows: 1950692
filtered: 10.00

小結論

多欄位並不是真的涵蓋單一欄位,因為 date 雖然有在複合索引中但卻沒被採用。因此建議還是要做單一欄位索引,另外在這樣有九百多萬筆的表格下做單一欄位索引大概只要花費兩分鐘。