小编Loc*_*eyu的帖子

优化 MySQL SELECT 语句中 TIMESTAMP 字段的 WHERE 条件

我正在研究跟踪使用时间的分析系统的架构,并且需要查看特定日期范围内的总使用时间。

举一个简单的例子,这种类型的查询会经常运行:

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)

mysql myisam performance index select

8
推荐指数
1
解决办法
3万
查看次数

标签 统计

index ×1

myisam ×1

mysql ×1

performance ×1

select ×1