mysql分库分表,包含概念+具体实操,很细节~

2024-08-22 15:28

本文主要是介绍mysql分库分表,包含概念+具体实操,很细节~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    大家好,我是程序媛雪儿,今天咱们唠唠mysql分库分表。

是什么

    

    ​mysql分库分表主要是为了应对数据量或访问量过大而导致单个数据库或单个表的性能瓶颈而采取的一种数据库架构设计。通过将数据分布到多个数据库或表中,能有效地提升数据库的性能,提高并发处理能力,减少单点故障的风险。

    上面这个解释是文邹邹的官方解释,其实总的来看,这个概念有以下几个点

1、为了解决什么问题

2、采用了什么方法来解决这个问题

3、能达到什么效果

好了,我们带着这三个问题继续深入了解这个知识点。

分库分表时机(为了解决什么问题)

1、前提:项目业务数据逐渐增多,业务发展比较迅猛,单表的数据量达到1000w或20g以后

2、优化已解决不了性能问题(主从读写分离,查询索引都处理了不管用)

3、IO瓶颈、CPU瓶颈

拆分策略(用什么办法解决这个问题)

垂直分库

    ​根据业务将不同的表拆分到不同的库中,如上图,一个电商系统一般包括多个模块,比如用户模块、订单模块、商品模块等等,垂直分库就是把这几个模块拆到不同的数据库里

特点:

1、按业务对数据分级管理、维护、监控、扩展

2、在高并发下,提高磁盘IO和数据量连接数

垂直分表

    ​如上图:一个商品信息表里,包含商品id、商品名称、商品分类、商品品牌、商品标题、商品描述,一般来说,我们看商品的时候,只有商品id、商品名称、商品分类、商品品牌、商品标题这几个数据是常看的,我们可以把它称为热数据,但是只有点击详情,才会看商品描述,那么商品描述便是冷数据,我们可以采用垂直分表,把冷热数据拆分

拆分规则:冷热拆分

1、把不常用的字段单独放到一张表里

2、把text、blob等大字段拆出来放到附表中

特点

1、冷热数据分离

2、减少IO过度争抢,两表互不影响

因为把大字段,且不经常查询的数据分离出来,每次IO都是热数据,冷数据不显示,可以提高性能

水平分库

    ​如上图,我们要把商品订单的数据做水平分库,也就是将一个库的数据拆分到多个库中。

应用怎么知道自己查的数据从哪个库中找呢?

根据路由规则确定

方案一:根据id节点取模,id%3==0的放0库,id%3==1的放1库,id%3==2的放2库

方案二:范围路由,前100w条数据放0库 ,100w-200w的数据放1库,依此类推

特点:

1、解决了单库大数据,高并发的瓶颈问题

2、提高了系统的稳定性和可用性

水平分表

    ​将一个表的数据拆分到多个表中(这个看起来和水平分库很像对不对?水平分表和水平分库最大的不同是水平分表分出来的表格可以在同一个库里,而水平分库一定是在不同的数据库里的)

特点:

1、优化单一表数据量过大产生的性能问题

2、避免IO争抢并减少锁表的几率

分库分表的新问题

1、分布式事务一致性问题

2、跨节点关联查询

3、跨节点分页、排序函数

4、主键避重

分库分表的中间件

1、sharding-sphere

    这个中间件我是使用过的,很简单,基本操作是maven引入中间件,直接在application.yml配置就可以使用了。

导包

        <!-- 实现分库分表--><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.0</version></dependency>

application.yml配置

  # 分库分表配置shardingsphere:# 数据源配置datasource:# 多数据源以逗号隔开即可names: yudadayudada:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://xx.xx.xx.xx:xx/xxusername: rootpassword: xxxx# 规则配置rules:sharding:# 分片算法配置sharding-algorithms:# 自定义分片规则名answer-table-inline:type: INLINEprops:algorithm-expression: user_answer_$->{appId % 2}tables:user_answer:actual-data-nodes: yudada.user_answer_$->{0..1}# 分表策略table-strategy:standard:sharding-column: appIdsharding-algorithm-name: answer-table-inline

测试demo

@SpringBootTest
public class UserAnswerShardingTest {@Resourceprivate UserAnswerService userAnswerService;@Testpublic void test(){UserAnswer userAnswer1 = new UserAnswer();// 我们设置的是根据AppId分表的userAnswer1.setAppId(1L);userAnswer1.setUserId(1809119229891362817L);userAnswer1.setChoices("1");userAnswerService.save(userAnswer1);UserAnswer userAnswer2 = new UserAnswer();userAnswer2.setAppId(2L);userAnswer2.setUserId(1809119229891362817L);userAnswer2.setChoices("2");userAnswerService.save(userAnswer2);UserAnswer userAnswerServiceOne = userAnswerService.getOne(Wrappers.lambdaQuery(UserAnswer.class).eq(UserAnswer::getAppId, 1L));System.out.println(JSONUtil.toJsonStr(userAnswerServiceOne));UserAnswer userAnswerServiceTwo = userAnswerService.getOne(Wrappers.lambdaQuery(UserAnswer.class).eq(UserAnswer::getAppId, 2L));System.out.println(JSONUtil.toJsonStr(userAnswerServiceTwo));}

可以看出来使用是无痕的,代码中的写法不变

2、mycat

    欢迎大家关注我的微信公众号,程序媛雪儿,雪儿会在上面发布编程的知识碎片,也有雪儿博客地址,上面有详细系统的笔记,雪儿是全栈,但是公众号目前主要还是发后端的技术,以后可能也会涉及到一些前端的知识,我们下期见,拜拜~

这篇关于mysql分库分表,包含概念+具体实操,很细节~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096657

相关文章

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引