【问题标题】:How to make faster group by in mysql very big table?如何在 mysql 非常大的表中进行更快的分组?
【发布时间】:2014-12-24 10:42:35
【问题描述】:

我在 MySQL 中有这样的表:

troll_id     troll_family_id    troll_name    troll_birth_timestamp
--------------------------------------------------------------------
1            1                  Kamil         100000
2            1                  Bartek        200000
3            2                  Maciek        100000
4            2                  Andrzej       200000

troll_family_id    troll_family_name
------------------------------------------
1                  Trollowski
2                  Trollowicz

我想得到only one the youngest Troll from every famillies

所以我想得到这样的行:

troll.troll_name
-----------------    
Bartek
Andrzej

我在数据库中有几百万个巨魔,我尝试过这样的查询:

SELECT troll.troll_name 
FROM troll 
GROUP BY troll.troll_family_id 
ORDER BY troll.troll_birth_timestamp DESC
LIMIT 0, 50

但它冻结了我对 http 的响应。所以我什至不知道,这个查询是否正确。

【问题讨论】:

  • 你的表是否使用索引?
  • 如果没有索引,请尝试将索引添加到您的表中
  • 是的,在 troll_id 和 troll_family_id 和 troll_birth_timestamp 中
  • troll_id 是一个 PK,所以它已经被索引了。 troll_name 是最重要的。因为在选择所有匹配的巨魔引擎后,可以创建一个内存表并使用它来执行进一步的处理。
  • 不要做所有行,而是选择:WHERE troll_birth_timestamp < '???'

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


【解决方案1】:

试试这个:

SELECT a.troll_name 
FROM troll a 
INNER JOIN (SELECT troll_family_id, MAX(troll_birth_timestamp) AS troll_birth_timestamp 
            FROM troll 
            GROUP BY troll_family_id
           ) AS b on a.troll_family_id = b.troll_family_id AND a.troll_birth_timestamp = b.troll_birth_timestamp
LIMIT 0, 50

【讨论】:

  • 请注意,没有 ORDER BY 的 LIMIT(相当)没有意义
【解决方案2】:

对现有查询稍作更改。 ORDER BY 在 GROUP BY 之后起作用:

SELECT troll_family_name, t.troll_name 
FROM
(
  SELECT troll_family_name, t.troll_name 
  FROM troll t
  JOIN troll_family tf ON tf.troll_family_id=t.troll_family_id
  ORDER BY t.troll_birth_timestamp DESC      
)temp
GROUP BY troll_family_name
LIMIT 0, 50

为 tf.troll_family_id、t.troll_family_id 添加索引

【讨论】:

    【解决方案3】:

    您可以在群组中使用MAX 功能

    SELECT troll.troll_name, MAX(troll_birth_timestamp) AS troll_birth_timestamp
    FROM troll 
    GROUP BY troll.troll_family_id 
    LIMIT 0, 50
    

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多