Sidenotes:
1.У вас есть
LEFT JOIN listings
ON traffic.traffic_listingid = listings.listing_id
...
WHERE ...
AND listing_id IS NOT NULL
Это условие отменяет LEFT JOIN
. Измените ваш запрос на:
INNER JOIN listings
ON traffic.traffic_listingid = listings.listing_id
и удалите listing_id IS NOT NULL
из условий WHERE
.
То же самое относится к LEFT JOIN user
и username IS NOT NULL
.
2. Проверка на traffic_timestamp
:
DATEDIFF(NOW(), traffic_timestamp) < 24
затрудняет использование индекса. Измените его на что-то вроде этого, которое может использовать индекс
(и проверьте , что моя версия эквивалентна, у меня могут быть ошибки):
traffic_timestamp >= CURRENT_DATE() - INTERVAL 23 DAY
3. COUNT(non-nullable-column)
эквивалентно COUNT(*)
. Измените:
COUNT(traffic_listingid) AS genuine_hits,
до:
COUNT(*) AS genuine_hits,
потому что это немного быстрее в MySQL (хотя я не уверен в этом для версии 4.3)
Для вопроса об индексе у вас должен быть хотя бы индекс для каждого столбца, который используется для объединения. Добавление еще одного для traffic_timestamp
, вероятно, тоже поможет.
Если вы сообщите нам, в каких таблицах traffic_ipaddress
и traffic_timestamp
, и что показывает EXPLAIN EXTENDED
, у кого-то может быть идея получше.
Повторно читая запрос, кажется, что на самом деле он GROUP BY
только в таблице traffic
, а две другие таблицы используются для получения справочных данных. Таким образом, запрос эквивалентен (группа трафика по) -join-list-join-user. Не уверен, поможет ли это в вашей старой версии MySQL, но может быть полезно иметь обе версии запроса и проверить, выполняется ли один запрос быстрее в вашей системе.