【问题标题】:Looking to Optimize MySQL execution time to solve a constraining bottleneck in my Database希望优化 MySQL 执行时间以解决我的数据库中的约束瓶颈
【发布时间】:2017-10-10 08:02:27
【问题描述】:

问题:我有 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 中执行上述语句的现有小时时,我得到:

(对于中型 MySQL AWS RDS 实例)

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

我是否必须更改业务逻辑,因为不可能在 5 分钟内全部处理完这些传感器,还是有更好的方法?

【问题讨论】:

  • 请问可以将create table语句添加到问题中吗?索引将在其中发挥作用。如果它没有 autoincrementng 列,请分享您在表中有多少行。
  • 表应该有一个复合索引 (spotter_sensor_id, hour_collected)。此外,您的(伪)代码应该插入您尝试增加的数量。

标签: mysql database database-design architecture


【解决方案1】:

为了性能,你需要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);

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多