【问题标题】:Optimize Group by & Order by query优化 Group by & Order by 查询
【发布时间】:2012-12-31 11:57:04
【问题描述】:

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

查询:

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

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

【问题讨论】:

  • 表上有哪些索引?
  • id - PRIMARY(索引名称),store_id - store_id(索引名称)
  • 你能解释一下这个查询想要做什么吗? “以 id 的倒序从商店中选择两个任意产品名称”似乎不是特别有用。
  • 好的。我想按最新列出的日期检索产品,并且每个商店只有 1 条记录(store_id)

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


【解决方案1】:

你想要这样的查询:

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

【讨论】:

  • 你不需要在子查询中输出store_id,你应该加入你的maxid
  • @newtover 。 . .感谢您在加入时发现问题。此查询基于评论。原始查询对我来说没有多大意义。
【解决方案2】:
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;

【讨论】:

  • 加入max_id 就足够了,因为id 是主键。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 2011-05-13
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多