Альтернативный способ «группировать по» избежать низкой скорости работы?

Я хочу сгруппировать по 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

введите описание изображения здесь

1

Решение

Я предполагаю, что вы хотите этот запрос

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 ...
0

Другие решения

Пожалуйста предоставьте SHOW CREATE TABLE для обеих таблиц. А пока что угадаю …

b не имеет индекса, начинающегося с timestamp, но это нужно такое.

Как обычно, профилирование является «бесполезным» — 99% указанного времени тратится в туманной «Отправке данных».

0

По вопросам рекламы [email protected]