【问题标题】:Fast MAX, GROUP BY on the concatenation of mulliple columns快速 MAX, GROUP BY 对多列的串联
【发布时间】:2011-06-30 22:01:03
【问题描述】:

我有一个包含 4 列的表:名称、日期、版本和值。所有四个都有一个综合索引,按此顺序。它有 2000 万行:2.000 个名称,每个名称大约 1.000 个日期,每个日期大约 10 个版本。

我正在尝试获取一个列表,为所有名称提供最高日期、该日期的最高版本以及相关值。

当我这样做时

  SELECT name,
         MAX(date) 
    FROM table 
GROUP BY name

我得到了很好的性能并且数据库使用了复合索引

但是,当我将表加入此表以获取每个名称的 MAX(version) 时,查询需要很长时间。必须有一种方法可以在与上面的 SELECT 语句大致相同的时间内获得结果吗?我可以通过使用索引轻松完成。

【问题讨论】:

  • 你能不能给我们看看也这么慢的 JOIN 查询?
  • “M”表示百万?一些北美人不会意识到在其他国家/地区格式中,句点代替了逗号。

标签: mysql sql group-by aggregate-functions


【解决方案1】:

试试这个:(我知道它需要对 MySQL 进行一些语法调整......问他们,我会找到他们)

INSERT INTO #TempTable
SELECT name, MAX(Date) as Date
FROM table
Group By name

select table.name, table.date, max(table.version) as version
from table
inner join #TempTable on table.name = #temptable.name and table.date = #temptable.date
group by table.name, table.date

【讨论】:

  • 谢谢,我调整并尝试了它。临时表的填充需要 0.06 秒,第二次查询需要 20 秒。这与我使用子查询而不是临时表获得的性能基本相同。
  • 更新:原来它使用了错误的(测试)索引。删除索引使其使用正确的复合索引,并将查询时间从 20 秒缩短到 0.04 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2010-11-20
  • 2012-10-30
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多