2016-11-19 22 views
1

我有這些疑問:優化與ORDER SELECT語句通過使用指數

第一次查詢:

SELECT (..) FROM db WHERE A = const AND B > const AND C >= const ORDER BY B DESC LIMIT const 

第二查詢(不同的DB):

SELECT (...) FROM db' WHERE A' = const ORDER BY X' DESC LIMIT const 

關於產品:1查詢: 由於ORDER BY聲明,是否有足夠多的行索引(A,B,C)或是否需要額外的單行索引(B)(或不同的索引)?

關於第二個查詢的問題:在這個查詢中,我需要一個多行索引(A',X')還是兩個單行索引(A'),(X')?

+0

這真的取決於你的過濾器的結果和行' WHERE A = const'。如果這可以說是1000行,那麼您確實不需要'X''上的索引來進行排序,也不需要'B'和'C'來幫助再次篩選結果。如果它是數百萬行不同。你應該發佈你的解釋計劃或沒有什麼可以說的。 –

+0

這將是我會問的另一個問題,但我在這個例子中的假設是我需要索引,並且我想知道MySQL是否需要(A,B,C)或(A,B),(C)索引是一個'ORDER BY C',當過濾器的數目爲1時,A,B,C或2.只是A和B –

+0

但回答你的第一個問題:我的過濾器總是將結果減少到遠低於1000行的一組,所以我不會使用B和C作爲索引。感謝您的信息 –

回答

2

重要的是要知道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)