免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3523 | 回复: 16
打印 上一主题 下一主题

【讨论中】遇到个大数据表的问题 1个月的数据在2G左右 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-15 17:51 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2012-09-17 09:20 编辑

创建了一个表,字段有20多个, 数据一个月表大小2G-4G,
数据记录在8000万左右,
结果造成了查询一个数据记录需要20多秒,
搜索采用了多步查询,
  select  a from  testtable group by a
  select b from testtable where a='??' group by b
  ....
  基本数据是这样子的,

  针对这样的表,有什么优化的方法?

论坛徽章:
0
2 [报告]
发表于 2012-09-16 20:04 |只看该作者
遇到 同样的问题,我的数据比你的还大。。。不晓得mysql是不是可以承受得住

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
3 [报告]
发表于 2012-09-17 10:26 |只看该作者
本帖最后由 chinafenghao 于 2012-09-17 10:27 编辑

回复 1# badeager

楼主的硬件估计不太给力了,所以要想方法来处理了。
看你的sql,主要是where a group by b。
可以考虑一下几种方案。
1、使用分区表,以a为键来分区,这样每次group by就在一个分区里。
2、group by最好能够limit一下。
3、group by b的目的我不太清楚,如果你是为了取数量,你可以做一个临时表,不用实时跑。
4、硬件方面,这种group by肯定会用到临时表。所以可以监控硬件,group的时候哪方面的硬件资源不足,可以适当增加一些。
5、可以考虑将日志转出到infobright引擎做查询,效率会高非常多
   

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
4 [报告]
发表于 2012-09-17 10:28 |只看该作者
单从语句来看,最直接的是加 (a,b)的联合索引。
这两个语句如果有这个联合索引,在8000w的数据量下应该是不成问题的。

后期的优化可以参考楼上的意见,分区,历史数据清理,转入数据仓库处理等

论坛徽章:
0
5 [报告]
发表于 2012-09-18 10:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2012-09-18 10:24 |只看该作者
现在因为是数据库比较老, MYSQL5.1以下,导致了没有办法使用分区,不过后期决定解决。
还想问一个问题,分区可以做多层次的子分区吗?

可能分表也是个不错的选择

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
7 [报告]
发表于 2012-09-18 15:18 |只看该作者
本帖最后由 shang2010 于 2012-09-18 15:20 编辑

@chinafenghao 1、使用分区表,以a为键来分区,这样每次group by就在一个分区里。


从理论上讲,应该以b为分区键的说才为合理,,这样多个分区可以并行计算。。。


不太懂mysql,,请拍砖

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
8 [报告]
发表于 2012-09-18 15:21 |只看该作者
@fengshijie

业务优化最先。。

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
9 [报告]
发表于 2012-09-19 12:33 |只看该作者
@shang2010 where a = '' group by b.
如果按b来分区的话,where a的时候对磁盘的IO还是很比较大。读不存在并发问题,主要是IO问题。

我是这么理解的,

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
10 [报告]
发表于 2012-09-19 12:34 |只看该作者
@cenalulu
嗯,如果没有where b这种和直接group by b。联合索引肯定比单独做两个索引好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP