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.mfbz.cn/a/317287.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

009集:open( )、write( )、close( )函数读写文件实例—python基础入门实例

一般来说,计算机文件可以分为两类:文本文件和二进制文件。大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常见的文本文件有:大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常用的文本文件格式有ASCII、MIME、*.txt等&#xff0…

【Linux 内核源码分析】进程调度 -CFS 调度器

Linux调度器 Linux内核调度器是负责决定哪个进程在何时执行的组件。它管理着CPU资源的分配和任务的调度,以确保系统资源的合理利用和任务的高效执行。Linux内核中常见的调度器有多种,包括经典的O(1)调度器、CFS(Completely Fair Scheduler&a…

大模型实战笔记04——XTuner 大模型单卡低成本微调实战

大模型实战笔记04——XTuner 大模型单卡低成本微调实战 1、Finetune简介 2、XTuner 3、8GB显存玩转LLM 4、动手实战环节 注: 笔记内容均为截图 课程视频地址:https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source2882acf…

Flink(十二)【容错机制】

前言 最近已经放假了,但是一直在忙一个很重要的自己的一个项目,用 JavaFX 和一个大数据组件联合开发一个功能,也算不枉我学了一次 JavaFX,收获很大,JavaFX 它作为一个 GUI 开发语言,本质还是 Java&#xff…

嵌套的CMake

hehedalinux:~/Linux/multi-v1$ tree . ├── calc │ ├── add.cpp │ ├── CMakeLists.txt │ ├── div.cpp │ ├── mult.cpp │ └── sub.cpp ├── CMakeLists.txt ├── include │ ├── calc.h │ └── sort.h ├── sort │ ├── …

Spring之AOP源码(一)

文章目录 一、动态代理1. 概念2. Cglib动态代理的使用3. JDK动态代理的使用 二、SpringAOP1. 简介2. Spring AOP使用 一、动态代理 1. 概念 动态代理(Dynamic Proxy)是一种在运行时动态生成代理对象的技术。它是一种设计模式,用于在不修改原…

Web实战丨基于django+html+css+js的电子商务网站

文章目录 写在前面实验目标需求分析实验内容安装依赖库1.登陆界面2.注册界面3.电子商城界面4.其他界面 运行结果写在后面 写在前面 本期内容:基于DjangoHTMLCSSJS的电子商务网站 实验环境: vscode或pycharmpython(3.11.4)django 代码下载地址&#x…

Web自动化测试,一定得掌握的 8 个核心知识点

使用 cypress 进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用 javascript 作为编程语言。传统主流的 selenium 框架是支持多语言的,大多数 QA 会的python 和 java 语言都可以编写 selenium 代码,遇到需要编写 js 代…

距离美赛还有20天,不要忘了阅读往年获奖论文(附04-23年美赛获奖论文)

之前发了很多数模相关的知识,受到了一些人的关注,也有很多人私下问我,距离美赛还有20几天了,还来不来得及。 对此我想说, 来不来得及重要吗? 你名都报了,钱也交了,还是笔不小的钱…

猫狗大战(猫狗识别)

1.问题简介 1.1问题描述 在这个问题中,你将面临一个经典的机器学习分类挑战——猫狗大战。你的任务是建立一个分类模型,能够准确地区分图像中是猫还是狗。 1.2预期解决方案 你的目标是通过训练一个机器学习模型,使其在给定一张图像时能够准…

【模块系列】STM32BMP280

前言 最进想练习下I2C的应用,手上好有BMP280也没用过,就看着机翻手册和原版手册,开始嘎嘎写库函数了。库的命名应该还1是比较规范了吧,就是手册对于最终值的计算方式很迷糊,所以现在也不能保证有可靠性啊,大…

关于运维·关于数据库面试题

目录 一、数据库类型 二、数据库引擎 三、mysql数据库类型 四、mysql的约束添加 五、主从复制原理 六、主从方式有几种 七、mysql主从数据不一致的原因 八、mysql的优化 九、什么是事务的特征 十、数据库读写分离的好处 十一、怎样优化sql语句 十二、mysql的同步方…

基于MAP算法的Turbo译码 -- 公式推导

到此为止,讲完了turbo译码器的子译码器基于MAP算法的译码过程。但在实际使用中,很少直接使用MAP算法进行译码。而是使用改进的LOG-MAP和MAX-LOG-MAP算法进行译码,因此译码的整体流程,包括外信息的计算以及先验信息的获取等。都在后…

openai自定义API操作 API (openai.custom)

OpenAI 提供了一个自定义 API,允许开发者通过编程方式与 OpenAI 的 AI 模型进行交互。使用这个 API,你可以执行各种任务,例如文本生成、推理和翻译等。 以下是使用 OpenAI 自定义 API 的基本步骤: 创建 API 密钥:首先…

谷粒商城-商品服务-品牌管理-阿里云云存储+JSR303数字校验+统一异常处理

阿里云云存储OSS 分布式系统上传文件 分布式系统上传文件 单体应用上传:上传文件到服务器,想获取文件时再向服务器发请求获取文件。 分布式系统上传: 因为有多台服务器,为防止负载均衡导致获取文件时没找到对应的服务器&#xf…

数字信号处理教程学习笔记1-第2章时域中的离散信号和系统

信号处理的任务示意方框图 模拟信号和数字信号分别是啥样的,有啥区别

MySQL数据库设计原则

0.简单的处理逻辑 一.MySQL完整性约束 主键约束 primary key 自增键约束 auto_increment 唯一键约束 unique 非空约束 not null 默认值约束 default 外键约束 foreign key 下面是一个sql语句创建一个表,可以看出来了使用了哪几个约束吗? create table user( id int…

vue前端开发自学,借助KeepAlive标签保持组件的存活

vue前端开发自学,借助KeepAlive标签保持组件的存活&#xff01;如果不想让组件在切换的时候&#xff0c;被默认操作&#xff08;卸载掉了&#xff09;。他们需要使用这个这个表情哦。 下面给大家看看代码情况。 <template><h3>ComA</h3><p>{{ messag…

Arduino开发实例-AS608光学指纹传感器驱动

AS608光学指纹传感器驱动 文章目录 AS608光学指纹传感器驱动1、AS608光学指纹传感器介绍2、硬件准备及接线3、代码实现3.1 指纹录入3.2 指纹匹配验证1、AS608光学指纹传感器介绍 AS608 光学指纹传感器可用于扫描指纹,它也可以通过串行通信将处理后的数据发送到微控制器。 所有…

鸿蒙(HarmonyOS)应用开发指南

1. 概述 1.1 简介 鸿蒙&#xff08;即 HarmonyOS &#xff0c;开发代号 Ark&#xff0c;正式名称为华为终端鸿蒙智能设备操作系统软件&#xff09;是华为公司自 2012 年以来开发的一款可支持鸿蒙原生应用和兼容 AOSP 应用的分布式操作系统。该系统利用“分布式”技术将手机、电…