[英]Indexing columns in mysql
我有一個mysql_query。 我想知道索引哪個。
SELECT count(*) FROM foo WHERE c=5 GROUP BY d
也許是(c,d)還是只是c?
我有另一個類似的。
SELECT count(*) FROM foo WHERE d=6 GROUP BY b
也許是(d,b)還是只是d?
另一個在這里:
SELECT a FROM foo WHERE b=5 GROUP BY c
這里(a,b,c)?
我的觀點只是使索引涵蓋三個查詢。這里最好的一個是? 在哪一列?
對於這三個查詢,您需要三個不同的索引,一個在a
,一個在b
,一個在c
。 這些可以是復合索引,因此它們可以是a,b,c
,'b,c,a ', and
c,b,a . But for each query, you need an index that has the one column in the
. But for each query, you need an index that has the one column in the
where子句中的一列作為索引的第一列。
MySQL使用左側的列-索引中列的順序很重要。
該文檔實際上對此進行了很好的解釋。
例如...僅考慮第一個查詢。 您只能索引“ c”列。 但是,如果對“ c”的選擇性較低(許多記錄的“ c”具有相同的值),則可以在(c,d)上創建一個復合索引,這樣優化器可以避免排序操作,因為使用索引范圍掃描,獲取已排序的記錄。 對於第三個查詢,如果您在所有三列上都創建了索引,則可以避免使用表訪問,因為您得到的結果僅是掃描索引。
但是,在為查詢選擇執行路徑時,優化器會考慮很多變量,因此,上面只是幾個簡單的示例。
我不是MySQL方面的專家,因此Gordon Linoff的答案可能比我的答案更為精確...
沒有一個索引可以涵蓋所有用例。
MySQL可以從按列排序/按列索引中受益。 通過執行文件排序和臨時表來保存它。 我的建議是:
1)(c,d)
2)(d,b)
3)對於最后一個(a,b,c)將不可用,因為它以a開頭(列順序很重要)。 適當的索引應該是(b,c,a)。
有點解釋:
MySQL執行以下操作:
另一個非常重要的事情是索引的選擇性。 例如,如果您有一個布爾值為50%的布爾值,而布爾值為50%的布爾值,MySQL將不使用索引,因為掃描整個表比遍歷索引樹更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.