目前开发QT时,碰到公司一个产品,使用Linux上的MySQL数据库。其中有一个电压数据表,包含1个主键id、1个time字段UTC时间、512个电压字段,每秒钟增加一条记录,最大100万行,1.5个G。需要按time字段(无索引)导出某天的记录。这个表真的吐血了,随便查查都要1分钟以上,
SELECT * FROM `ems_data_1`.`bms1_rack1_vol` WHERE (time >= 1700784272) AND (time <= 1700784281);
/* 受影响记录行数: 0 已找到记录行: 10 警告: 0 持续时间 1 查询: 00:01:06.1 */
我目前的做法是,用MySQL的WHERE查询一天(也就是QT的setFilter),存到QSqlTableModel,然后再转成CSV,需要至少8分钟。还有其他解决方案吗?
CREATE TABLE `bms1_rack1_vol` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`time` INT(10) UNSIGNED NOT NULL,
`v1` INT(10) NULL DEFAULT NULL,
`v2` INT(10) NULL DEFAULT NULL,
`v3` INT(10) NULL DEFAULT NULL,
`v4` INT(10) NULL DEFAULT NULL,
`v5` INT(10) NULL DEFAULT NULL,
`v6` INT(10) NULL DEFAULT NULL,
`v7` INT(10) NULL DEFAULT NULL,
`v8` INT(10) NULL DEFAULT NULL,
`v9` INT(10) NULL DEFAULT NULL,
`v10` INT(10) NULL DEFAULT NULL,
/*字数限制,这里还有490行省略了。数据库不是我做的,量产产品也基本不能改。*/
`v500` INT(10) NULL DEFAULT NULL,
`v501` INT(10) NULL DEFAULT NULL,
`v502` INT(10) NULL DEFAULT NULL,
`v503` INT(10) NULL DEFAULT NULL,
`v504` INT(10) NULL DEFAULT NULL,
`v505` INT(10) NULL DEFAULT NULL,
`v506` INT(10) NULL DEFAULT NULL,
`v507` INT(10) NULL DEFAULT NULL,
`v508` INT(10) NULL DEFAULT NULL,
`v509` INT(10) NULL DEFAULT NULL,
`v510` INT(10) NULL DEFAULT NULL,
`v511` INT(10) NULL DEFAULT NULL,
`v512` INT(10) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=348331
;