有一张表用来存温度信息用于页面展示折线图用
结构如下
CREATE TABLE `temp` (
`id` varchar(40) NOT NULL,
`duuid` varchar(40) DEFAULT NULL,
`temp` int(11) DEFAULT NULL,
`recordTime` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `duuid` (`duuid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
duuid是设备的uuid,
temp是温度值
recordTime是记录时间
该数据是每隔30min通过事件和存储过程将设备实时状态表的温度信息扫描到该表里
设备最大有65025,也就是每到30min就会插入65025条数据
数据保存时间为30天
也就是数据库里的数据量最大有93636000条
查询语句如下:
SELECT duuid, temp, recordTime from temp WHERE duuid = 'xxx' AND recordTime BETWEEN '2018-11-01 00:00:00' AND '2018-12-01 00:00:00' ORDER BY recordTime;
直接查询30天的数据,1440条
使用innodb引擎的情况下
就我的开发机子查询时间在23s左右
加联合索引(duuid,recordTime)后查询时间在15s左右
MyISAM引擎在3s左右
但是就目前我这个需求,用MyISAM可不可行?
或者,在不分表的情况下有没有更加优化的方案?
还有删除的效率实在是太低了
DELETE from temp WHERE recordTime < 'xxx'
执行下来要111分钟,量大概在312w,每天执行一次
将索引改成(duuid,recordTime)
或者直接(duuid,recordTime,temp),回表都省了