Избегайте создания временной таблицы, когда в запросе используются как группировка, так и сортировка - PullRequest
0 голосов
/ 17 декабря 2010

Есть ли способ избежать создания временной таблицы в таком запросе?

SELECT item_id FROM titem
GROUP BY item_id
ORDER BY item_created;

Я пытался создать индексы (item_id, item_created) и (item_created, item_id), но это не помогло.

1 Ответ

3 голосов
/ 17 декабря 2010

У вас проблема с вашим запросом.Когда выполняется группировка по, какой item_created выбран для каждой группы?MySQL по умолчанию выберет один для каждой группы более или менее случайным образом (из группы).Поскольку для каждой группы используется только один элемент item_created, для ее сортировки требуется временная таблица.

Я бы посоветовал вам использовать одну из функций агрегирования, например min () или max (), чтобы получить определенное значение item_createdсортировать по.Это все еще не решит проблему с временными таблицами, индекс item_id - это лучшее, что вы можете сделать.

SELECT item_id, max(item_created) as ic FROM titem
GROUP BY item_id
ORDER BY ic;

Интересно отметить, что некоторые базы данных, например Oracle (как мне сказали), будут выбрасыватьи ошибка в исходном запросе, так как item_created отсутствует ни в выбранных полях статистической функции, ни в предложении group by.MySQL может быть настроен для имитации этого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...