希望优化MySQL执行时间,以解决我的数据库中的一个约束瓶颈
问题:我有1000台设备,每5分钟需要向命令服务器发送json post请求。命令服务器有一个请求队列,并使用worker解析json文件并使用信息查询数据库。我在数据库级别上存在一个瓶颈,这使得这项工作具有挑战性 为了举例说明,假设这是从特定传感器收集的信息:希望优化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 } 我在数据库中插入数
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)。此外,您的(伪)代码应该插入您试图增加的数量。