通过&优化组按查询排序

时间:2013-01-17 01:15:16

标签: mysql sql group-by sql-order-by greatest-n-per-group

这是产品表的结构 目前有超过100万条记录。 当我使用查询组时,我遇到了性能问题。订购。 enter image description here

enter image description here

查询:

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

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

3 个答案:

答案 0 :(得分: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是最新的。

答案 1 :(得分: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;

答案 2 :(得分: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的两个产品名称。