期待优化MySQL执行时间以解决数据库中的约束瓶颈问题

时间:2017-10-05 20:14:53

标签: mysql database database-design architecture

问题:我有1000个设备,每5分钟需要向命令服务器发送一个json post请求。命令服务器具有一个请求队列,并使用worker来解析json文件并使用该信息查询数据库。我有一个存在于数据库级别的瓶颈,这使得这一点具有挑战性。

为了举例,假设这是从特定传感器收集的信息:

data: {
       'time': '2017-10-05 17:25:00',
       'squirrels spotted': 1,
       'spotter_sensor': 992
}

我在数据库中插入数据的表如下所示。我将5分钟的计数汇总到他们最近收集的小时。所以最新一小时显示了5分钟前的最新数据。

|--------------------------------------------------------------
| spotter_sensor_id | hour_collected       | squirrels spotted |
|--------------------------------------------------------------
|    992            | 2017-10-05 17:00:00  | 5                 |
----------------------------------------------------------------

为了做到这一点,我有:(伪代码)

UPDATE table SET squirrels_spotted = squirrels_spotted + '$squirrels spotted' 
      where spotter_sensor_id = '992'
        and hour_collected = '$hour_collected'
IF (ROWS_AFFECTED == 0)
 INSERT INTO table VALUES(992, '$new_hour', 0)

在分析数据库的执行时间以执行SQL中现有小时的上述语句时,我得到了:

enter image description here

  

(对于中型MySQL AWS RDS实例)

问题是2秒,简单的更新太长了。这只允许我在5分钟内处理150个传感器。我不明白为什么执行一个查询需要这么长时间。

我是否必须更改业务逻辑,因为在5分钟内无法处理这些传感器或者有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

为了提高性能,您需要INDEX(spotter_sensor_id, hour_collected)

对于更少的代码,您需要IODKU:

INSERT INTO table
        (spotter_sensor_id, hour_collected, squirrels_spotted)
    VALUES
        ('992', '$hour_collected, $squirrels_spotted)
    ON DUPLICATE KEY UPDATE
        squirrels_spotted = squirrels_spotted + VALUES(squirrels_spotted);