0
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

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

4

1 回答 1

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 时,你应该这样加入: Ax = By 但在这种情况下,你甚至没有引用表 A。你将 A 中的行数乘以 B 的特定子集.

于 2013-08-15T15:11:44.167 回答