Банальность, есть пара таблиц - группы и привязанные к ним элементы, примерно 2.5К групп, 3.3М элементов. Часть групп пустая.
--- группа ---
gr_id int
name varchar(64) utf8_general_ci
--- элемент ---
el_id int
group_id int
code varchar
Нужно получить все группы с количеством элементов в них.
SELECT groups.*, count(el_id) as cnt FROM groups left join elements using (gr_id) GROUP BY gr_id
Нормально, выполняется за 150 мс
SELECT groups.*, count(el_id) as cnt FROM groups left join elements using (gr_id) GROUP BY gr_id ORDER BY name
Выполняется за 50 _секунд_
Медленее в 300 с хреном раз.
SELECT * FROM
(
SELECT groups.*, count(el_id) as cnt FROM groups left join elements using (gr_id) GROUP BY gr_id
) as q
ORDER BY name
Выполняется за те же 50 секунд
$%^, ПОЧЕМУ?! Моя фантазия пасует.
Сортировка должна выполняться на полностью сформированной выборке.
Сортировка 2к5 строк не занимает минуту. Ни при каких раскладах.
UPD
Таки что скажет купечество? Ни у кого нет соображений?