当前位置: 首页 > news >正文

分库分表理论总结

一、概述

分库分表是在面对高并发、海量数量时常见的数据库层面的解决方案。通过把数据分散到不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。比如:将电商数据库拆分为若干独立的数据库,并且对于大表来说也拆分为若干小表,通过这种数据库拆分的方法来解决数据库的性能问题。

数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。

分库分表,顾名思义可以从两个角度来实现,一个是对数据库进行拆分,另一个是对表进行拆分。

二、分库

分库主要是解决高并发的瓶颈问题,由于和数据库实例建立连接会消耗资源,所以不可能无限的分配连接资源,当对数据库的访问的QPS比较高时,就会对数据库实例造成很大的压力,并同时降低数据查询效率 。MySQL 中,可以使用 max_connections 查看默认的最大连接数,当访问连接数过多时,就会导致连接失败,此时将对一个数据库实例的操作拆分成对多个数据库实例的操作能有效降低这种压力。

那如何进行分库呢?在微服务架构中,通常会按照业务对数据库进行拆分,将业务关联度低的表划分到不同的数据库中,关联度高的表划分到相同的数据库中,这一般和微服务实践的服务拆分同时进行。

三、分表

分表操作主要是为了解决数据量大的问题,但一张表中数据量过大,对该表的读写操作都会效率低下,这种情况可以对单表进行拆分操作。

通常意义上,单表行数超过 500 万行或者单表容量超过 2GB之后,才需要考虑做分库分表了。常见的拆分模式分为水平拆分和垂直拆分。

1.水平拆分

水平拆分是将原始表按照一定的规则或策略分为多张子表,每张子表的字段数量没有变化,但是总记录数降低了,这样能够提高读写的效率。

img

优点:

  • 不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力
  • 应用端改造较小,不需要拆分业务模块

缺点:

  • 跨分片的事务一致性难以保证
  • 跨库的join关联查询性能较差
  • 数据多次扩展难度和维护量极大

一般水平拆分的策略包括:Hash取模拆分、按时间范围拆分、按空间范围拆分等。

2.垂直拆分

垂直拆分是将原始表的字段拆分成几组,分别用不同的子表来保存,适合单表中字段已经非常多的情况,相较于水平拆分,垂直拆分的记录数量不会变,但单表的字段减少。在对字段进行垂直拆分的时候,需要区分哪些字段是热点字段?哪些字段是不常访问字段?对于热点字段可以单独拆分成一张表单独访问。

img优点:

  • 解决业务系统层面的耦合,业务清晰
  • 与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等
  • 高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈
  • 提升读写的效率,并能够降低死锁的概率。

缺点:

  • 部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度
  • 分布式事务处理复杂
  • 依然存在单表数据量过大的问题(需要水平切分)

在实际运用中,一般先考虑垂直拆分再考虑水平拆分,原因是水平拆分是将完整的记录被拆分到多表,需要解决多表关联查询等问题,而垂直拆分由于单表记录保存完整,只需要通过外键就能关联到子表,相对而言引入的问题更少。

Mysql本身也实现了分片存储的方案,将一张表分成N多个小表,分片是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

四、常见问题

1.数据倾斜

通过Hash取模的方法解决数据倾斜的问题,对分片键进行Hash取模操作后再入库操作。

在使用Hash取模的方式对数据进行分片,当子表数量扩容后,所有老的数据再通过Hash取模可能都无法命中存储的子表,这种情况可以通过一致性Hash算法来解决。

一致性哈希可以按照常用的hash算法来将对应的key哈希到一个具有2^32次方个节点的空间中,形成成一个顺时针首尾相接的闭合的环形。所以当添加一台新的数据库服务器时,只有增加服务器的位置和逆时针方向第一台服务器之间的键会受影响。

img

2.跨节点多表关联查询

切分之前,系统中很多列表和详情页所需的数据可以通过sql join来完成。而切分之后,数据可能分布在不同的节点上,此时join带来的问题就比较麻烦了,考虑到性能,尽量避免使用join查询。

全局关联表

常见的思路是在每个节点上都维护一个单独的全局关联表,保存需要查询的多表关联关系。

冗余字段

另一种思路是维护冗余字段,用来关联其他表的主键信息。这是一种用空间换时间的思路。

3.跨节点分组和排序

对于跨节点的分组和排序操作,由于数据记录可能分散在不同的节点,一般是先读到内存中,再进行分组和排序操作。

4.分布式事务

参考《分布式事务》一文

5.分布式ID

参考《分布式ID》一文

五、总结

  1. 优先考虑对表中索引和SQL进行优化,再考虑通过分库分表来进行优化,原因是分库分表对架构变更过大,并且对业务的侵入性过高,并且会引入很多的衍生问题。

  2. 一般的分库分表实践步骤:根据容量(当前容量和增长量)评估分库或分表个数 -> 选key(均匀)-> 分表规则(hash或range等)-> 执行(一般双写)-> 扩容问题(尽量减少数据的移动)。


参考资料

  1. 再有人问你什么是分库分表,直接把这篇文章发给他:https://www.51cto.com/article/709614.html

  2. 大众点评订单系统分库分表实践:https://tech.meituan.com/2016/11/18/dianping-order-db-sharding.html

  3. MySQL分库分表方案:https://zhuanlan.zhihu.com/p/84224499

  4. 互联网公司常用MySQL分库分表方案汇总:https://cloud.tencent.com/developer/article/1713512

  5. 好好的系统,为什么要分库分表?:https://www.cnblogs.com/chengxy-nds/p/16924305.html

  6. 实战彻底搞清分库分表(垂直分库,垂直分表,水平分库,水平分表):https://cloud.tencent.com/developer/article/1819045

相关文章:

分库分表理论总结

一、概述 分库分表是在面对高并发、海量数量时常见的数据库层面的解决方案。通过把数据分散到不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。比如:将电商数据库拆分为若干独立的数据…...

RK3568平台开发系列讲解(外设篇)AP3216C 三合一环境传感器驱动

🚀返回专栏总目录 文章目录 一、AP3216C 简介二、AP3216C驱动程序2.1、设备树修改2.2、驱动程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在本篇将介绍AP3216C 三合一环境传感器的驱动。 一、AP3216C 简介 AP3216C 是由敦南科技推出的一款传感器,其支持环境光…...

ES 关于 remote_cluster 的一记小坑

最近有小伙伴找到我们说 Kibana 上添加不了 Remote Cluster,填完信息点 Save 直接跳回原界面了。具体页面,就和没添加前一样。 我们和小伙伴虽然隔着网线但还是进行了深入、详细的交流,梳理出来了如下信息: 两个集群:…...

第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第四节 - Python 中的字符串反转6种不同的方式方法)

Python 字符串库不支持内置的“ reverse() ”,就像其他 python 容器(如 list)所做的那样,因此了解其他反转字符串的方法可能会很有用。本文讨论了在Python中实现它的几种方法。 目录 Python 中使用循环反转字符串 在Python中使用递归反转字符串...

el-date-picker增加默认值 修改样式

预期效果 默认是这样的 但希望是直接有一个默认的当天日期,并且字体颜色啥的样式也要修改(在这里假设今天是2023/10/6 功能实现 踩了坑挺多坑的,特此记录 官方文档 按照官方的说明,给v-model绑定一个字符串就可以了 在j…...

Hive中生成自增序列的常用方法

在日常业务开发过程中,通常遇到需要hive数据表中生成一列唯一ID,当然连续递增的更好。 最近在结算业务中,需要在hive表中生成一列连续且唯一的账单ID,于是就了解生成唯一ID的方法 1. 利用row_number函数 语法:row_n…...

4.MySql安装配置(更新版)

MySql安装配置 无论计算机是否有安装其他mysql,都不要卸载。 只要确定大版本是8即可,8.0.33 8.0.34 差别不大即可。 MySql下载安装适合电脑配置属性有关,一次性安装成功当然是非常好的,因为卸载步骤是非常麻烦的 如果第一次安装…...

使用opencv及FFmpeg编辑视频

使用opencv及FFmpeg编辑视频 1.融合两个视频2.为视频添加声音2.1 安装ffmpy Python包2.2 下载ffmpeg2.3 代码实现 3.效果参考文献 帮朋友做了一个小作业,具体实现分为几个过程: 将两个mp4格式视频融合到一起为新视频添加声音 1.融合两个视频 其中一个…...

Python3 Selenium4 chromedriver Pycharm闪退的问题

Python3版本:3.11.5 Pycharm版本:2023.2.1 Chrome版本:117.0.5938.150(正式版本) 在使用最新版的Selenium4版本时,chromedriver可以驱动Chrome但是闪退,Selenium目前最新版本是4.13.0&#…...

019 基于Spring Boot的教务管理系统、学生管理系统、课表查询系统

基于Spring Boot的教务管理系统、学生管理系统、课表查询系统 一、系统介绍 本作品主要实现了一个课表查询系统,采用了SSM(Spring SpringMVC MyBatis)的基础架构。 二、使用技术 spring-bootspring-MVCthymeleafmybatis-plusdruidLombo…...

包装类?为什么需要包装类?

包装类是一种用于将基本数据类型(如整数、浮点数、字符等)封装成对象的类。在Java和许多其他编程语言中,基本数据类型是不具备面向对象特性的,它们不是对象,不能进行方法调用或参与泛型化。为了弥补这一不足,Java引入了包装类,允许基本数据类型被当作对象来处理。 Java…...

Java中的TCP通信(网络编程 二)

简介 TCP(传输控制协议)是一种在计算机网络中常用的协议,它提供了可靠的、面向连接的通信(协议信息链接:TCP协议)。在Java中,我们可以使用Socket和ServerSocket类来实现TCP通信。 Java TCP通信…...

[架构之路-232]:目标系统 - 纵向分层 - 操作系统 - 数据存储:文件系统存储方法汇总

目录 前言: 一、文件系统存储方法基本原理和常见应用案例: 二、Windows FAT文件系统 2.1 概述 三、Linux EXT文件系统 3.1 基本原理 3.2 索引节点表(Inode Table) 3.2.1 索引节点表层次结构 3.2.2 间接索引表的大小和表项…...

【立体视觉(五)】之立体匹配与SGM算法

【立体视觉(五)】之立体匹配与SGM算法 一、立体匹配一)基本步骤二)局部立体匹配三)全局立体匹配四)评价标准1. 均方误差(RMS)2. 错误匹配率百分比(PBM) 二、半全局(SGM)立体匹配一)代价计算二&a…...

苹果系统_安装matplotlib__pygame,以pycharm导入模块

为了更便捷、连贯的进行python编程学习,尽量在开始安装python软件时,将编辑器、模块一并安装好,这样能避免以后版本冲突的问题。小白在开始安装pycharm、pip、matplotlib往往会遇到一些问题,文中列示其中部分bug,供大家…...

常用颜色的英文和十六进制

以下颜色都是按照下面格式所写 # size&#xff1a;文字大小&#xff08;1~7&#xff09;&#xff1b;color&#xff1a;文字颜色 <font size5 colorred>红 red #ff0000</font>红 red #ff0000 橙 orange #ffa500 黄 yellow #ffff00 草绿 springgreen #00FF7F 绿…...

计算机网络第二章思考题

1. 调制与编码分别有何作用&#xff1f; 调制&#xff08;Modulation&#xff09;和编码&#xff08;Coding&#xff09;是通信系统中的两个关键概念&#xff0c;它们分别具有不同的作用和功能&#xff1a; 调制&#xff08;Modulation&#xff09;&#xff1a; 作用&#xff…...

Xcode、终端、Mason、nvim.debug环境路径

Xcode&#xff1a; /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include 终端&#xff1a; /Library/Developer/CommandLineTools/usr/include Mason: /Users/donny/.local/share/nvim/mason/packages/clangd/…...

2023华为OD机试真题-2023(A+B卷)【Java、C++、Go、Python】

【华为OD机试真题-2023(A+B卷)【Java、C++、Go、Python】 该专栏博客已帮助千余名同学通过OD机考 2023年5月,华为OD机考更新为OD统一考试(B卷)。B卷的题目包括两部分: 1.2022年老题库 2.2023新增题目 OD统一考试B卷的题目博主也会及时搜集更新! 以下为OD统一考试(B卷…...

[NISACTF 2022]join-us - 报错注入无列名注入

点击登录&#xff0c;找到注入点 这种框&#xff0c;可以直接爆破关键字&#xff0c;看是否拦截&#xff0c;也可以手动尝试&#xff0c;发现、union、and、or、substr、database等关键字都拦截了 1、学到了&#xff1a;可以用数据库中不存在的表名或者不存在的自定义函数名爆…...

Raid10--Raid01介绍

RAID10  先对磁盘做mirror&#xff0c;然后对整个mirror组做条带化&#xff1b;    比如8块盘    需要分成4个基组&#xff0c;每个基组2块盘&#xff1b;    每个基组先做raid1&#xff0c;再做raid0&#xff0c;4条条带化&#xff1b;    所以&#xff1a;   …...

集群服务器

文章目录 项目名:实现集群服务器技术栈通过这项目你学到(或者复习到)实现功能编码环境json环境muduo库boost库MySql数据库登录mysql&#xff1a;查看mysql服务开启了没有&#xff1f;mysql的服务器及开发包库chat&#xff0c;表 allgroup friend groupuser offlinemessage user…...

大数据Doris(五):开始编译 Doris

文章目录 开始编译 Doris 一、下载Doris的安装包 二、解压缩 三、上传配置文件...

Linux软硬链接和动静态库

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 软硬链接和动静态库 前言正文软硬链接原理使用 文件时间动静态库库介绍静态库静态库制作静态库的使用关于静态链接 动态库动态库制作动态库的使用关于动态链接 补充 最…...

Linux shell编程学习笔记6:查看和设置变量的常用命令

上节我们介绍了变量的变量命名规则、变量类型、使用变量时要注意的事项&#xff0c;今天我们学习一下查看和设置变量的一些常用命令&#xff0c;包括变量的提升&#xff0c;有些命令在之前的实例中已经使用过了。 一、 echo &#xff1a;查看变量的值 语法格式&#xff1a;ech…...

leetcode 416.分割等和子集

416. 分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和…...

Java基于SSM+Vue的平时成绩管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

flutter开发实战-webview插件flutter_inappwebview使用

flutter开发实战-webview插件flutter_inappwebview使用 在开发过程中&#xff0c;经常遇到需要使用WebView&#xff0c;Webview需要调用原生的插件来实现。常见的flutter的webview插件是webview_flutter&#xff0c;flutter_inappwebview。之前整理了一下webview_flutter&…...

Selenium 浏览器坐标转桌面坐标

背景&#xff1a; 做图表自动化项目需要做拖拽操作&#xff0c;但是selenium提供的拖拽API无效&#xff0c;因此借用pyautogui实现拖拽&#xff0c;但是pyautogui的拖拽是基于Windows桌面坐标实现的&#xff0c;另外浏览器中的坐标与windows桌面坐标并不是一比一对应的关系&am…...

1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计

项目完整版在&#xff1a; 文章目录 一、channel模块&#xff1a;事件管理Channel类实现二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、代码&#xff08;一&#xff09;框架&#xff08;二…...

wordpress robot 插件/汕头seo网络推广

使用Python进行文件和文件夹的判断 递归 &#xff1a;主要目的就是遍历文件夹和文件对文件夹和文件进行属性判断首先对文件夹进行遍历&#xff0c;看文件夹里有什么样的文件&#xff0c;读取出文件夹中的所有文件 import os path "./data" #路径 files os.listdir(…...

快速搭建网站wordpress/seo网站推广报价

1、将String 转化成 long , 转化成 double String 转化成 long &#xff1a; long i Long.parseLong(String s); 或 long i Long.parseLong(String s, int radix) ; 或 // s -- 这是一个包含长表示要解析的字符串&#xff0c;radix -- 这是基数&#xff0c;解析时要使用…...

广州网站建设推广公司/百度seo排名优化价格

思杰XenServer即将免费 2009年02月23日 19:34 太平洋电脑网虚拟化提供商思杰将在2月23日公布一项消息&#xff0c;将免费提供全部的XenServer虚拟化程序&#xff0c;同时宣布与微软之间在系统管理方面的新合作&#xff0c;思杰将协同微软提供系统管理程序&#xff0c;Citrix E…...

黑龙江建设ting网站/微信客户管理

二叉查找树的遍历方法有多种&#xff0c;递归实现&#xff0c;利用栈实现&#xff0c;线索树实现&#xff0c;这几种遍历方法&#xff0c;其时间复杂度都为O(n)&#xff0c;而空间复杂度递归和栈为O(h)&#xff0c;线索树需要额外的标识位来表明是线索还是节点指针&#xff0c;…...

珠海做网站价格/saas建站平台

从OpenCV2.4.0之后的版本中都包含有一个图像拼接的例程。路径&#xff1a;“...\opencv\sources\samples\cpp\stitcher_detail.cpp” 本文就网上基于图像拼接的例程代码总结一下&#xff0c;基本上都是由此修改而来。以下给出原代&#xff0c;以及一个简单版本的例程。 1.一个…...

沧州手机端网络推广/seo店铺描述例子

基本概念 map中所有元素都是pairpair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实值&#xff09;所有元素都会根据元素的键值自动排序 本质&#xff1a; map/multimap属于关联式容器&#xff0c;底层结…...