返回顶部
首页 > 资讯 > 数据库 >mysql分表之后如何平滑上线详解
  • 137
分享到

mysql分表之后如何平滑上线详解

2024-04-02 19:04:59 137人浏览 安东尼
摘要

目录分表的目的 举个栗子 分表策略 已经上线的运行中的表怎么办? 步骤1 上线双写 步骤2 全量同步 步骤3 查询新表数据 总结分表的目的 项目开发中,我们的数据库数据越来越大,随

分表的目的

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

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

举个栗子

比如咱们最常见的用户表(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分表平滑上线内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: mysql分表之后如何平滑上线详解

本文链接: https://lsjlt.com/news/155832.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql分表之后如何平滑上线详解
    目录分表的目的 举个栗子 分表策略 已经上线的运行中的表怎么办? 步骤1 上线双写 步骤2 全量同步 步骤3 查询新表数据 总结分表的目的 项目开发中,我们的数据库数据越来越大,随...
    99+
    2024-04-02
  • mysql水平分表后如何查询
    水平分表后查询数据有两种方法:全局表查询:使用原表名查询,查询处理器自动路由到具体分表。子表查询:直接查询具体分表,需要知道分表表名。 水平分表后查询数据的方法 水平分表是数据库常用的...
    99+
    2024-06-14
    mysql
  • 如何利用Javascript生成平滑曲线详解
    目录前言贝塞尔曲线简介二次贝塞尔曲线三次贝塞尔曲线贝塞尔曲线计算函数拟合算法附录:Vector2D相关的代码总结前言 平滑曲线生成是一个很实用的技术 很多时候,我们都需要通过绘制一...
    99+
    2024-04-02
  • mysql如何实现水平分表
    mysql如何实现水平分表?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!Mysql表数据一般达到百万级别,查询效率会很低,...
    99+
    2024-04-02
  • mysql分表后如何查询
    mysql 分表后查询方法 分表是将一张大表拆分成多个小表的一种技术,以提升数据库的性能和可伸缩性。 查询分表数据的方法有以下几种: 1. 使用联合查询(UNION) 将每个分表...
    99+
    2024-06-14
    mysql
  • 详解分库分表后非分片键如何查询
    目录正文设计一:冗余法方法二:索引表法方法三:基因法小结正文 我们知道在分库分表中对于toC业务来说,需要选择用户属性如 user_id 作为分片键,不推荐使用order_id这样...
    99+
    2023-03-10
    分库分表非分片键查询 非分片键查询
  • Mysql中如何实现水平分表
    本篇文章给大家分享的是有关Mysql中如何实现水平分表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.  &...
    99+
    2024-04-02
  • 详解如何在PyQt5中实现平滑滚动的QScrollArea
    目录平滑滚动的视觉效果实现思路具体代码平滑滚动的视觉效果 Qt 自带的 QScrollArea 滚动时只能在两个像素节点之间跳变,看起来很突兀。刚开始试着用&nb...
    99+
    2023-01-28
    PyQt5实现平滑滚动QScrollArea PyQt5 滚动 QScrollArea PyQt5 QScrollArea
  • 详细介绍线上MySQL某个历史数据表分区
    本文主要给大家简单讲讲线上MySQL某个历史数据表分区,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望线上MySQL某个历史数据表分区这篇文章可以给大家带来一...
    99+
    2024-04-02
  • 数据库分库分表之后,你是如何解决事务问题?
    我们需要接受失望,因为它是有限的;我们不会失去希望,因为它是无穷的。 一、概述 随着时间和业务的发展,数据库中表的数据量会越来越大,相应地,数据操作,增删改查的开销也会越来越大。因此,把其中一些大表进行拆分到多个数据库中的多张表中...
    99+
    2017-12-10
    数据库分库分表之后,你是如何解决事务问题?
  • MySQL数据库线上如何修改表结构
    本篇内容介绍了“MySQL数据库线上如何修改表结构”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • mysql如何取分组之后最新的数据
    目录一、数据表设计二、查询场景 1、统计没门课的考试次数 2、最新一次考试的时间 3、分组统计最新的录入成绩的老师总结一、数据表设计 二、查询场景&n...
    99+
    2024-04-02
  • Vue打包上线之后部分CSS不生效问题的解决办法
    用vue开发的时候,本地开发所有的样式都能生效,但是打包之后就会有部分样式失效,且在浏览器中F12得时候那个属性值并没有变化。 我这边出现的问题是F12走查发现影响的css样式来自s...
    99+
    2022-12-24
    vue打包后css失效 vue打完包起服务css样式没了 vue打包后css有变化
  • 微信小程序版本机制和storage如何平滑兼容详解
    目录问题背景小程序版本小程序的本地存储方案1:读写加标志方案2:读写加标志 + 监测生产版本更新总结问题背景 一款小程序默认会有三个版本(开发、体验、生产),而同一台手机打开同一个小...
    99+
    2022-12-08
    小程序 storage 微信小程序的storage 小程序版本机制和storage
  • 如何解决vue-cli+iview项目打包上线之后图标不显示问题
    这篇文章主要介绍如何解决vue-cli+iview项目打包上线之后图标不显示问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!做vue项目使用的iviewUI库,打包上线之后发现ic...
    99+
    2024-04-02
  • MySQL数据库管理之如何创建分区表
    下面一起来了解下MySQL数据库管理之如何创建分区表,相信大家看完肯定会受益匪浅,文字在精不在多,希望MySQL数据库管理之如何创建分区表这篇短内容是你想要的。      &n...
    99+
    2024-04-02
  • 详解如何在JavaScript中创建线性仪表图
    目录什么是线性仪表图线性量规的类型我们将要构建的线性仪表可视化构建JavaScript线性仪表1、创建一个基本的HTML页面2、包含必要的JavaScript文件3、添加数据值4、为...
    99+
    2024-04-02
  • 详解如何在阿里云上安装mysql
    mysql作为轻量级开源数据库,在企业级的应用中非常的广泛。我之前用过mssql,oracle,postgresql,mysql。目前阿里云上面暂时没有oracle。就我个人使用情况来看,创建项目我会首选m...
    99+
    2024-04-02
  • Mysql如何同时交换两个表的表名详解
    Mysql同时交换两个表的表名 表重命名有两种方式,所以交换两表名也有两种方式: 1 . lock tables t1 write ,t2 write; alter table t1...
    99+
    2024-04-02
  • C#如何给PPT中图表添加趋势线详解
    目录前言1.实现方法2.关于PPT类库安装:可直接通过Nuget搜索安装到程序。总结前言 本文内容分享通过C#程序代码给PPT文档中的图表添加数据趋势线的方法。 支持趋势线的图表类型...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作