为什么不使用索引?

时间:2013-08-15 14:52:39

标签: mysql indexing

SELECT `Nen Straatnaam` as street, `Nen Woonplaats` as city, Gemeente,
   Postcode, acn_distinct.zipcodes, acn_distinct.lat, acn_distinct.lng 
FROM  `acn_distinct` INNER JOIN crimes as c
   ON `Nen Woonplaats` = c.place AND c.street_check = 0 
ORDER BY street ASC

EXPLAIN向我提供了这些信息:

id  select_type table           type    possible_keys                               key                 key_len ref             rows    Extra
1   SIMPLE      c               ref     idx_place,idx_street_check,fulltext_place   idx_street_check    1       const           67556   Using temporary; Using filesort
1   SIMPLE      acn_distinct    ref     ID_nen_woonplaats                           ID_nen_woonplaats   768     crimes.c.place  42      Using index condition

那么为什么不使用建议的索引?

1 个答案:

答案 0 :(得分:1)

它正在使用索引idx_street_check,但是,性能会很糟糕,因为它也会创建一个临时表并使用filesort这两个都是臭名昭着的罪魁祸首。

问题是为什么它没有在crimes.place上使用索引。我会尝试在(place,street_check)上创建一个多列索引。

但更重要的是,我认为你的表架构非常非常糟糕。你的JOIN形成不好:

FROM  `acn_distinct` INNER JOIN crimes as c
   ON `Nen Woonplaats` = c.place AND c.street_check = 0 

当你在表A和B之间进行JOIN时,你应该这样加入:A.x = B.y.但在这种情况下,你甚至没有提到表A.你将A中的行数乘以B的特定子集。