как оптимизировать запрос, относящийся к группе по и по порядку - PullRequest
0 голосов
/ 30 декабря 2018
SELECT *
FROM `table_name` 
WHERE `id` IN ( SELECT MAX(`id`) FROM `table_name` GROUP BY `name` )

Как мы можем оптимизировать этот запрос?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Я бы предложил написать запрос следующим образом:

select t.*
from table_name t
where t.id = (select max(t2.id) from table_name t2 where t2.name = t.name);

Тогда вам нужен индекс для table_name(name, id):

create index idx_table_name_name_id on table_name(name, id);

Ваша версия запроса потребует агрегирования дляподзапрос - я не думаю, что MySQL перепишет его.Агрегация, вероятно, может использовать индекс.Однако написание запроса с использованием = гарантирует оптимальный план выполнения.

0 голосов
/ 30 декабря 2018

Рекомендую добавить индекс на (name, id).Это должно значительно повысить производительность подзапроса, позволяя MySQL быстро искать каждое значение id во внешнем запросе.

CREATE INDEX idx ON table_name (name, id);

Если предположить, что table_name имеет много столбцов, то SELECT *, вероятно, исключит вероятностьчто любой отдельный индекс может ускорить внешний запрос.Но, по крайней мере, мы можем попытаться оптимизировать предложение WHERE IN.

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