mysql引擎如何选择

有一张表用来存温度信息用于页面展示折线图用
结构如下

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,每天执行一次

阅读 2.1k
2 个回答

将索引改成(duuid,recordTime)
或者直接(duuid,recordTime,temp),回表都省了

innodb: 辅助索引换成(duuid, recordTime, temp).
使用覆盖索引技巧. 这样可以提高查询速度, 因为:
1 辅助索引中会存放duuid, recordTime, temp这些查询需要的列, 不需要到主键索引中再查一次;
2 相对于直接建立主键(duuid, recordTime, temp), 使用辅助索引, 需要处理的数据小, 所以io次数会降低, 所以速度会快.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题