SELECT *
FROM `table_name`
WHERE `id` IN ( SELECT MAX(`id`) FROM `table_name` GROUP BY `name` )
我们如何优化此查询?
答案 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
子句。