Я хочу сгруппировать по b.hash
однако это слишком дорого, чтобы сделать это. Есть ли способ получить этот запрос, но также с группой, но быстрее?
SELECT STRAIGHT_JOIN b.hash, b.page, n.favorite
FROM behaviour b, new_table n
WHERE b.timestamp >= NOW( ) - INTERVAL 20 SECOND
AND b.hash = n.hash
Это EXPLAIN
PROFILING
Я предполагаю, что вы хотите этот запрос
SELECT b.hash, b.page, n.favorite
FROM behaviour b
JOIN new_table n ON b.hash = n.hash
WHERE b.timestamp >= NOW( ) - INTERVAL 20 SECOND
AND b.hash = n.hash
ORDER BY b.hash
Я не понимаю ваше замечание о GROUP BY
в вашем вопросе. Похоже, вы хотите, чтобы самые последние треть минутной стоимости предметов.
Во всяком случае, если вы создаете составной индекс на вашем behaviour
таблица, содержащая следующие столбцы, ваш запрос, вероятно, начнет работать достаточно быстро.
(timestamp, hash, page)
Зачем? Планировщик запросов MySQL может произвольно получить доступ к индексу, чтобы начать с timestamp
значение в запросе. Это O (войти N) быстро. Затем он может последовательно сканировать индекс на предмет информации, необходимой для вашего запроса. Это почти мгновенно.
Возможно ли, что вы хотите этого?
SELECT b.hash, b.page, MAX(n.favorite)
FROM behaviour b
JOIN new_table n ON b.hash = n.hash
WHERE b.timestamp >= NOW( ) - INTERVAL 20 SECOND
AND b.hash = n.hash
GROUP BY b.hash, b.page
Или это?
SELECT b.hash, b.page, GROUP_CONCAT(n.favorite)
FROM ...
Пожалуйста предоставьте SHOW CREATE TABLE
для обеих таблиц. А пока что угадаю …
b
не имеет индекса, начинающегося с timestamp
, но это нужно такое.
Как обычно, профилирование является «бесполезным» — 99% указанного времени тратится в туманной «Отправке данных».