2012-08-23 99 views
1

我有一張銷售信息表。其中一列叫royalty_currency,我需要從這張表中拉出所有不同的貨幣。這樣做的查詢是:爲什麼此查詢使用索引?

SELECT distinct `royalty_currency` FROM `sales_raw` 

當我沒有在此列的索引,EXPLAIN語句給我:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE sales_raw ALL NULL NULL NULL NULL 195121 Using temporary 

後,我添加一個索引,EXPLAIN語句給我:

id select_type table  type possible_keys key    key_len ref rows Extra 
1 SIMPLE  sales_raw range NULL   royalty_currency92  NULL 211 Using index for group-by 

我的問題是,爲什麼SELECT語句需要使用索引?我認爲索引是針對WHERE條款的?如果只選擇一個列,爲什麼需要使用索引?最後,這是我使用的常見查詢 - 是否應該在royalty_currency上的此表中添加索引?

+0

就像人們在下面的回答中所說的,索引不僅僅用於'WHERE'子句。排序索引可用於'ORDER BY'和(在你的情況下)'GROUP BY'子句。有關索引使用'GROUP BY'的更多信息,請參閱此處:http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html – theon

回答

1

索引不僅用於條件,它們可以用於連接表等事情,也可以用於分組。

select royalty_currency from sales_raw group by royaly_currency 

該指數是用於分組,其非常適合作爲指標已經進行分組:

查詢作爲被解釋。正如你所看到的那樣,當使用索引時,引用行的數量會大大減少,從而使查詢使用的資源少得多。

+0

「查詢解釋爲:」 - - 有沒有關於這方面的任何信息?還沒有看到優化程序將「DISTINCT」擴展爲「GROUP BY」的解釋 – zerkms

+0

@zerkms:解釋輸出顯示使用分組。 – Guffa

+0

「對組使用索引 - 通過 與使用索引表訪問方法類似,對group-by使用索引指示MySQL找到了一個索引,該索引可用於檢索GROUP BY或DISTINCT查詢的所有列,而無需任何額外的磁盤訪問實際的表格。「 - 但這並不意味着查詢實際上被重寫爲一個」GROUP BY「表單,它們只是共享相同的額外的 – zerkms

-1

它說得那麼正確,使用GROUP BY的索引。我知道你沒有使用明確的GROUP BY,但這就是你的DISTINCT。因此,優化器認爲使用索引(我假設該列是其鍵的一部分)更好,以獲得該列的不同值。

2

查詢優化器似乎將您的distinct royalty_currency需求轉換爲group by royalty_currency。直觀地說,應該清楚這兩者是相同的。

group-by使用索引,因爲它更有效地找到在該列的索引中具有相同「royalty_currency」的記錄,而不是在表中(在索引中,這些記錄全部按順序存儲在葉中B +樹索引的節點 - 假設B +樹索引)

爲了給你更多的技術細節,我可以告訴你,B +樹的葉節點連接在一個鏈表中。查詢引擎所做的是去B +樹(索引)的最右邊的葉子,並開始讀取每個葉子中的所有值,每次發現它返回的新值時,它會忽略其餘的相同值。

相關問題