为什么要分库分表?
MySql是存在瓶颈的,数据量就是他最大的瓶颈,如果一张表或者一个数据库里面的数据量过大都会导致一些意料之外的问题,譬如查询过慢,难以维护等问题,这时候就要想出一个完美的解决办法。
 
1.垂直分库:垂直分库就是将一个系统里面的多个表取出放到多个数据库里面达到分库操作。
 
垂直分库的原则:保证分出来的两张表之间不能存在关联查询,因为在多个数据库里面的关联查询时不成立的。主要根据的是业务来进行划分的,如果你的业务之间耦合太大是没办法进行分库的,只有火车票订票系统和卖猪肉系统才能进行划分。
 
2.水平分表:水平分表就是按照表中的字段进行区分,譬如常见的就是用ID和创建时间进行区分。
水平将表按照ID的区间进行区分。或者时间区间进行区分。拆分的结果是多张具有相同结构的表。
  • ID分区
  • 分片枚举:定义一个地区信息表,根据地区ID和地区信息进行分表,使用hash分区
  • 范围约定:约定一个范围进行分片,使用range
  • 时间分区:根据创建时间等进行时间划分。
 
水平分表的原则:需要考虑分表后的数据库压力问题,譬如分开后一个数据库的压力很大另外一个数据库毫无压力。
 
分表后的关联查询:存在关联查询的表中根据关联的外键创建一个子表,同时定义明确外键,在分表的时候同时对子表进行分表。
 
全局表:全局表的特点就是数据量小,跟所有的表都可以进行join操作,同时必不可少。一些数据库中间件可以创建全局表类型,然后在每个节点中创建一个全局表。
 
分表后的数据迁移:一般有两种方式
  • 停机维护:不对外提供服务然后复制,这种复制不会出现数据不一致的问题,因为在数据复制期间不会出现数据更改
  • 双写操作:依然对外提供服务,所有update、insert、delete操作都对两个数据库进行操作,然后所有的select操作都是按照老库进行读取。然后新起一个事务遍历老库中的数据并且进行复制,在复制过程中需要一个时间戳来进行判断老库中的数据是否新于新库中的数据,保证不会出现旧的数据覆盖新的数据这种情况。
 
在分表之后要保证全局唯一的序列:
  • 使用数据库来存储序列:每次在数据库中取出1-100个序列然后交给数据库中间件进行派发,如果派发完成就继续去数据库里面取,如果当前数据库中间件挂掉了,备用数据库中间件上岗就会重新去数据库中就行取序列。虽然前一个中间件的序列可能没有完全分发,但是以就可以保证序列的唯一性。
  • twitter的雪花算法:雪花算法采用标志位 + 时间戳 + 机器号 + 序列号
ID总长64位,第一位标志位不可用,41位的时间戳,10位的生成机器的ID,12位序列号。
 
 
 
 
 
 
 
 
 
 
 
 
 
 

MySql分库分表以及相关问题的更多相关文章

  1. Mysql分库分表方案

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

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

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

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

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

  4. mysql分库分表(二)

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

  5. mysql分库分表(一)

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

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

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

  7. mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?

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

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

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

  9. MySQL分库分表备份脚本

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

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

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

随机推荐

  1. nginx调试和location用法,匹配url

    1.nginx调试输出内容到页面 location = /demo { charset utf-8; default_type text/html; return 500 "服务正在升级,请 ...

  2. 关于uniapp 打自定义基座部分手机不能自动安装的问题

    部分手机指的是-------没错就辣鸡 vivo手机 解决办法----进入手机文件管理-----根目录-----会有一个你打包的app.apk文件,手动安装一下就好了 搜索 复制

  3. k8s 更改pod数量限制(默认每个节点最多110组pod)

      1.登录 node 节点,查看kubelet启动文件路径 [root@xxxxxxxZ ~]# systemctl status kubelet ● kubelet.service - kubel ...

  4. axios上传excal方法

    方法一(适合传文件且带参数的方法) HTML内容 <a href="javascript:;" class="select-file"> <i ...

  5. 记录 windows RabbitMq 安装教程

    安装地址:https://www.rabbitmq.com/ RabbitMq 官网下载如下两个exe文件,otp_win64_22.0.exe 文件是rabbitmq的运行环境,必须安装!!! 傻子 ...

  6. net/http

    客户端 GET POST form表单 json body二进制流 上传文件 PUT DELETE HEAD 重定向 Client Request Response Cookie CookieJar ...

  7. 保护IIS Web服务器安全的技巧

    首先,开发一套安全策略 保护Web服务器的第一步是确保网络管理员清楚安全策略中的每一项制度.如果公司高层没有把服务器的安全看作是必须被保护的资产,那么保护工作是完全没有意义的.这项工作需要长期的努力. ...

  8. 1.3 C语言--指针与结构体

    指针 指针概念的引入 关于内存 程序有数据和指令组成,数据和指令在执行过程中存放在内存中.变量是程序数据中的一种,因此变量也存储在内存中:内存中的每个字节都有一个唯一的编码,即内存地址.32位机的内存 ...

  9. Centos使用nohup实现后台运行程序

    nohup和&的区别& : 指在后台运行 nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断 ...

  10. PHP Redis - 事务

    Redis 事务可以一次执行多个命令, 并有两个重要的保证: ① 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. ② ...