mysql分库分表的原则

2023-11-12

分库分表的种类

分库分表是指把数据库中数据物理地拆分到多个实例或多台机器上,非mysql原生态partitioning。

partitioning是mysql官方支持,在本地针对表的分区进行操作,它 可以将一张表的数据分别存储为多个文件。如果在写SQL的时候,遵从了分区的规则,就能把原本需要遍历全表的工作转变为只需要遍历表里某一个分区或某些分区的工作,这样降低了查询对服务器的压力,提升了查询效率,如果分区表使用得当,也可以大规模地提升mysql的服务能力。

但是这种分区方式,一方面,在使用的时候必须遵从分区规则写SQL语句,如果不符合分区规则,性能反而非常低下,另一方面,partitioning的结果受到但实力的数据文件无法分布式存储的限制,不管怎么分区,所有的数据都是在一个服务器上,没办法通过水平扩展物理服务器的方法吧压力分摊出去。

1,垂直拆分

在考虑数据库拆分的时候,一般情况下,应该先考虑垂直拆分,垂直可以理解为分出来的库表结构是互相独立各不相同的。

-如果有多个业务,每个业务直接关联性不大,那么久可以把每个业务拆分为单独的实例,库或表。

-如果在一个实例上,有多个数据库,那么从分摊压力的角度考虑,可以把每个数据库才分到单独的实例上。

-如果在一个库里面有多张表,那么可以把每张表拆分到不同的实例上。

-如果你有一张表,但这个表里的字段很多,每个字段都有不同的含义,如t1表里面有姓名生日,地址等个人信息,那么当该表太大的时候,就可以把每个字段独立拆分为一张新表。

2,水平拆分

水平拆分是真对一张表来说的。在经过垂直拆分之后,如果数据量仍然巨大,如注册用户已经超过10亿,那么治好通过某种算法进行水平拆分。拆分后的结果是多张具有相同表结构的表,每张表里面存储一部分数据,拆分的算分依据很多,如通过id取模100,1024的方式以及通过区分不同日期的方式。

分库分表的原则

1,能不分就不分

mysql是关系型数据库,数据库表之间的关系从一定的角度上映射了业务逻辑,任何分库分表的行为都会在某种程度上提升业务逻辑的复杂度,数据库除了承载数据的存储和访问外,协助业务更好地实现需求和逻辑也是其重要工作之一。分库分表会带来数据的合并,查询或更新条件的分离,以及事务的分离等多种结果,业务实现的复杂程度往往会翻倍或指数级上升。所以,在分库分表前,不要为分而分,而应该尽量去做其他力所能及的事情,例如升级硬盘,升级内存,升级CPU,升级网络,升级数据库版本,读写分离及负载均衡等,所有分库分表的前提是,这些已经尽力做好了。

2,数据量太大,正常的运维影响正常的业务访问

这里说的运维包括乳腺三种情况

-对数据库的备份。如果单表或单个实例太大,在做备份的时候需要大量的磁盘IO或网络IO资源,备份整个过程中维护风险是高于平时的,一个解决方案是为每台设备额外添加第二张网卡。

-对数据表的修改。如果某张表过大,对此表做DDL的时候,mysql会锁住全表,这个时间可能会很长,在这段时间内业务不能访问此表,影响甚大,把数据表切分,使总量减小,有助于改善这种风险。

-整个表的热点数据,数据访问和更新频繁,经常有锁等待,没有能力修改源码,降低锁的粒度,那么只会把其中数据物理的拆开,用空间换时间,变相降低了访问压力。

3,某些数据表出现了无穷增长的情况

各种评论,消息,日志记录,这个增长不是跟人口成比例的,是不可控的。

4,安全性和可用性的考虑

把用户,库存,订单等本来同一的资源切分掉,每个小的数据库实例承担一小部分业务,这样整体的可用性就会提升。

5,业务耦合性考虑

站在业务的层面看,火车票业务和烤猪腿业务是完全不相关的业务,虽然每个业务的数据量可能都不太大,放在一个实例中完全没问题,但是不同业务的维护水平可能不同,火车票业务经常会受到烤猪腿业务的牵连,这个你懂的。惹不起,躲得起。

6,分库分表实现

分库分表的实现,主要体现在两个方面。一方面是把数据库原来数据的存储位置前移到新的库表里;另一方面,数据库的拆分实际上破坏了数据库的关系逻辑,原本的SQL访问可能不在使用,在业务成,怎样才能最好的继续使用数据库,也是个难点。

7,业务层的实现

在业务层面,怎么去读写经过拆分之后分布式存储的数据

-通过在业务程序端嵌入客户端软件包的形式,在业务需要访问数据库的时候,首先访问路由表,在由路由表判断需要访问mysql数据库的位置,然后业务端直接练就数据库,做直接的数据库操作,,如果需要进行数据的合并,则在业务程序端实现,或者在嵌入的客户端软件包里面实现。

-通过proxy的形式。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql分库分表的原则 的相关文章

随机推荐

  • 玩一玩微信公众号开发(二) 管理凭据和自定义菜单

    管理access token access token介绍 在前面我们成功的使用了Spring Boot Web程序和微信对接 但是这仅仅是一个开始 我们还需要获取access token 也就是凭据 才能进行之后的工作 微信开发文档有如下
  • 大数据时代——生活、工作与思维的重大变革

    最近读了维克托 迈尔 舍恩伯格的 大数据时代 觉得有不少收获 让我这个大数据的小白第一次理解了大数据 作者是大数据的元老级先驱 放一张帅照 膜拜下 不过这本书我本人不推荐从头读一遍 因为书中的核心理念并不是特别多 可以看看我这篇博客 1 海
  • idea中git的简单使用及git分支

    这篇文章简单介绍了git 着重介绍了分支概念和idea中git的简单使用 提问题 git是啥 git的分支概念 idea中git的使用 git仓库 git命令 git安装 参考文章 git是个啥 分布式版本管理工具 git的前生今世 git
  • Solidity:源文件结构

    Solidity 源文件结构 SPDX License Identifier 如果源代码可用 则可以更好地建立对智能合约的信任 由于提供源代码总是涉及版权方面的法律问题 Solidity编译器鼓励使用机器可读的SPDX License Id
  • Synchronized详解

    目录 一 如何解决线程并发安全问题 二 synchronized原理详解 1 加锁的方式 2 synchronized底层原理 3 Monitor监视器锁 MonitorEnter指令获取monitor所有权过程 MonitorExit指令
  • java.lang.StackOverflowError: null(栈内存溢出)递归导致

    通常是递归导致 或者死循环 在方法里调用了自己 导致无限调用 很快就会报错StackOverflowError 例如 有些初学者会犯如下错误 这是service类 public void saveEntity Emp emp this sa
  • vue拖拽

    1 定义拖拽指令 2 使用 3 效果 4 完整代码
  • Spring Boot入门编写简单java代码

    这里我简单编写一个Hello World的代码 文章目录 1 设置访问端口 2 编写项目代码 1 设置访问端口 在yml文件中编写端口为8080 我们启动项目是的路径就是localhost 8080 server port 8080 2 编
  • ‘UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte‘成功解决

    今天在用pandas进行读取时出现了bug 出现这种情况的原因是 文件的编码不是 UTF8 编码的 而pandas读取文件时固定采用 UTF8 解码 解决方法是改为对应的解码方式 解决的方式有两种 第一种 可以查看你对应文件的编码格式 使用
  • 生成对角矩阵 numpy.diag

    给定对角线上元素 我想生成对角矩阵 在网上搜了一下 竟然都是numpy diagonal 这个函数的作用是提取给定矩阵的对角元素 当然不是我想要的 后来发现numpy diag才是生成对角矩阵的函数 所以写此文章记录之 import num
  • 【运维&测试】如何写好测试用例

    一 常用术语 按软件测试手段 黑盒 灰盒 白盒 其中白盒测试是三个当中技术难度最高的 测试方向 功能 性能 安全 测试点划分 兼容性 易用性 UI元素 二 测试用例是什么 是测试工作的核心 是一组在测试时输入输出的标准 是软件需求的具体对照
  • 微服务 tars php,TARS-PHP

    TARS PHP是针对PHP使用tars二进制协议 以及Tars平台整体运维 RPC等一系列能力的解决方案 它主要由如下的几个部分组成 Tars是基于名字服务使用 Tars 协议的高性能 RPC 开发框架 同时配套一体化的服务治理平台 帮助
  • Python调用java代码-两种方法

    使用的模块jpype 一 直接使用java内置函数 from jpype import startJVM 开启java虚拟机 getDefaultJVMPath 自动获取虚拟机路径 startJVM getDefaultJVMPath ea
  • 第六大晶圆代工厂商2021净利润大增593.3%

    3月29日 华虹半导体发布2021全年业绩公告 销售收入创历史新高 达16 31亿美元 较上年度增长69 6 净利润为2 31亿美元 较2020年上升593 3 公告指出 华虹半导体销售收入增长因付运晶圆增加及平均销售价格上涨所致 在原材料
  • 使用Navicat+Premium模型设计表之间关系图(1:n;n:n)

    一 设计E R图之间关系 1 打开Navicat Premium软件 开始设计表 2 设计表之间的关系 操作步骤 选中关系图标 将某张表的一个字段拖动到另外一张表的字段 设计表之间的关系 4 导出成png 5 保存模型 使用Navicat逆
  • winform 开发用什么框架_为什么自动化测试框架中优先用 Pytest而不是 Robot Framework?...

    Python 自动化测试框架 的优缺点对比 之前曾提问请教过 Pytest 和 Robot Framework 的优缺点对比 由于网上关于这方面的信息比较少 收到大家的反馈建议 十分感谢 现在是该总结一下了 欢迎大家一起交流探讨 在对比框架
  • javaparser_JavaParser生成,分析和修改Java代码

    javaparser 作为开发人员 我们经常鄙视手动进行重复工作的人员 我们认为 他们应该实现这一目标 尽管如此 我们还是进行与编码有关的所有活动 当然 我们使用的高级IDE可以为我们执行一些重构 但这基本上就结束了 我们不品尝我们自己的药
  • [R语言] ggplot2入门笔记2—通用教程ggplot2简介

    文章目录 通用教程简介 Introduction To ggplot2 2 ggplot2入门笔记2 通用教程ggplot2简介 1 了解ggplot语法 Understanding the ggplot Syntax 2 如何制作一个简单
  • JS中的for循环讲解

    1 什么时候使用for循环 当我们想要遍历一个数组的值 或者实现一个点击按钮 多个按钮 时需要干的事情等等 这时候我们需要使用for循环实现可以更加的节约代码量 因此 可以简化为一句话 需要一轮一轮的重复去做这件事 可以使用for循环 真实
  • mysql分库分表的原则

    分库分表的种类 分库分表是指把数据库中数据物理地拆分到多个实例或多台机器上 非mysql原生态partitioning partitioning是mysql官方支持 在本地针对表的分区进行操作 它 可以将一张表的数据分别存储为多个文件 如果