簡體   English   中英

mysql中的索引列

[英]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執行以下操作:

  1. 過濾結果(需要b)
  2. 如果按列對索引進行排序或對其進行排序(需要c)(group by相同),則按順序獲取它
  3. 返回選擇部分中的列(需要一個)

另一個非常重要的事情是索引的選擇性。 例如,如果您有一個布爾值為50%的布爾值,而布爾值為50%的布爾值,MySQL將不使用索引,因為掃描整個表比遍歷索引樹更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM