2013-02-22 268 views
2

首先,我有以下表結構。爲什麼Mysql不在索引列上使用INNER JOIN表的索引?

Table Document 
    ## DocID ## ##DocName ## 
     1   Doc1 
     2   Doc2 
     3   Doc3 
Table FolderTree 
    ## FolderID ## ## MemberDocID ## 
      1    1 
      1    2 
      1    3 

我對的DocID,FolderID和MemberDocID

我有以下查詢索引。

SELECT DISTINCT d.* FROM Document d inner join FolderTree f on (d.DocID = f.MemberDocID) where f.FolderID = 1 

explain輸出:

| select type | table | type | possible_keys | key  | rows | extra   | 

    simple  d  All  PRIMARY  NULL   83168 Using temporary 
    simple  f  ref  MemberDocID MemberDocID 11  Using index 

我的問題是,爲什麼在表d MySQL的使用表掃描,其中i上的DocID有指標?

謝謝先進。

+0

@bernie此處的根本原因與鏈接的可能重複中的原因不同。雖然他們聽起來像是類似的問題,但他們不是。 – 2013-02-22 21:46:54

回答

2

這是因爲您要在文檔表中的所有列上選擇DISTINCT。 DocName上沒有索引,因此無法優化對不同值的搜索。

+0

我刪除了DISTINCT KEYWORD並在DocName上添加了索引。它現在使用索引作爲鍵,但要檢查的行具有相同的值。有沒有什麼辦法可以進一步優化我的查詢,或者有什麼我需要爲我添加最佳優化我的查詢。謝謝 – 2013-02-22 22:01:35

+0

如果您不查詢DISTINCT,則不需要DocName上的索引。文檔表中有多少行?由於您要對folderTree表中的列進行過濾,因此您可能通過交換聯接中表的順序來獲得更好的性能。因此,這可能應該是MySQL首先讀取的表。 – 2013-02-22 22:17:44

+0

謝謝,我會看看這個。 – 2013-02-24 23:51:29