MySQL大表数据查询效率如何提高?

小灰狼 小灰狼 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
一个 mysql 5.6,运行在 CentOS 7 上,一共有3.3亿左右条记录,按CreatedDateTime字段进行分区,从2014年1月1日起到2015年1月1日,每10天左右一个分区,在CreatedDateTime上有索引,另外在 UserId, DeviceId 上也创建了索引。整个表中,有2861个DeviceId,均匀分布在在3.3亿条记录中。其中的CreatedDateTime的分布也比较均匀。简单地说,就是表中一共记录了2861个Device,在一年中的运行历史数据,采样周期相对比较稳定,维持在270秒左右。

在进行查询时,花费的时间是相当长,无法满足要求。如要查询一个Device在某一天的运行历史数据(用于生成运行历史曲线图):

select
*
from
tbAnalog_20140919175031_A
where
deviceid = 5355
and CreatedDateTime >= '2014-01-08 00:00:00' and CreatedDateTime <= '2014-01-09 00:00:00'


最快时需要4.5秒,最慢时,要好几分钟。

请教大家有什么办法优化,系统参数配置、表结构修改,以及其它,谢谢!

表结构如下

CREATE TABLE `tbAnalog_20140919175031_A` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`CreatedDateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UserId` int(11) NOT NULL,
`DeviceId` int(11) NOT NULL,
`Col_000` smallint(6) DEFAULT NULL,
`Col_001` smallint(6) DEFAULT NULL,
`Col_002` smallint(6) DEFAULT NULL,
`Col_003` float(9,1) DEFAULT NULL,
`Col_004` float(9,1) DEFAULT NULL,
`Col_005` float(9,1) DEFAULT NULL,
`Col_006` smallint(6) DEFAULT NULL,
`Col_007` smallint(6) DEFAULT NULL,
`Col_008` smallint(6) DEFAULT NULL,
`Col_009` float(9,1) DEFAULT NULL,
`Col_010` float(9,1) DEFAULT NULL,
`Col_011` float(9,1) DEFAULT NULL,
`Col_012` float(9,1) DEFAULT NULL,
`Col_013` smallint(6) DEFAULT NULL,
`Col_014` float(9,1) DEFAULT NULL,
`Col_015` float(9,1) DEFAULT NULL,
`Col_016` float(9,1) DEFAULT NULL,
`Col_017` smallint(6) DEFAULT NULL,
`Col_018` smallint(6) DEFAULT NULL,
`Col_019` smallint(6) DEFAULT NULL,
`Col_020` smallint(6) DEFAULT NULL,
`Col_021` smallint(6) DEFAULT NULL,
`Col_022` float(9,1) DEFAULT NULL,
`Col_023` double(18,1) DEFAULT NULL,
`Col_024` float(18,3) DEFAULT NULL,
`Col_025` float(9,1) DEFAULT NULL,
PRIMARY KEY (`Id`,`CreatedDateTime`),
KEY `idx_A_20140919175041_CDT` (`CreatedDateTime`),
KEY `idx_A_20140919175041_UId` (`UserId`),
KEY `idx_A_20140919175041_DId` (`DeviceId`)
) ENGINE=InnoDB AUTO_INCREMENT=331831721 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (Year(`CreatedDateTime`)*10000 + Month(`CreatedDateTime`)*100 + Day(`CreatedDateTime`))
(PARTITION pl20140110 VALUES LESS THAN (20140110) ENGINE = InnoDB,
PARTITION pl20140120 VALUES LESS THAN (20140120) ENGINE = InnoDB,
PARTITION pl20140130 VALUES LESS THAN (20140130) ENGINE = InnoDB,
PARTITION pl20140210 VALUES LESS THAN (20140210) ENGINE = InnoDB,
PARTITION pl20140220 VALUES LESS THAN (20140220) ENGINE = InnoDB,
PARTITION pl20140230 VALUES LESS THAN (20140230) ENGINE = InnoDB,
PARTITION pl20140310 VALUES LESS THAN (20140310) ENGINE = InnoDB,
PARTITION pl20140320 VALUES LESS THAN (20140320) ENGINE = InnoDB,
PARTITION pl20140330 VALUES LESS THAN (20140330) ENGINE = InnoDB,
PARTITION pl20140410 VALUES LESS THAN (20140410) ENGINE = InnoDB,
PARTITION pl20140420 VALUES LESS THAN (20140420) ENGINE = InnoDB,
PARTITION pl20140430 VALUES LESS THAN (20140430) ENGINE = InnoDB,
PARTITION pl20140510 VALUES LESS THAN (20140510) ENGINE = InnoDB,
PARTITION pl20140520 VALUES LESS THAN (20140520) ENGINE = InnoDB,
PARTITION pl20140530 VALUES LESS THAN (20140530) ENGINE = InnoDB,
PARTITION pl20140610 VALUES LESS THAN (20140610) ENGINE = InnoDB,
PARTITION pl20140620 VALUES LESS THAN (20140620) ENGINE = InnoDB,
PARTITION pl20140630 VALUES LESS THAN (20140630) ENGINE = InnoDB,
PARTITION pl20140710 VALUES LESS THAN (20140710) ENGINE = InnoDB,
PARTITION pl20140720 VALUES LESS THAN (20140720) ENGINE = InnoDB,
PARTITION pl20140730 VALUES LESS THAN (20140730) ENGINE = InnoDB,
PARTITION pl20140810 VALUES LESS THAN (20140810) ENGINE = InnoDB,
PARTITION pl20140820 VALUES LESS THAN (20140820) ENGINE = InnoDB,
PARTITION pl20140830 VALUES LESS THAN (20140830) ENGINE = InnoDB,
PARTITION pl20140910 VALUES LESS THAN (20140910) ENGINE = InnoDB,
PARTITION pl20140920 VALUES LESS THAN (20140920) ENGINE = InnoDB,
PARTITION pl20140930 VALUES LESS THAN (20140930) ENGINE = InnoDB,
PARTITION pl20141010 VALUES LESS THAN (20141010) ENGINE = InnoDB,
PARTITION pl20141020 VALUES LESS THAN (20141020) ENGINE = InnoDB,
PARTITION pl20141030 VALUES LESS THAN (20141030) ENGINE = InnoDB,
PARTITION pl20141110 VALUES LESS THAN (20141110) ENGINE = InnoDB,
PARTITION pl20141120 VALUES LESS THAN (20141120) ENGINE = InnoDB,
PARTITION pl20141130 VALUES LESS THAN (20141130) ENGINE = InnoDB,
PARTITION pl20141210 VALUES LESS THAN (20141210) ENGINE = InnoDB,
PARTITION pl20141220 VALUES LESS THAN (20141220) ENGINE = InnoDB,
PARTITION pl20141230 VALUES LESS THAN (20141230) ENGINE = InnoDB,
PARTITION pl20150110 VALUES LESS THAN (20150110) ENGINE = InnoDB,
PARTITION pl20150120 VALUES LESS THAN (20150120) ENGINE = InnoDB,
PARTITION pl20150130 VALUES LESS THAN (20150130) ENGINE = InnoDB,
PARTITION pl20150210 VALUES LESS THAN (20150210) ENGINE = InnoDB,
PARTITION pl20150220 VALUES LESS THAN (20150220) ENGINE = InnoDB,
PARTITION pl20150230 VALUES LESS THAN (20150230) ENGINE = InnoDB,
PARTITION pl20150310 VALUES LESS THAN (20150310) ENGINE = InnoDB,
PARTITION pl20150320 VALUES LESS THAN (20150320) ENGINE = InnoDB,
PARTITION pl20150330 VALUES LESS THAN (20150330) ENGINE = InnoDB) */;
...全文
评论 15
收藏 已收藏
分享
返回顶部
小灰狼
MySQL 57,062 成员 56,759 内容