Database

單個索引中的多個列與多個索引

  • May 21, 2019

我的問題的簡短版本是每個索引單列的三個索引和一個索引三列的索引之間的區別是什麼。背景如下。

我主要是一名程序員,但必須做 DBA 工作,因為我們沒有 DBA。我正在評估我們的索引與針對特定表執行的查詢。該表是我經常過濾或獲取最大值的 3 列。大多數時候查詢看起來像

select max(col_a) from table where col_b = 'avalue'

要麼

select col_c from table where col_b = 'avalue' and col_a = 'anothervalue'

所有列都獨立索引。我的問題是,如果我有一個索引 col_b 和 col_a 一起索引,因為它們可以一起出現在 where 子句中,我會看到任何區別嗎?

對於此類問題的簡單範例,很容易判斷哪個更好。對於實際情況,您的里程可能會根據查詢的其他部分而有很大差異。

在 MySQL 或者其他數據庫中,您可以在 (col_b, col_a) 上創建一個索引並將其用於您的兩個查詢 - 多列索引的任何最左側部分本身就是一個索引。(col1, col2, col3) 上的索引也是 (col1) 和 (col1, col2) 上的索引。

為了回答您的具體問題,我認為您將從 col_b 和 col_a 一起索引中獲得顯著的好處。如果您只為每列使用獨立索引,則會發生以下兩種情況之一 - 數據庫使用其中一個索引來考慮與其中一個值匹配的行子集,然後掃描它們以獲取第二個值,或者它確實一些花哨的即時索引合併以模擬兩列上的索引。MySQL 4 會做前者,而 MySQL 可以做後者。在任何一種情況下,您都可以創建組合索引,因為您希望使用它。

引用自:https://serverfault.com/questions/137483