分表的目的

项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询数据变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。

当出现这种情况时,我们可以考虑分表,即将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法,让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。

举个栗子


举个栗子

比如咱们最常见的用户表(user表)

id user_id 其他字段
主键id 用户id 其他字段

咱们一般都会用user_id去查询对应的用户信息,但是随着业务的增长,这张表会越来越大,甚至上亿,严重影响了查询性能。
所以咱们就会对这张表进行分表处理,分到多张表减小查询压力

分表策略

以分10张表为例(具体分多少张表 根据实际情况来估算)
首先咱们建10张表
user1、user2、user3。。。。。user10

一般情况下,我们都会用作为索引的字段(user_id)进行取模处理。想分多少张表,就按照多少取模,比如这个case就是10

$table_name = $user_id % 10;

按照上面的取模公式

  • user_id为1295的会落在user5里面
  • user_id为8634的会落在user4里面
  • 。。。。。。。

「每次CURD根据上面查找表的策略进行就行了」,这个问题不大,我们暂且先不多说。

已经上线的运行中的表怎么办?

其实上面的方法大家应该都知道怎么用,但是有个问题,已经上线了的表怎么办?那张表的数据在线上是一直被查找或者改变的。如何能够进行平滑的分表,并且让用户无感知呢?

方法1

直接上线,提前写个脚本,脚本内容是把旧表(user)的数据同步到user1表到user10表,一上线了赶紧执行

这种方法明显是行不通的,主要是存在以下问题

  • 如果执行过程中脚本有问题怎么办?代码全部回滚?
  • 脚本把把旧表(user)的数据同步到user1表到user10表,这个脚本得执行多久? 如果是1个小时,那么这段时间线上和这张表相关的业务都是不正常的

这显然是行不通的,对线上影响很大。

方法2

先写个同步数据的脚本,脚本内容是把旧表(user)的数据同步到user1表到user10表,脚本同步完了再上线。

这个方法看起来友好了一些,不过也存在一些问题。

  • 脚本同步完,立即上线,这两件事之间是有一些时间差的,这个时间差中线上表可能有一些改动,这些改动怎么办?

「以上两种方法看起来貌似都行不通,所以看来得来点不一样的了。咱们直接看结论。」

步骤1 上线双写

首先咱们把双写上线了,什么意思呢?比如user_id=123,对于增加,删除,修改操作来说,咱们既操作user表,也操作user_id=123对应的user3表。

function modify($user_id){  //包含增加,删除,修改操作
  modify_user();  //modify user表
  $table_name = $user_id % 10;
  modify_user($table_name) //modify对应的分表
}

因为查询的部分还是在user表中查询的,所以上面的操作对线上用户是无任何影响的。

步骤2 全量同步

写一个全量同步user表到user1-user10的表,最好找个低峰期执行脚本,以防万一影响user表的查询

这一步执行之后,因为咱们之前上线了双写(见步骤1),所以user表和user1-user10表之间的数据已经是完全一致的了。

步骤3 查询新表数据

将查询的部分改到user1-user10

因为前面两个步骤咱们已经保证了user表和各个分表之间的数据完全一致性,所以直接把查询的部分改掉是没有任何问题的

如果按照以上步骤执行,那么对线上的数据是没有任何影响的,而且我们线上就是这么操作了,经过了多次实践确保不会出问题,放心使用即可。如果这篇文章帮助到了你,记得点个赞哦。

最新文章

  1. welcome to learn prgram
  2. 清除层div浮动
  3. C#中thrift 中THttpHandler 传输数据 慢 slow 解决办法
  4. 今天学习了无序列表和有序列表和使用HTML5创建表格
  5. strip, 关于去除目标文件种的不必要信息
  6. 百度参投 Uber中国12亿美元融资已到账
  7. X-Plane飞行模拟器购买安装
  8. C51与汇编混合编程详解
  9. C#高级编程三十天----泛型结构,泛型方法,泛型托付
  10. [LeetCode]Word Ladder 最短距离字符串转换 (Dijkstra)
  11. [iOS]C语言技术视频-15-指针变量高级用法练习一(函数指针完成动态排序)
  12. android EditText与TextView几个常用的属性
  13. 初次接触:DirectDraw
  14. EBS技术开发之VPD策略
  15. BZOJ_3477_[Usaco2014 Mar]Sabotage_二分答案
  16. 3D轮播图
  17. roadhog 介绍
  18. 经典]Linux内核中ioremap映射的透彻理解【转】
  19. cf689d ST表RMQ+二分
  20. 来自极客头条的 15个常用的javaScript正则表达式

热门文章

  1. 不使用注解和使用注解的web-service-dao结构
  2. 硕盟type-c转接头|四合一多功能扩展坞
  3. 路由懒加载---Vue Router
  4. nmap使用命令(转载)原文地址https://www.jianshu.com/p/4030c99fcaee
  5. CentOS7下编译安装redis-5.0.9
  6. TP5关联模型出现疑问,待解决
  7. Java基础系列(21)- dowhile循环
  8. 使用Jmeter执行接口自动化测试-如何初始化清空旧数据
  9. Qt中的ui文件转换为py文件
  10. P5437-[XR-2]约定【拉格朗日差值,数学期望】