这是产品表的结构。
目前拥有超过 100 万条记录。当我使用查询 group by 和 order by 时,我遇到了性能问题。
询问:
SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2
如何改进此查询以更快地执行?我索引了 store_id,ID 是主键。
这是产品表的结构。
目前拥有超过 100 万条记录。当我使用查询 group by 和 order by 时,我遇到了性能问题。
询问:
SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2
如何改进此查询以更快地执行?我索引了 store_id,ID 是主键。
你想要这样的查询:
select p.*
from product p join
(select store_id, max(id) as maxid
from product p
group by store_id
) psum
on psum.store_id = p.store_id and p.id = maxid
您在任何表格中都没有日期,所以我假设最大的 id 是最新的。
SELECT x.*
FROM my_table x
JOIN (SELECT store_id, MAX(id) max_id FROM my_table GROUP BY store_id) y
ON y.store_id = x.store_id
AND y.max_id = x.id
ORDER
BY store_id DESC LIMIT 2;
一个hacky(但快速)的解决方案:
SELECT product_name
FROM (
SELECT id
FROM vs_product
GROUP BY store_id DESC
LIMIT 2) as ids
JOIN vs_product USING (id);
它是如何工作的:
您在 store_id 上的索引按升序存储 (store_id, id) 对。GROUP BY DESC
将使 MySQL 以相反的顺序读取索引,即子查询将获取每个 store_id 的最大 id。然后,您只需将它们加入到整个表中以获取产品名称。
请注意,查询将为具有最大值的商店 ID 获取两个产品名称。