查看: 5707|回复: 10

[原创] 如何设计或优化千万级别的大表提问的统一解答

[复制链接]
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
发表于 2011-6-27 14:22 | 显示全部楼层 |阅读模式
知呼或ITPUB论坛上的提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:
1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;


2.数据项:是否有大字段,那些字段的值是否经常被更新;
3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;
4.数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;
5.SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?


6.预计大表及相关联的SQL,每天总的执行量在何数量级?
7.表中的数据:更新为主的业务 还是 查询为主的业务
8.打算采用什么数据库物理服务器,以及数据库服务器架构?
9.并发如何?
10.存储引擎选择InnoDB还是MyISAM?


大致明白以上10个问题,至于如何设计此类的大表,应该什么都清楚了!

至于优化若是指创建好的表,不能变动表结构的话,那建议InnoDB引擎,多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈


另外对优化索引结构去解决性能问题的话,建议优先考虑修改类SQL语句,使他们更快些,不得已只靠索引组织结构的方式,当然此话前提是,
索引已经创建的非常好,若是读为主,可以考虑打开query_cache,


以及调整一些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size
论坛徽章:
10
2010广州亚运会纪念徽章:击剑
日期:2010-12-16 15:18:59ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222010广州亚运会纪念徽章:帆船
日期:2011-05-12 09:06:552011新春纪念徽章
日期:2011-02-18 11:42:472010广州亚运会纪念徽章:橄榄球
日期:2011-01-09 16:56:412011新春纪念徽章
日期:2011-01-04 10:34:20数据库板块每日发贴之星
日期:2011-01-03 01:01:022010广州亚运会纪念徽章:举重
日期:2010-12-21 20:58:06数据库板块每日发贴之星
日期:2010-12-20 01:01:022012新春纪念徽章
日期:2012-01-04 11:56:01
发表于 2011-6-27 22:56 | 显示全部楼层
呵呵 上面的几个问题都是DBA们最在乎的问题~

使用道具 举报

回复
论坛徽章:
4
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56奥运会纪念徽章:铁人三项
日期:2012-09-20 15:17:43ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00
发表于 2011-6-29 02:46 | 显示全部楼层
大表的话 应该分表的 也减少些压力

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-04-15 12:20:32咸鸭蛋
日期:2011-08-05 11:40:05ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56
发表于 2011-6-29 10:55 | 显示全部楼层
原帖由 leadhoo 于 2011-6-29 02:46 发表
大表的话 应该分表的 也减少些压力


同意,我们现在上了千万级数量级别的表都是md5分成16张字表。

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
发表于 2011-6-29 18:42 | 显示全部楼层
当然要水平切分表了,根据我的实际经验,单表不要超过500W记录,这个不是MySQL能不能承担千万级的大表(肯定能,之前我就有个业务表

达到了4000W+的数据,被我水平切分成了16个表分散到分库中)

而是有没有必要,肯定要切分的

否则你为了提高查询性能要付出其他成本

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22奥运会纪念徽章:游泳
日期:2012-07-19 16:38:15奥运会纪念徽章:篮球
日期:2012-10-18 09:31:28奥运会纪念徽章:田径
日期:2012-10-19 10:00:44复活蛋
日期:2013-02-18 15:53:36迷宫蛋
日期:2013-03-05 10:32:55沸羊羊
日期:2015-02-21 23:08:28处女座
日期:2016-02-09 23:01:49
发表于 2011-6-29 20:21 | 显示全部楼层
水平切分16个表,什么意思,就是原来表假如有16个字段,就是建16个表,每个表一个段?
如果不是这样,那是怎么水平切分?

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-04-15 12:20:32咸鸭蛋
日期:2011-08-05 11:40:05ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:56
发表于 2011-6-30 09:05 | 显示全部楼层
原帖由 magscott 于 2011-6-29 20:21 发表
水平切分16个表,什么意思,就是原来表假如
有16个字段,就是建16个表,每个表一个段?
如果不是这样,那是怎么水平切分?


比如表 msg_log,主键字段id int类型。

是md5(id)得出的字符串,取第一个字母,总共有16个首字母(0,1,2,3....a,b,c...f),扯分成msg_log_0、msg_log_1......msg_log_c...,msg_log_f等16张表,然后数据就按照pkid的md5(id)的首字母决定,数据存放入哪一张表里面去。

使用道具 举报

回复
认证徽章
论坛徽章:
27
优秀写手
日期:2013-12-18 09:29:09ITPUB季度 技术新星
日期:2012-08-15 14:50:13嫦娥
日期:2013-03-04 09:47:05数据库板块每日发贴之星
日期:2011-09-08 01:01:01数据库板块每日发贴之星
日期:2011-09-11 01:01:01数据库板块每日发贴之星
日期:2011-09-10 01:01:02数据库板块每日发贴之星
日期:2011-09-09 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:422013年新春福章
日期:2013-03-04 09:50:49
发表于 2011-9-8 13:47 | 显示全部楼层

回复 #1 jinguanding 的帖子

楼主实际生产环境中用过msyql的分区特性么?

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
 楼主| 发表于 2011-9-9 10:36 | 显示全部楼层

回复 #8 mchdba 的帖子

有用的.........用于SNS的场景,以及一个内部监控系统

MySQL版本分别为:5.1.34,5.1.40

使用道具 举报

回复
认证徽章
论坛徽章:
27
优秀写手
日期:2013-12-18 09:29:09ITPUB季度 技术新星
日期:2012-08-15 14:50:13嫦娥
日期:2013-03-04 09:47:05数据库板块每日发贴之星
日期:2011-09-08 01:01:01数据库板块每日发贴之星
日期:2011-09-11 01:01:01数据库板块每日发贴之星
日期:2011-09-10 01:01:02数据库板块每日发贴之星
日期:2011-09-09 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:422013年新春福章
日期:2013-03-04 09:50:49
发表于 2011-9-9 11:15 | 显示全部楼层

回复 #9 jinguanding 的帖子

用了多长时间了,发现隐患了没有?出过啥莫名其妙的bug没有?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表