我的Web服务器使用SQL Alchemy ORM执行以下MySQL查询
(db_session.query(self.orm_model.time,
self.orm_model.temperature,
self.orm_model.fan_speed)
.filter(self.orm_model.cook_session_id == model.cook_session_id))
我的温度数据表如下
CREATE TABLE `smoker_temp` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cook_session_id` varchar(255) NOT NULL,
`time` bigint(20) unsigned NOT NULL,
`temperature` int(11) NOT NULL,
`status_code` varchar(45) DEFAULT 'AA',
`fan_speed` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `cook_session_id` (`cook_session_id`),
KEY `time` (`time`)
) ENGINE=InnoDB AUTO_INCREMENT=4215274 DEFAULT CHARSET=latin1;
当我在我的网络服务器上运行负载测试时,此查询似乎需要运行时间最长(即它似乎是瓶颈)。温度数据每秒都来自许多用户,因此选择查询返回的列表越来越长。此外,写操作在不同的节点上执行。上述选择查询的执行频率低于插入。请求建立起来,CPU使用率不断增加(HTTP和数据库),并最终丢弃一些HTTP请求。
我在AWS RDS上设置了数据库,并且我在与写节点分开的只读节点上执行选择查询。根据我的理解,AWS RDS会定期将新数据复制到只读节点,执行这些选择查询。
有没有办法减少此查询的执行时间,不仅仅是在SQL方面,还欢迎使用其他解决方案,如更改数据库引擎,使用mysql以外的数据库,添加/更改索引,更改AWS基础结构,使用除SQLAlchemy以外的ORM,缓存,存储过程等?
显而易见的解决方案是添加更多只读节点,但这似乎只会延迟最终请求被删除而无法解决瓶颈