如何优化与group by和order by相关的查询

时间:2018-12-30 13:34:51

标签: mysql sql

SELECT *
FROM `table_name` 
WHERE `id` IN ( SELECT MAX(`id`) FROM `table_name` GROUP BY `name` )

我们如何优化此查询?

2 个答案:

答案 0 :(得分:2)

我建议将查询编写为:

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不会重写它。聚合可能可以使用索引。但是,使用=编写查询可以保证最佳的执行计划。

答案 1 :(得分:0)

我建议在(name, id)上添加索引。这将大大提高子查询的性能,允许MySQL快速在外部查询中查找每个id值。

CREATE INDEX idx ON table_name (name, id);

假设table_name有许多列,那么SELECT *可能会排除任何单个索引都可以加快外部查询速度的可能性。但是,至少我们可以尝试优化WHERE IN子句。