我正在研究跟踪使用时间的分析系统的架构,并且需要查看特定日期范围内的总使用时间。
举一个简单的例子,这种类型的查询会经常运行:
select sum(diff_ms) from writetest_table where time_on > ("2015-07-13 15:11:56");
Run Code Online (Sandbox Code Playgroud)
此查询通常需要大约 7 秒的时间在一个人口密集的表上。它有大约 3500 万行,MyISAM on MySQL 在 Amazon RDS (db.m3.xlarge) 上运行。
去掉 WHERE 子句使查询只需要 4 秒,添加第二个子句 (time_off > XXX) 增加了 1.5 秒,使查询时间达到 8.5 秒。
因为我知道这些类型的查询会很常见,所以我想优化一些东西,使它们更快,理想情况下低于 5 秒。
我首先在 time_on 上添加一个索引,虽然这大大加快了 WHERE "=" 查询,但它对 ">" 查询没有影响。有没有办法创建一个可以加速 WHERE ">" 或 "<" 查询的索引?
或者如果对此类查询的性能有任何其他建议,请告诉我。
注意:我使用“diff_ms”字段作为非规范化步骤(它等于 time_off - time_on),它将聚合性能提高了大约 30%-40%。
我正在使用以下命令创建索引:
ALTER TABLE writetest_table ADD INDEX time_on (time_on) USING BTREE;
Run Code Online (Sandbox Code Playgroud)
在原始查询上运行“explain”(使用“time_on >”)表示 time_on 是一个“possible_key”,而 select_type 是“SIMPLE”。“额外”列显示“使用位置”,“类型”为“全部”。添加索引后,该表显示“time_on”是“MUL”键类型,这似乎是正确的,因为同一时间可以出现两次。
这是表架构:
CREATE TABLE `writetest_table` (
`id` …Run Code Online (Sandbox Code Playgroud)