LIMIT
применяется после GROUP BY
.
Будет ли создаваться временная таблица, зависит от того, как построены ваши индексы.
Если у вас есть индекс в поле группировки и вы не упорядочиваете по совокупным результатам, тогда применяется INDEX SCAN FOR GROUP BY
, и каждый агрегат подсчитывается на лету.
Это означает, что если вы не выберете агрегат из-за LIMIT
, он никогда не будет рассчитан.
Но если вы упорядочиваете по совокупности, то, конечно, все они должны быть рассчитаны, прежде чем их можно будет отсортировать.
Вот почему они сначала рассчитываются, а затем применяется filesort
.
Обновление:
Что касается вашего запроса, посмотрите, что EXPLAIN EXTENDED
говорит об этом.
Скорее всего, question_id
- это PRIMARY KEY
для вашей таблицы, и, скорее всего, он будет использоваться при сканировании.
Это означает, что filesort
не будет применяться, и само соединение никогда не произойдет после строки 15'th
.
Чтобы убедиться, перепишите ваш запрос следующим образом:
SELECT question_id,
question_body,
(
SELECT GROUP_CONCAT(tag_id, ' ')
FROM tag_question t
WHERE t.question_id = q.question_id
)
FROM questions q
ORDER BY
question_id
LIMIT 15
- Во-первых, это более читабельно,
- Во-вторых, это более эффективно, а
- В-третьих, он будет возвращать даже непомеченные вопросы (чего нет у вашего текущего запроса).