25
回答
1300万数据的复杂查询,要求在3s内返回结果
开发十年,就只剩下这套Java开发体系了   

有一个需求,请求支援, 目前有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计算就很慢。



举报
c61811
发帖于4年前 25回/2K+阅
共有25个答案 最后回答: 4年前

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

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