当前位置:网站首页>mysql分表之后如何平滑上线详解
mysql分表之后如何平滑上线详解
2022-04-23 11:02:00 【liming89】
文章来源: 学习通http://www.bdgxy.com/
分表的目的
项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询数据变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。
当出现这种情况时,我们可以考虑分表,即将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法,让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。
举个栗子
比如咱们最常见的用户表(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表和各个分表之间的数据完全一致性,所以直接把查询的部分改掉是没有任何问题的
如果按照以上步骤执行,那么对线上的数据是没有任何影响的,而且我们线上就是这么操作了,经过了多次实践确保不会出问题,放心使用即可。
总结
到此这篇关于mysql分表之后如何平滑上线的文章就介绍到这了,更多相关mysql分表平滑上线内容请搜索菜鸟教程www.piaodoo.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持菜鸟教程www.piaodoo.com!
版权声明
本文为[liming89]所创,转载请带上原文链接,感谢
https://blog.csdn.net/liming89/article/details/124343240
边栏推荐
- How to quickly download vscode
- 一道有趣的阿里面试题
- Resolution and size of mainstream mobile phones
- Which company is good for opening futures accounts? Who can recommend several safe and reliable futures companies?
- Learning notes 7-depth neural network optimization
- Visualized common drawing (II) line chart
- Introduction to neo4j authoritative guide, recommended by Qiu Bojun, Zhou Hongxiang, Hu Xiaofeng, Zhou Tao and other celebrities
- Excel · VBA array bubble sorting function
- Diary of dishes | Blue Bridge Cup - hexadecimal to octal (hand torn version) with hexadecimal conversion notes
- SVN的使用:
猜你喜欢
Excel·VBA自定义函数获取单元格多数值
GO接口使用
Database management software sqlpro for SQLite for Mac 2022.30
Introduction to data analysis 𞓜 kaggle Titanic mission (IV) - > data cleaning and feature processing
A diary of dishes | 238 Product of arrays other than itself
Excel · VBA array bubble sorting function
Manjaro installation and configuration (vscode, wechat, beautification, input method)
解决方案架构师的小锦囊 - 架构图的 5 种类型
ID number verification system based on visual structure - Raspberry implementation
More reliable model art than deep learning
随机推荐
语雀文档编辑器将开源:始于但不止于Markdown
Promise详解
使用zerotier让异地设备组局域网
Embedded related surface (I)
Microsoft Access database using PHP PDO ODBC sample
MySQL分区表实现按月份归类
Gets the current time in character format
Source insight 4.0 FAQs
Google Earth engine (GEE) - scale up the original image (taking Hainan as an example)
How to bind a process to a specified CPU
Dirichlet prefix sum (number theory optimization formula sub complexity weapon)
Derivation and regularization
Visualized common drawing (II) line chart
Chapter 1 of technical Xiaobai (express yourself)
Cumcm 2021 - B: préparation d'oléfines C4 par couplage éthanol (2)
Resolution and size of mainstream mobile phones
Hikvision face to face summary
MySQL面试题讲解之如何设置Hash索引
Constraintlayout layout
Introduction to data analysis 𞓜 kaggle Titanic mission (III) - > explore data analysis