Code Bye

百万级数据表查询速度过慢

本人有这样一张数据表,结构如下:
CREATE TABLE IF NOT EXISTS AlarmInfo(
Guid VARCHAR(50) PRIMARY KEY NOT NULL
,DBM VARCHAR(6) NOT NULL
,AlarmType INT(12) NOT NULL
,AlarmLevel INT(12) NOT NULL
,BgnTime datetime NOT NULL
,RecoveryTime datetime NOT NULL
,DevType INT(12) NOT NULL
,DevDNA INT(12) NOT NULL
,DataType INT(12) NOT NULL
,IsInMaintain INT(12) NOT NULL
,Dealer VARCHAR(50) NOT NULL
,DealState INT(12) NOT NULL
,DealInfo VARCHAR(1024) NOT NULL
,Elaborate VARCHAR(1024) NOT NULL
,RecoveryInfo VARCHAR(1024) NOT NULL
,InActive INT(12) NOT NULL
,KEY AlarmInfo_Index(DBM,BgnTime,RecoveryTime)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
表里总共有150w左右的记录,每天2000多条,本人的查询语句是:
select SQL_NO_CACHE * from alarminfo where DBM = “TCC” and ((BgnTime >=”2015-07-25 15:04:00″ AND BgnTime <= “2015-07-26 15:04:00″)  OR  (RecoveryTime >=”2015-07-25 15:04:00″ AND RecoveryTime <=”2015-07-26 5:04:00”)) order by bgntime desc;
每次查询差多需要6.6s左右,本人索引改了好几次,效果都不是很理想,麻烦各位高手帮看看还能怎么优化才能提高查询速度?
解决方案

70

OR改成UNION ALL
索引改成DBM和两个时间字段单独组合
排序改成延迟关联的方式

20

你的这个语句运行之后是返回多少条记录。
索引是对于返回少量数据,作用才会特别大。
另外,假如按照上面的方式修改了语句,把数据union all之后,还是 会有一个 排序的动作,可能也会导致慢,你先试试按照上面修改之后,语句能否更快了

10

而且有个问题一直搞不清楚,为什么每次停止服务,再启动,执行该表的查询语句,都会慢到令人无法忍受,最长可达30s以上,修改查询条件再查询几次,才会稳定到某个值左右。
数据库缓存造成的。
你先试着用单个日期查询,即 BgnTime
在用RecoveryTime 查询。
最后用2个日期一起查询 看看差别在哪里

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明百万级数据表查询速度过慢