2013-02-22 276 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