0

这是产品表的结构。
目前拥有超过 100 万条记录。当我使用查询 group by 和 order by 时,我遇到了性能问题。 在此处输入图像描述

在此处输入图像描述

询问:

SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2

如何改进此查询以更快地执行?我索引了 store_id,ID 是主键。

4

3 回答 3

0

你想要这样的查询:

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 是最新的。

于 2013-01-17T01:46:13.740 回答
0
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;
于 2013-01-17T08:29:15.553 回答
0

一个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 获取两个产品名称。

于 2013-01-17T09:22:23.443 回答