快速查找大型MySQL值(使用现有索引)的组中的最小值

时间:2014-11-16 17:03:07

标签: mysql join database-performance

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

结构就像这样

  • " C组" VarChar 10
  • "项目"整数
  • " LogDT"日期时间
  • 许多其他领域。

" GROUPC" /" LogDT"并且不到10组。

当我申请单个GROUPC /项目最低要求时,我会在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组。

获取组列表只需15ms

select distinct GROUPC from TABLE 

我有什么想法可以将这两个请求快速地结合起来?

1 个答案:

答案 0 :(得分:1)

您有GROUPLogDT列的索引,这很好,所以我相信这个查询会非常快:

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

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

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列添加索引。