1300万数据的复杂查询,要求在3s内返回结果

c61811 发布于 2014/07/29 15:06
阅读 2K+
收藏 6

有一个需求,请求支援, 目前有1300万数据,需要进行group by的max查询

请问用什么设计方法可以在3秒内遍历查询出结果,希望有高手出手~~~


表结构设计:
CREATE TABLE `day_data_store` ( 
`id` int(10) NOT NULL AUTO_INCREMENT, 
`ip` bigint(20) DEFAULT NULL, 
`date_day` int(10) DEFAULT NULL, 
`type_int` tinyint(1) DEFAULT NULL, 
`avg_1` double(10,4) DEFAULT NULL, 
`max_1` double(10,4) DEFAULT NULL, 
`avg_2` double(10,4) DEFAULT NULL, 
`max_2` double(10,4) DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `index_on_three` (`type_int`,`date_day`,`ip`) USING BTREE 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
sql需求:
select ip,type_int,max(max_1) from day_data_store
where ( 
(type_int=1 and max_1<30) or (type_int=5 and max_1<8 and max_2<8) 
or (type_int=3 and max_1<12) or (type_int=4 and max_1<30) or (type_int=6 and max_1<150) 
) 
and date_day>=20130424 and date_day<=20140724 
group by ip,type_int;

附:目前经过本人的测试和优化,在mysql中查询所有数据的结果需要20s左右,

在mongodb中只做查询速度很快,但是做group和max计算就很慢。



加载中
2
JasonWcx
JasonWcx
将多个or条件查询 拆解成union all
JasonWcx
JasonWcx
回复 @c61811 : 在date_day 上加聚集合索引 取消之前的索引
c61811
c61811
这种不行,试了
1
自由之信
自由之信

做一个一直运行的任务,或者是定时运行的任务,自动把上面的数据按照你需要的结果查询并分类结果放在另一个结果表里面,然后需要的时候,直接从表里面取数据,传说中的MapReduce就是这样的...(这一句是笑话,别介意,哈哈)

502BadGateway
502BadGateway
回复 @lgscofield : 类似物化视图
原来如此
原来如此
虽然这个方法土,但的确是很有效果的,一主多从,在从库上查询,不会影响主库的正常业务
c61811
c61811
只能说你们太富有了~
loyal
loyal
那你这么做,不就直接锁表了么?
lgscofield
lgscofield
其实我们之前也是这么做的,美其名曰:缓存表
下一页
0
湘中朱生
湘中朱生
达成目标的两条途径:1. 优化程序 , 2. 使用高性能服务器 ,如果第1条已经无法突破,那就只剩第2条了。
湘中朱生
湘中朱生
回复 @兮风古道 : 说你扯淡,你还不信,我说的是解决思路,你都没看明白就回复,接二连三放空炮,你这不是扯淡是什么?技术讨论,来点干货,放空炮没什么意义的!
兮风古道
兮风古道
回复 @湘中朱生 : 说你扯淡,你还不服。那么我来问你,依你所言,第一条无法突破? 怎么才知道无法突破,想过没有
湘中朱生
湘中朱生
回复 @c61811 : 如果这只能在软件上突破的话,可以将每个月的max值统计起来存储在一张零时表中,统计变量只有:一个统计开始时间和一个统计结束时间的话,程序上需要修改一下:中间整月的可以直接从临时表取已有的值,两头的零散时间则分开统计,这样效能应该可以大大提高!
湘中朱生
湘中朱生
回复 @兮风古道 : 那你觉得还有哪些方法可以达成版主目标? 如果有,请讲出来,如果没有,那只能说明你自己在扯淡!
c61811
c61811
你的建议需要和领导商量一下^_^
下一页
0
兮风古道
兮风古道
给type_int和date_day分别加上索引。别用联合索引
c61811
c61811
mysql对or的索引支持不好~
0
蚂蚁蚂蚁
蚂蚁蚂蚁
把联合索引去掉试试! 加date_day和type_int的索引
0
lgscofield
lgscofield
你这sql语句有做性能分析吗,感觉涉及全表扫描啊
c61811
c61811
现在确实是想做极致的效率测试,看看有没有好的解决方案出现
0
c61811
c61811
高手在哪里?出来露露脸~
0
洞悉
洞悉

id是主键 为什么要添加一个唯一索引

c61811
c61811
这个可以去掉,不用理会~
0
Tuesday
Tuesday

只能说, 你们公司做数据库表的是人才.


Tuesday
Tuesday
回复 @c61811 : 人才, 至少贴一段 explain,
c61811
c61811
人才,你认为该怎么设计?
0
d
dever2011
先看看执行计划....
返回顶部
顶部