【发布时间】:2011-05-29 05:33:26
【问题描述】:
我有以下疑问:
SELECT location, step, COUNT(*), AVG(foo), YEAR(start), MONTH(start), DAY(start)
FROM table WHERE jobid = 'xxx' AND start BETWEEEN '2010-01-01' AND '2010-01-08'
GROUP BY location, step, YEAR(start), MONTH(start), DAY(start)
最初我在各个列上都有索引,例如 jobid 和 start,但很快意识到 MySQL 在 select 中只支持每个表的一个索引。因此,它将使用 jobid 索引,然后进行相当大的扫描以按 start 范围过滤掉。
在 (jobid, start) 上添加索引有很大帮助,但 GROUP BY 仍然会导致性能问题。我已阅读docs on GROUP BY optimizations 并了解为了从这些优化中受益,我需要一个包含 (location, step, start),但我还有两个悬而未决的问题:
group by 优化是否可以使用时间函数(YEAR、MONTH、DAY 等)?还是我必须将这些值存储为单独的列?我喜欢执行这些功能的原因是,这意味着我可以在每个连接的基础上控制时区,并返回为最终用户时区量身定制的结果。如果我必须预先存储年、月和日,我会通过 UTC 来完成,然后我的所有用户都只会收到 UTC 格式的报告。
即使我可以解决问题 #1,我还能做到吗?索引 (jobid, start) 有助于 WHERE 子句,但 GROUP BY 需要优化不同的索引 (location, step, start) 或者,取决于对#1 的回答,(location, step, year、月、日)。但问题是这两个索引不共享一个共同的左侧列集,所以我不相信我的 WHERE 和 GROUP by 可以兼容以便使用相同的索引。所以我的问题是:我只是在这里冲洗吗?
关于如何实现这一点的任何其他想法都会有所帮助。而且,只是为了抢占一些可能出现的问题/cmets:
- 是的,这是一个时间序列数据集。
- 是的,它会从 RRDtool 之类的东西中受益,但这样做会导致我失去执行特定时区的结果。
- 是的,预先计算汇总可能是个好主意,但我不需要 令人敬畏的 性能,因此如果它允许,我对 良好 性能感到满意我为每个用户的时区自定义结果。
如上所述,如果有人对如何执行汇总或循环数据库之类的操作有任何设计建议,但仍能获得特定时区的结果,我会全力以赴!
更新:根据要求,这里有更多信息:
显示输出中的索引:
步骤 0 PRIMARY 1 step_id A 16 NULL NULL BTREE 步骤 1 开始 1 开始 A 16 NULL NULL BTREE 步骤 1 步骤 1 步骤 A 2 NULL NULL BTREE 步骤 1 foo 1 foo A 16 NULL NULL YES BTREE 步骤 1 位置 1 位置 A 2 NULL NULL YES BTREE 步骤 1 jobid 1 jobid A 2 NULL NULL YES BTREE显示创建表输出:
创建表`步骤`( `start` 时间戳 NOT NULL DEFAULT '0000-00-00 00:00:00', `step` smallint(2) unsigned NOT NULL, `step_id` int(8) unsigned NOT NULL AUTO_INCREMENT, `location` varchar(12) 默认为空, `jobid` varchar(37) 默认为空, 主键(`step_id`), KEY `start_time` (`start`), KEY `step` (`step`), KEY `location` (`location`), KEY `job_id`(`jobid`) ) 引擎=InnoDB AUTO_INCREMENT=240 默认字符集=utf8【问题讨论】:
-
您能否发布以下信息:显示
中的索引并显示创建表 - thx -
@Scrum - 结果集并不大,但它正在增长。我们有许多数据库(每个客户一个),根据客户的使用情况,记录从 10K 到 ~10M 不等。
-
分组后返回多少行?位置、步骤有多少种不同的组合?
-
@Scrum - 有固定数量的 7 个位置,通常不超过 10-15 个唯一步骤值。一个典型的查询是尝试返回 7 天内每天的唯一位置 + 步骤结果。所以这将是 7 天 x 7 个位置 x 10 步 = 分组后返回 490 行。
标签: mysql database-design optimization query-optimization