设为首页 收藏本站
查看: 1008|回复: 0

[经验分享] MySQL5.5表的水平拆分

[复制链接]

尚未签到

发表于 2018-10-1 07:31:18 | 显示全部楼层 |阅读模式
  一:业务背景
  二:第一种业务水平拆分方案
  三:第二种业务水平拆分方案
  1.1由于业务量的急剧增加,某张表的数据越来越大,现在假设的情况为某家公司的P2P网站,由于前期宣传比较好,在近三个月的时间里业务量急剧增加,使得流水记录表(trade)的数据量变的越来越大,已经超过300万行记录,预计年内流水表的记录可能会超过1000万行,这个时候就需要考虑做表的水平拆分了
  1.2 假设随着业务量的增加,用户量也增加了,由以前的几千个用户上升到100万,也想对其进行水平拆分
  2.1假设年内达到1000万行记录,再加上后续的考虑,暂且把流水表(trade)拆分为10张表,分别为trade_0, trade_1, trade_2, trade_3... , trade_10
  2.2流水表中的字段假设如下字段
  serial_number流水号 user_ID用户ID request_message请求信息
  2.3因为获取流水是根据user_id(用户ID)来获取自己的流水情况的,所以这里以user_id来做分表
  2.4 user_id%10用user_id模上10,等于几就把等于这个user_id的记录插入到trade_x中(x等于0到10)
  2.5具体步骤
  2.5.1先查看一下当前trade表中有多少条记录,以便最后拆分完成以后核对记录是否丢失
DSC0000.jpg

  2.5.2把user_id%10=0的记录插入到trade_0,trade_1...trade_9表中
DSC0001.jpg

DSC0002.jpg

DSC0003.jpg

DSC0004.jpg

DSC0005.jpg

DSC0006.jpg

DSC0007.jpg

DSC0008.jpg

DSC0009.jpg

DSC00010.jpg

  2.5.3把trade_0...trade_10表的记录加起来,看是否是trade表的总记录数
  2.5.4以上是把已有的数据拆分成多张表了,那么查询和插入如何操作呢?因为流水是和用户的操作相关的,所以查询和插入的时候,可以使用拼接字符串的方式进行插入数据,例如上面的拆分方法就可以这样拼接
int suffix = user_id%10;  

  
String table_name = "trade_" + suffix;
  

  
INSERT INTO table_name(...) values(...);
  

  
或者
  

  
SELECT * FROM table_name WHERE ...;
  2.5.5总结,由于以上拆分的表是根据已有的用户ID进行拆分的,先有用户,再有流水记录,所以这种业务做拆分是比较容易的
  3.1由于用户量的增长,对用户表也要做数据拆分,拆分方案和以上相同,拆分为user_main_0...user_main_5
DSC00011.jpg

  3.2现在的问题是,用户插入的时候,我们不知道用户ID是多少,也就意味着不知道应该往user_main_0...user_main_5那张表中插入数据
  3.3为了解决以上问题我们可以先执行一下SQL语句
mysql> SELECT AUTO_INCREMENT FROMinformation_schema.TABLES WHERE TABLE_NAME='user_main';  它返回的是当前表的下一个自增长ID的值
  3.4通过以上SQL语句已经得到了当前user_main表下一个ID值,下面创建user_main_uuid表
mysql> CREATE TABLEuser_main_uuid(user_main_next_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT);  3.5然后把“3.3 SQL语句”返回的值插入到user_main_uuid中
DSC00012.jpg

  3.6那么用户注册的时候,提交用户填写的信息,进入到controll的时候,校验完用户信息以后,首先先查user_main_uuid表的user_mian_next_id字段返回的值,然后根据这个值%5,等于几,就给user_main_x中插入
  3.7还有一个问题,用户注册完成之后,应该把user_main_next_id的值自动加1,否则,下个用户注册的时候ID会重复导致不能成功插入数据,所以在把数据成功插入到对应的user_main_x表中以后,再执行以下SQL语句
mysql> INSERT INTO user_main_uuidVALUES(NULL);
DSC00013.jpg

  由于插入一条记录的方式来使ID自增的,所以“3.6”中应该获取的是user_mian_next_id字段的最大值MAX(user_mian_next_id)
  3.8除了以上更新user_mian_next_id的值以外,还可以是以下方式
DSC00014.jpg

  这样user_main_uuid表中就永远只有一条记录,就不用使用MAX()函数了



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-606897-1-1.html 上篇帖子: mysql全局变量和局部变量 下篇帖子: mysql 查看binlog,slowlog,查看锁表情况
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表