Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
希望优化MySQL执行时间,以解决我的数据库中的一个约束瓶颈_Mysql_Database_Database Design_Architecture - Fatal编程技术网

希望优化MySQL执行时间,以解决我的数据库中的一个约束瓶颈

希望优化MySQL执行时间,以解决我的数据库中的一个约束瓶颈,mysql,database,database-design,architecture,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 } 我在数据库中插入数

问题:我有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                 |
----------------------------------------------------------------
为了做到这一点,我有:(伪代码)

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

(对于中等MySQL AWS RDS实例)

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


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

对于性能,您需要
索引(观测员传感器id,收集的小时数)

要减少代码,您需要:

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);

为了提高性能,您需要
索引(传感器id、收集的小时数)

要减少代码,您需要:

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);

能否将CREATETABLE语句添加到问题中?索引将在这方面发挥作用。如果没有自动递增列,请共享表中的行数。该表应在上有一个复合索引(spotter\u sensor\u id,hour\u collected)。另外,您的(伪)代码应该插入您试图增加的金额。可以将CREATETABLE语句添加到问题中吗?索引将在这方面发挥作用。如果没有自动递增列,请共享表中的行数。该表应在上有一个复合索引(spotter\u sensor\u id,hour\u collected)。此外,您的(伪)代码应该插入您试图增加的数量。