【问题标题】:Find minimum in groups in a large MySQL value (using existing index) fast快速查找大 MySQL 值(使用现有索引)中的最小组
【发布时间】:2014-11-16 17:03:07
【问题描述】:

我有一张包含几百万条数据条目的表格。 我正在尝试快速找到单个项目的每个组的最小值和最大值。

结构是这样的

  • “GROUPC”VarChar 10
  • “项目”整数
  • “LogDT”日期时间
  • 许多其他领域。

在“GROUPC”/“LogDT”上有一个索引,并且少于 10 个组。

当我请求一个 GROUPC/Item 最小值时,我会在 100 毫秒内得到快速响应

示例:第 59 项

 select GROUPC, min(LogDT) from TABLE as T where T.Item=59 and t.GROUPC='GR1'

我需要所有组的最低要求。

select GROUPC, min(LogDT) from TABLE as T where T.Item=59 group by t.GROUPC

这可行,但需要 12 秒,尽管目前只有 3 个组。

获取组列表仅需 15 毫秒

select distinct GROUPC from TABLE 

有什么想法可以将这两个请求组合成快速的东西吗?

【问题讨论】:

  • 注明。我在代码中使用“GROUP”代替了该字段的真实名称,以使我的问题更容易理解。将更新问题

标签: mysql join database-performance


【解决方案1】:

您在GROUPLogDT 列上有一个索引,这很好,所以我相信这个查询会很快:

SELECT GROUP, MIN(LOGDT) FROM TABLE AS t GROUP BY t.GROUP

但由于您按 Item=59 进行过滤,并且您在 Item 列上没有索引,因此您的查询会很慢:

SELECT GROUP, MIN(LogDT) FROM TABLE as T WHERE T.Item=59 GROUP BY t.GROUP

我怀疑您的第一个查询很快,因为组 GR1 包含的项目少于其他组:

SELECT GROUP, MIN(LogDT) FROM TABLE as T WHERE T.Item=59 AND t.GROUP='GR1'

但如果您尝试按其他组(例如 GR2、GR3、...)进行过滤,您可能会获得较慢的性能。

你可以试试这段代码,但我不认为它会有所改进:

SELECT GROUP, MIN(LogDT) FROM TABLE as T
WHERE T.Item=59 AND t.GROUP IN (SELECT DISTINCT GROUP FROM TABLE)
GROUP BY t.GROUP

提高性能的唯一方法是在Item 列上添加索引。

【讨论】:

  • 感谢您的建议。我可能不得不使用额外的索引。
  • 毕竟还是使用了额外索引的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2018-10-07
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多