MYSQL分表分库 详解

目录

一、垂直拆分于水平拆分的区别?

垂直拆分

水平拆分

二、分表分库有哪些策略?

Hash分片策略

枚举分片策略

日期分片策略

范围分片策略(用的较多)

三、分表分库之后,如何查询的呢?

四、分表分库之后,分页如何做?

五、分库分表之后,排序如何做?

六、MyCat与ShardingJDBC比较


一、垂直拆分于水平拆分的区别?

数据库拆分主要有两种方式:垂直拆分和水平拆分。

垂直拆分

按业务进行拆分,将不同业务功能相关的表放到不同的数据库中,也就是类似于微服务架构的积分数据库/订单数据库/支付数据库。

要注意分布式事务问题。

水平拆分

将一张数据量很大的表拆分成n多张不同的子表来进行存放。

当一张表的业务量行数超过500万行或者单表容量超过2GB,可以对同一张表数据实现拆分放到多个不同的表中存放(阿里巴巴开发手册推荐)。

二、分表分库有哪些策略?

(1)日期

(2)Hash

(3)范围

(4)枚举

Hash分片策略

如何分表?

数据插入时:

1、定义一个全局ID,根据该全局ID采用分片算法,计算该条数据应该落地存放到具体哪张表。

2、该全局ID特点:有序且递增,推荐序列。

ID值%表数量

比如:我们t_user分表的数量是3

        1%3 = 1  最后落到表t_user1

        2%3 = 2  最后落到表t_user2

        ...

如何查询呢?

比如我们一开始是按照ID去分表的,那我在查询的时候,select * from user where id = 2; 这条语句会被数据库中间件拦截并解析这条SQL语句,将id%3进行计算,最后落到对应的表上。

优点:将数据可以分摊的形式存放,均匀的形式存放。

缺点:Hash分片策略有个很大的缺点就是无法支持新增表的扩容。比如你之前分了3张表,现在增加两张,那以前3%3的时候结果是0,查询t_user0表,现在3%5,结果肯定不一样了。

枚举分片策略

比如我们根据省份分表,黑龙江省一张表、辽宁省一张表、吉林省一张表。

那么我们查询的时候,就要带上省份条件,如:select * from user where province = '黑龙江省' limit 0,2;

优点:好扩容。

缺点:数据分布不够均匀。

日期分片策略

比如我们2024年1月一张表,2024年2月一张表...以此类推。

优点:可以无限扩容。

缺点:有淡季有旺季,比如双11时,表的数据量会猛增,导致存放数据不均匀。

范围分片策略(用的较多)

假设一张表存放的数据 500 万。
以每张 500 万条数据的形式来进行分表。
t_user0表 0-500 万条数据。
t_user1表 500-1000 万条数据。
t_user2表 1000 1500 万条数据。

优点:这种方式的优点是可以无限扩容表,比如我插入更多的数据,直接再加一张t_user3表去存储1500 - 2000万的数据。

查询的时候也很简单,直接id值/500万,结果再进行向上取整即可。

缺点:数据分布不够均匀。

三、分表分库之后,如何查询的呢?

首先注意的是,查询语句需要带上分片的字段,也就是说,你当初用哪个字段分的片,现在就得带上那个字段去查询。

如果你当初用ID字段分片分表,我使用select * from user where name = 'CLAY';查询时,数据库中间件就会查询所有的表,现在查询t_user0,逐条查询,查询完再查t_user1,以此类推。

四、分表分库之后,分页如何做?

如果带上分片字段查询,很好想不用多说。

如果不带上分片字段查询,比如select * from user where address = '黑龙江省哈尔滨市' limit 0,2;

那么数据库中间件就会去每张表(t_user0、t_user1、t_user2)查询出符合条件的两条记录,总共就是6条,然后再选出两条记录返回。

五、分库分表之后,排序如何做?

会依次查询所有表,比如select * from user where age > 18 order by age desc;

(1)查询t_user0表,先按age排序,然后取出大于18岁的人,假如取出3条。

(2)查询t_user1表,先按age排序,然后取出大于18岁的人,假如取出2条。

(3)查询t_user2表,先按age排序,然后取出大于18岁的人,假如取出5条。

(4)数据库中间件会将这些数据合并成一个结果集,成为10条。

(5)然后再将这10条进行二次排序。

六、MyCat与ShardingJDBC比较

Mycat 是基于服务器端实现代理,需要单独部署,有独立的IP端口号,所以较安全,但效率差点,因为是走网络通讯的,SpringBoot项目走到MyCat需要网络进行通讯。
Shardingjdbc 是基于客户端改写 sql 语句代理,效率较高。

相对于来说 Shardingjdbc 效率比 Mycat 高。
Mycat 比 Shardingjdbc 更加安全。

如果数据量较大,还是建议使用MyCat,如果使用ShardingJDBC很容易内存溢出,影响到我们SpringBoot项目,因为这俩没有解耦。但MyCat挂了,至少不会影响我们的SpringBoot项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RHEL】Vivado调用VCS+Verdi联合仿真报错解决

问题描述 在使用VCS Verdi仿真Vivado工程时,点击行为仿真按钮进度条窗口消失后,Verdi窗口并未出现,查看消息报错如下: vcs: line 34205: 119837 Segmentation fault (core dumped) ${TOOL_HOME}/bin/cfs_ident_exec -f ${X…

网络安全已死,趁早转行?

近年来,曾经被寄予厚望的网络安全行业似乎正逐渐失去昔日的辉煌。曾经一度备受瞩目的网络安全专业,如今却面临着降薪、裁员的困境。许多公司对网络安全的重视程度不高,网络安全岗位成了背锅的代名词。在这样的环境下,有人开始质疑…

智能小车项目(七)通过PID实现给定和实际速度值计算PWM输出

我们先看大脑(上位机nano) keybord_ctrl节点发布’cmd_vel’消息消息类型为Twist队列大小为1 pub rospy.Publisher(cmd_vel, Twist, queue_size1)if not stop: pub.publish(twist)driver_node订阅这个消息 当有消息时cmd_vel_callback回掉函数处理消息…

感染嗜肺军团菌是什么感觉?

记录一下最近生病的一次经历吧,可能加我好友的朋友注意到了,前几天我发了个圈,有热心的朋友还专门私信了我说明了他自己的情况和治疗经验,感谢他们。 ​ 那么关于这次生病的经历,给大家分享一下。 首先,这次…

【Linux】网络版计算器代码

网络应用层协议的demo 运输层基于TCP protocol.hpp #pragma once#include <iostream> #include <cstring> #include <string> #include <sys/types.h> #include <sys/socket.h> #include <jsoncpp/json/json.h>#define SEP " "…

redis夯实之路-持久化之RDB与AOF详解

数据库 初始化服务器时会根据redisServer的dbnum属性来决定创建多少个数据库&#xff0c;默认为16 使用select切换数据库 客服端状态redisClient结构的db属性记录了当前的目标数据库 RedisDb结构的dict字典保存了数据库的所有键值对&#xff0c;这个字典被称为键空间。 cru…

C++I/O流——(2)预定义格式的输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

【MySQL】MySQL表的约束-空属性/默认值/列属性/zerofill/主键/自增长/唯一键/外键

文章目录 表的约束1.空属性 --null && not null2.默认值 -- default3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 表的约束 表的约束&#xff1a;表中一定要有各种约束&#xff0c;通过约束&#xff0c;让我们未来插入数据库表中的数据是符合预期的。约束的本质是…

桶排序(Java语言)

视频讲解地址&#xff1a;【手把手带你写十大排序】8.桶排序&#xff08;Java语言&#xff09;_哔哩哔哩_bilibili 代码&#xff1a; public class BucketSort {public void sortFunction(int[] array, int bucketNum) {int max Integer.MIN_VALUE, min Integer.MAX_VALUE;…

【QT】多层QTreeWidget与QStackedWidget的关联操作

通过点击多层QTreeWidget来控制QStackedWidget中的page页面切换 treeWidget设计 treeWidget设计&#xff1a; // treeWidget设计ui->treeWidget->clear();ui->treeWidget->setColumnCount(1);//第一层QStringList l;l<<"管理系统";QTreeWid…

JavaWeb-HTTP

一、概念 HTTP&#xff1a;HyperText Transfer Protocol&#xff0c;超文本传输协议。读者应该不是第一次接触这个名词&#xff0c;但可能仍然不是很理解&#xff0c;笔者将逐一解释。 HyperText&#xff08;超文本&#xff09;&#xff1a;根据维基百科&#xff0c;Hypertex…

Linux数据处理的几个命令

文章目录 Linux数据处理的几个命令文件内容搜索利器 - grep语法默认无参数增加文件夹反向查找不区分大小写显示行数&#xff0c;精准定位 没有规矩不成方圆 sort语法默认无参数根据第N列排序检查是否已经排序逆序排列 你是唯一的 uniq语法默认无参数统计出现频次仅仅显示重复的…

Go语言的调度器

简介 Go语言的调度器是一个非常强大的工具&#xff0c;它可以帮助我们轻松地实现并发编程。调度器的工作原理是将多个协程映射到多个操作系统线程上&#xff0c;并根据协程的状态来决定哪个协程应该在哪个线程上运行。 调度器有两种主要策略&#xff1a; 协作式调度&#xf…

入门Linux简单操作

基本命令 scp ✓ scp -r 文件 127.0.0.1&#xff1a;/root/文件 (source->>>>destination) mv cp ✓ cp xxxx ./xxxx date ✓ 修改时间 date -s “yyyy-MM-dd 12:12:59” find ✓ find /home/user -name “*.txt” grep ✓ 管道 软连接 多用户 免密设置 脚…

iPhone“查找”最多可添加32个物品!

对于那些丢三落四的果粉来说&#xff0c;苹果的“查找”功能是一大福音。不管是丢失了iPhone、iPad、Mac、AirPods还是AirTag&#xff0c;都可以通过“查找”功能在地图上追踪设备的位置&#xff0c;甚至是远程锁定或抹掉设备的数据。 那么&#xff0c;iPhone的查找一次能支持添…

LeetCode 38 外观数列

题目描述 外观数列 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) "1…

软件测试|解决Github port 443 : Timed out连接超时的问题

前言 GitHub是全球最大的开源代码托管平台之一&#xff0c;许多开发者和团队使用它来管理和协作开源项目。但在当下&#xff0c;我们在clone或者提交代码时会经常遇到"GitHub Port 443: Timed Out"错误&#xff0c;这意味着我们的电脑无法建立与GitHub服务器的安全连…

学习python仅此一篇就够了(函数进阶:lambda函数)

函数进阶 函数的多返回值 def ceshi1():return 1, 2x, y ceshi1() print(x) #1 print(y) #2 函数的多种传参方式 1.位置参数&#xff1a;调用函数时根据函数定义的参数位置来传递参数 def ceshi1(name,age):print(f"你的姓名是{name},你的年龄是{age}")ceshi1(…

xtu oj 1522 格子

题目描述 一个nm的网格&#xff0c;格子里最多能放一枚棋子&#xff0c;将k枚棋子随机放入不同的网格中&#xff0c;使得同行同列最多只有一枚棋子&#xff0c;请问概率是多少&#xff1f; 输入格式 第一行是一个整数T (1≤T≤512)&#xff0c;表示样例的个数。 以后每行一…

UniRepLKNet实战:使用UniRepLKNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集一些问题 摘要 大核卷积神经网络&#xff08;ConvNets&#xff09;近年来受到广泛关注&#xff0c;但仍存在两个关键问题需要进一步研究。首先&#xff0c;目前的大型卷积神经网络架构大…