Я использовал запрос, который выглядел похож на этот:Странные Проблемы производительности с INNER JOIN vs. LEFT JOIN
SELECT `episodes`.*, IFNULL(SUM(`views_sum`.`clicks`), 0) as `clicks`
FROM `episodes`, `views_sum`
WHERE `views_sum`.`index` = "episode" AND `views_sum`.`key` = `episodes`.`id`
GROUP BY `episodes`.`id`
... который принимает ~ 0,1с для выполнения. Но это проблематично, потому что у некоторых episodes
нет соответствующей строки views_sum
, поэтому эти эпизоды не включены в результат.
То, что я хочу NULL значения, когда соответствующая views_sum
строка не существует, поэтому я попытался с помощью LEFT JOIN вместо:
SELECT `episodes`.*, IFNULL(SUM(`views_sum`.`clicks`), 0) as `clicks`
FROM `episodes`
LEFT JOIN `views_sum` ON (`views_sum`.`index` = "episode" AND `views_sum`.`key` = `episodes`.`id`)
GROUP BY `episodes`.`id`
Этот запрос производит те же столбцы, и он также включает в себя несколько строк отсутствует в первом запросе.
BUT, второй запрос длится в 10 раз! Полная секунда.
Почему существует такое огромное несоответствие между временем выполнения, когда результат настолько схож? Там нигде нет около В 10 раз больше строк - это похоже на 60 из 1-го запроса и 70 из 2-го. Это не говоря уже о том, что 10 дополнительных строк не содержат views
!
Любые световые сараи были бы высоко оценены!
(Есть указатели на episodes.id
, views_sum.index
и views_sum.key
.)
EDIT:
скопировать-вставить в SQL сверху, и здесь являются Объясняет, в следующем порядке:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE views_sum ref index,key index 27 const 6532 Using where; Using temporary; Using filesort
1 SIMPLE episodes eq_ref PRIMARY PRIMARY 4 db102914_itw.views_sum.key 1 Using where
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE episodes ALL NULL NULL NULL NULL 70 Using temporary; Using filesort
1 SIMPLE views_sum ref index,key index 27 const 6532
Я исправил ваше название, потому что в любом примере нет перекрестного соединения. Перекрестное соединение создает декартово произведение, но первый запрос использует синтаксис внутреннего соединения ANSI-89. – 2010-12-09 06:15:03
Спасибо, OMG. Итак, CROSS JOIN - ВХОДНАЯ ВСТУПЛЕНИЕ без какого-либо сравнения между двумя таблицами? – JKS 2010-12-09 06:20:49