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

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu