Получить все или GROUP BY в MySQL? - PullRequest
0 голосов
/ 25 января 2012

Прежде всего, вот запрос, о котором я буду говорить:

SELECT route_id, direction_id
FROM stop_times
LEFT JOIN trips USING (trip_id)
WHERE stop_id= 1002
GROUP BY CONCAT(route_id, direction_id)

Пример ожидаемых результатов:

route_id    |   direction_id
-----------------------------
106         |   0
106         |   1
13          |   0
13          |   1
21          |   0
4           |   0
4           |   1
6           |   0

Таким образом, выполнение этого запроса займет в среднем 0,088 секунды. Это нормально ... Но если я удалю GROUP BY, это займет 0,0026 секунды.

Теперь мой вопрос:

Будет ли лучше сделать GROUP BY и обработать все в MySQL или извлечь все и обработать это в массиве в PHP?

Спасибо

Ответы [ 5 ]

2 голосов
/ 25 января 2012

Вы можете заменить это:

GROUP BY CONCAT(route_id, direction_id)

на это:

GROUP BY route_id, direction_id

Вы получите те же результаты за гораздо меньшее время.

2 голосов
/ 25 января 2012

Такие вещи, как GROUP BY, предназначены для баз данных. Разница менее чем в сотую долю секунды не должна беспокоить. Не нужно начинать оптимизацию, пока у вас не возникнут реальные проблемы с производительностью.

0 голосов
/ 25 января 2012

Попробуйте:

SELECT concat_route_direction
FROM
(SELECT CONCAT(route_id, direction_id) AS concat_route_direction
FROM stop_times
LEFT JOIN trips USING (trip_id)
WHERE stop_id= 1002) AS concat_route_direction
GROUP_BY concat_route_direction

Я не проверял, дайте мне знать, если он не работает, какая у вас ошибка

0 голосов
/ 25 января 2012

Вы должны добавить индекс к столбцу stop_times.stop_id.

Вам также следует рассмотреть возможность избавления от CONCAT в предложении GROUP BY. Я предполагаю, что вы делаете это по ошибке.

Мне также интересно узнать об использовании GROUP BY здесь. Если вы используете его для удаления дубликатов, то вы должны использовать DISTINCT. Если вы используете его для упорядочивания результатов, используйте ORDER BY.

Если у вас все еще есть проблемы, укажите, пожалуйста, результат EXPLAIN.

0 голосов
/ 25 января 2012

Поскольку запрос быстрый без GROUP BY и медленный при его добавлении, мне кажется, что индексы не используются для группировки.На самом деле, похоже, что нет индекса, охватывающего route_id, direction_id в trips.Единственный индекс в trips начинается с trip_id и не может использоваться для этого GROUP BY.

. Я бы предложил добавить индекс на route_id, direction_id в trips.Обратите внимание, что столбцы должны быть в том же порядке, который используется в операторе GROUP BY.

...