分库分表,顾名思义,就是把原本存储于一个库一张表的数据分块存储到多个库多张表上。对于大型互联网应用来说,当一张表的数据量达到百万、千万时,数据库每执行一次查询所花的时间会变多,并且数据库面临着极高的并发访问。通过分库分表,使数据均衡地分布到多张表中,可以缩短数据查询所需要的时间,提高数据库的吞吐,减轻数据库压力。

一、垂直切分
将表按照功能模块、关系密切程度划分出来,部署到不同的库上。常见的分成6大库:
1)用户类库:用于保存了用户的相关信息。例如:db_user,db_system,db_company等。
2)业务类库:用于保存主要业务的信息。比如主要业务是订单,用这个库保存订单业务。例如:db_order等。
3)内存类库:主要用Mysql的内存引擎。前台的数据从内存库中查找,速度快。例如:heap。
4)图片类库:主要保存图片的索引以及关联。例如:db_img_index,db_img_res。
5)日志类库:记录点击,刷新,登录等日志信息。例如:db_log_click,db_log_fresh,db_log_login。
6)统计类库:对业务的统计,比如点击量,刷新量等等。例如db_stat。
1、垂直分表
垂直分表,通俗的说法叫做“大表拆小表”,基于关系型数据库中的“列”(字段)进行拆分。
通常情况,某个表中的字段比较多,可以新建立一张“扩展表”,将不经常使用或者长度较大的字段拆分出去放到“扩展表”中,每个表里面的数据记录数一般情况下是相同的,只是字段不一样。
2、垂直分库
垂直分库就是依据业务功能的不同,划分为不同的业务库。
比如:一个数据库里面既存在用户数据,又存在订单数据,还有产品数据,那么垂直拆分可以把用户数据放到用户库、把订单数据放到订单库、把产品数据放到产品库。
二、水平拆分
当一个表中的数据量过大时,可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表和不同的库上。
1、水平分表
水平分表也称为横向分表,就是将表中不同的数据行按照一定规律分布到不同的数据库表中(仍在同一个数据库中),这样来降低单表数据量,优化查询性能。
比如:有一张用户表user,由于记录条数太多,将其拆分成256张表,拆分的记录根据user_id%256取得对应的表进行存储,比如user_id为10001,10001%256=17,则user_id为10001的数据存在表user17中。
2、水平分库
与分表策略相似,分库也可以采用通过一个关键字段取模的方式,来对数据访问进行路由。
三、垂直水平拆分
垂直水平拆分,是综合了垂直和水平拆分方式的一种混合方式,垂直拆分把不同类型的数据存储到不同库中,再结合水平拆分,使单表数据量保持在合理范围内,扩展系统的并发处理能力,提升单表的查询性能。
 
一种分库分表的路由策略如下(假设采用user_id作为路由字段):
中间变量=user_id% (库数量x每个库的表数量)
库=取整(中间变量/每个库的表数量)
表=中间变量%每个库的表数量
假设将原来的单库单表order拆分成256个库,每个库包含1024个表,那么按照前面所提到的路由策略,对于user_id=262145的访问,路由的计算过程如下:
• 中间变量=262145% (256X1024) =1;
• 库=取整(1/1024) =0;
• 表=1%1024=1。
这意味着,对于user_id=262145的订单记录的查询和修改,将被路由到第0个库的第1个表中执行。
 
[参考资料]
分库分表的几种常见形式以及可能遇到的难

2017-6-5/MySQL分库分表的更多相关文章

  1. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  2. Mysql分库分表方案

    Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. m ...

  3. MYSQL分库分表和不停机更改表结构

    在MYSQL分库分表中我们一般是基于数据量比较大的时间对mysql数据库一种优化的做法,下面我简单的介绍一下mysql分表与分库的简单做法. .分库分表 很明显,一个主表(也就是很重要的表,例如用户表 ...

  4. MySQL分库分表备份脚本

    MySQL分库备份脚本 #脚本详细内容 [root@db02 scripts]# cat /server/scripts/Store_backup.sh #!/bin/sh MYUSER=root M ...

  5. 【分库、分表】MySQL分库分表方案

    一.Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. ...

  6. Java互联网架构-Mysql分库分表订单生成系统实战分析

    概述 分库分表的必要性 首先我们来了解一下为什么要做分库分表.在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量.连接数.处理能力等都很有限,数据库本身的“有状态性” ...

  7. mysql分库分表(二)

    mysql分库分表 参考: https://www.cnblogs.com/dongruiha/p/6727783.html https://www.cnblogs.com/oldUncle/p/64 ...

  8. mysql分库分表(一)

    mysql分库分表 参考: https://blog.csdn.net/xlgen157387/article/details/53976153 https://blog.csdn.net/cleve ...

  9. (转)企业Shell实战-MySQL分库分表备份脚本

    本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.htm ...

  10. 思考--mysql 分库分表的思考

    查询不在分库键上怎么办,扫描所有库?由于分库了,每个库扫描很快?所以比单个表的扫描肯定快,可以这样理解吗. 多表jion怎么弄,把内层表发给每个分库吗? citus,tidb 都有这些问题,citus ...

随机推荐

  1. 1-2、LVS之Linux集群系统基础

    Linux Cluster: 为了满足同一目的的需要,将多台主机组织起来解决统一问题的计算机的集合叫集群 Web Arch 虚拟化和云计算 自动化运维工具:ansible, puppet, zabbi ...

  2. SAP-批量修改主数据(客户、供应商、物料)

    SAP-批量修改主数据(客户.供应商.物料) TCODE: MASS 对于批量修改主数据如客户,供应商等,可以试用一下Mass , 它所能修改的范围如下: 选定要修改的对象后,点击运行,会要求选择需要 ...

  3. C语言学习之桶排序

    之前的博文写了交换(冒泡)排序.选择排序,本文就写写桶排序.不过我理解的这样不算是真正上的桶排序,我的比较简单而真正的桶排序是比较复杂的,暂且就叫桶排序吧. 桶排序在排序中应该用的不多吧,个人理解的是 ...

  4. Windows android appium python3 环境搭建

    安装nodejs https://www.cnblogs.com/sea-stream/p/10520624.html java 环境变量配置: https://www.cnblogs.com/sea ...

  5. python的json模块的dumps,loads,dump,load方法介绍

    dumps和loads方法都在内存中转换, dump和load的方法会多一个步骤,dump是把序列化后的字符串写到一个文件中,而load是从一个文件中读取字符串 将列表转为字符串 >>&g ...

  6. ES6的新API如Promise,Proxy,Array.form(),Object.assign()等,Babel不能转码, 使用babel-polyfill来解决

    Babel默认只转换新的JavaScript句法(syntax),而不转换新的API,比如Iterator.Generator.Set.Maps.Proxy.Reflect.Symbol.Promis ...

  7. adb shell命令后出现error: device not found错误提示

    在cmd中输入adb shell进入linux shell环境前,需要把android模拟器打开(本文都是针对模拟器而言,并非真机).如果启动好了模拟器,且输入adb shell命令后出现error: ...

  8. AtCoder Beginner Contest 113 D Number of Amidakuji

    Number of Amidakuji 思路:dp dp[i][j]表示经过(i, j) 这个点的方案数 然后一层一层地转移, 对于某一层, 用二进制枚举这一层的连接情况, 判断连接是否符合题意, 然 ...

  9. HTML第一章总结

    第一章总结 HTML那些事儿:Web Sever, Web Browser,HTML files 如果你要做网页,那你写了HTML文档就要上传到 Web Server 上 在客户使用 Web Brow ...

  10. 安卓四大组件之Sevice组件的简单使用 --Android基础

    1.本例实现了简单的Service(服务)的创建.启动和停止,点击“启动SERVICE”页面会显示“服务被创建”,接着是“服务被启动”.点击“停止SERVICE”页面提示“服务被停止”.太过基础,直接 ...