Я использовал запрос, похожий на этот:
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`
Этот запрос создает те же столбцы, а также содержит несколько строк, отсутствующих в 1-м запросе.
НО , второй запрос занимает в 10 раз больше времени! Целую секунду.
Почему существует такое огромное расхождение между временем выполнения, когда результат так похож? Нигде около в 10 раз больше строк - это как 60 из первого запроса и 70 из второго. Не говоря уже о том, что 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