如何更快地进行MySQL选择列表查询?

时间:2018-05-24 22:37:39

标签: mysql database sqlalchemy amazon-rds

我的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,缓存,存储过程等?

显而易见的解决方案是添加更多只读节点,但这似乎只会延迟最终请求被删除而无法解决瓶颈

0 个答案:

没有答案