У меня есть 3 таблицы InnoDB 2 из которых являются "большой"TIMESTAMPDIFF оптимизации MIN MAX
- composer_sessions 92 строк
- сессий 2,530,587 строк
- отслеживания 8,032,697 на строки
Я бегу следующий запрос:
SELECT TIMESTAMPDIFF(SECOND,
MIN(tracking.timestamp),
MAX(tracking.timestamp)) AS `thetime`,
SUM(tracking.type = 'scene') AS `scenecount`
FROM `tracking`, `sessions`
WHERE tracking.tour_ID = '102098'
AND sessions.session_ID = tracking.session_ID
AND sessions.IP NOT IN(SELECT DISTINCT `IP`
FROM `composer_sessions`)
GROUP BY tracking.session_ID
HAVING TIMESTAMPDIFF(SECOND, MIN(tracking.timestamp),
MAX(tracking.timestamp)) <= '3600'
AND TIMESTAMPDIFF(SECOND, MIN(tracking.timestamp),
MAX(tracking.timestamp)) > '60'
AND SUM(tracking.type = 'scene') >= '2'
Все столбцы, используемые в запросе, индексируются. «Соединение» в запросе используется для отсечения данных, связанных с IP-адресами, которые нам не нужны в результатах.
Есть ли лучший способ для меня структурировать этот запрос и/или может ли кто-нибудь предложить сложные (многоколоночные) индексы, чтобы сделать этот запрос быстрее?
Попробуйте использовать 'thetime' в' п HAVING', вместо того чтобы повторять расчет. Хотя я не уверен, что это изменит ситуацию. – Barmar
Попробуйте заменить тест 'NOT IN' шаблоном' LEFT JOIN/NULL'. – Barmar
Возможно, вы захотите прочитать это, особенно раздел о вопросах эффективности запросов. http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056#271056 –