重要的是要知道MySQL每個表和子查詢最多隻能使用一個索引(用於搜索,過濾和排序)(因此基本上每行都在explain
之間),所以在這裏只能使用一個索引。
對於您的第一個查詢,索引(A,B)
將允許MySQL執行範圍掃描並使用該順序。如果使用(A,B,C)
,那麼在範圍條件中不能使用C
列(因爲B
已經是一個範圍),但MySQL將節省讀取實際表數據的時間,以獲取C
的值來檢查最後一個條件。所以(A,B,C)
通常是這裏最快的選擇。
「一般」,因爲你當然可以有一個數據分佈,其他指標是最好的:如果你只有一行或兩行匹配C >= const
和10M +行與A = const
,只使用索引C
將是最快的。如果C
是一個非常大的列(例如varchar(700)
),它可能會炸燬索引並減慢速度。但要估計這種例外情況,需要對數據有更深入的瞭解。
對於第二個查詢,(A', X')
將是最佳選擇。如果你有兩個索引(A')
,(X')
,MySQL在大多數情況下(除非A'
是唯一的,但是你不需要order by
),使用X'
上的索引,並希望它很快會找到與A'
匹配的行。如果你只有一些匹配A' = const
的行(因爲它必須在X'
的表中來回跳轉(按主鍵排序)來查找符合條件的行),有時會出乎意料和痛苦地緩慢對於A'
)。
,如果你有索引(A)
和(B)
(但不(A,B)
或(A,B,C)
)你可能會得到你的第一個查詢了同樣的問題還有:MySQL的可能會使用(B)
代替(A)
(但檢查explain
以確保)。即使您現在只需添加一個索引,也可以當你添加索引(B)
來優化下週不同的查詢,並忘記了這個查詢,所以我建議堅持(至少)(A,B)
這真的取決於你的過濾器的結果和行' WHERE A = const'。如果這可以說是1000行,那麼您確實不需要'X''上的索引來進行排序,也不需要'B'和'C'來幫助再次篩選結果。如果它是數百萬行不同。你應該發佈你的解釋計劃或沒有什麼可以說的。 –
這將是我會問的另一個問題,但我在這個例子中的假設是我需要索引,並且我想知道MySQL是否需要(A,B,C)或(A,B),(C)索引是一個'ORDER BY C',當過濾器的數目爲1時,A,B,C或2.只是A和B –
但回答你的第一個問題:我的過濾器總是將結果減少到遠低於1000行的一組,所以我不會使用B和C作爲索引。感謝您的信息 –