分库分表最全详解(图文全面总结)

请添加图片描述

分库分表

分库分表是数据库设计、和管理中的一种策略,主要解决随着数据量、和并发访问量的增加而带来的性能、和扩展性问题。

分库分表,主要就是两种常用手段:“分库”、和“分表”。

如下图所示:
请添加图片描述
分库(Database Sharding): 将数据按照某种规则,分散到多个独立的数据库中,每个数据库称为一个“分库”。

分表(Table Sharding): 将一个大表的数据按照某种规则,分散到多个小表中,每个小表称为一个“分片”、或“分表”。

为什么要分库分表
在系统不断发展、数据量急剧增加的情况下,传统的数据库架构往往难以应对性能和扩展性的问题。

特别是当单表的数据量达到千万、甚至亿级别时,即使使用了索引,查询性能也会受到影响。
请添加图片描述
为了解决这一问题,分库分表是一种有效的策略。

分库分表通过将数据,按照某种策略分配到多个数据库节点、或表中,提高了查询和写入性能,从而,增强系统的可扩展性和容错能力。

分库分表实现
通过用数据库分库分表中间件,比如:ShardingSphere、MyCat…等,开发者可以方便地实现:分库分表。

分库分表旨在,通过将大表、或大数据库的数据,切分为多个较小的部分,从而提升性能。

如下图所示:
请添加图片描述
核心步骤,如下:

第一步:首先分析数据

确定分库分表的必要性,比如:分析当前数据库的性能瓶颈,确定是否需要进行分库分表。

以及,评估数据量的增长趋势、和未来的扩展需求。

第二部:确定拆分类型

然后,根据业务特点,选择合适的分片策略(如:哈希分片、范围分片、列表分片…等)。

哈希分片(Hash Sharding)

根据某个字段(如用户ID),进行哈希运算,将数据均匀分布到不同的分片中。

适用于:需要均匀分布数据,且无法预知数据分布特点的场景。

范围分片(Range Sharding)

根据某个字段的值范围进行分片,例如按时间范围(比如:年、月、日)、或按数值范围进行分片。

适用于:数据有明显的范围划分的场景。

列表分片(List Sharding)

根据字段的具体值进行分片,例如:按地区、类别等。

适用于:数据有明确分类的场景。

组合分片(Composite Sharding)

结合多种分片策略,例如:先按地域分片,再按用户ID哈希分片。
第三步:实现数据拆分

采用数据库分库分表中间件,如ShardingSphere…等,简化分库分表的实现。

ShardingSphere 是一个分布式数据库中间件解决方案,支持:分库分表、读写分离、和数据治理…等方案。

假设有一个电子商务系统,包括:用户信息表(users)和订单信息表(orders),我们希望将用户信息表和订单信息表分别存储在两个不同的数据库中。

如下所示:
请添加图片描述
可以通过ShardingSphere的配置文件定义数据源和实际数据节点,实现表的垂直拆分:

schemaName: ecommerce

dataSources:
  user_db:
    url: jdbc:mysql://localhost:3306/user_db
    username: root
    password: password
  order_db:
    url: jdbc:mysql://localhost:3306/order_db
    username: root
    password: password

shardingRule:
  tables:
    users:
      actualDataNodes: user_db.users
    orders:
      actualDataNodes: order_db.orders

然后,在应用层通过 ShardingSphere 提供的 DataSource 连接不同的数据库,进行数据操作。


// 加载垂直拆分配置文件
        DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(new File("vertical-sharding.yml"));

        // 查询用户信息
        String userSql = "SELECT * FROM users WHERE user_id = ?";
        try (Connection conn = dataSource.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(userSql)) {
            pstmt.setLong(1, 1L);
            try (ResultSet rs = pstmt.executeQuery()) {
                while (rs.next()) {
                    System.out.println("User ID: " + rs.getLong("user_id") + ", Username: " + rs.getString("username"));
                }
            }
        }

这里需要注意,以下几点:

数据均匀分布:确保分片策略能够均匀分布数据,避免出现单个分片过热的情况。

事务处理:处理跨分片事务的一致性问题,可以采用分布式事务管理器(如:Seata)。

分布式ID生成:确保全局唯一ID,可以采用Snowflake算法…等分布式ID生成方案。

总之,通过合理的分片策略、和中间件配置,可以显著提升系统的性能、和扩展性。

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

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

相关文章

牛客NC67 汉诺塔问题【中等 递归 Java/Go/PHP/C++】 lintcode 169 · 汉诺塔

题目 题目链接: https://www.nowcoder.com/practice/7d6cab7d435048c4b05251bf44e9f185 https://www.lintcode.com/problem/169/ 思路 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C…

discuzX2.5的使用心得 札记一

从开始接受php论坛的开发任务,对php感兴趣的我开始迷恋上discuz这个产品了, 像戴志康这样的创新人才,是我们这代人的骄傲和学习的榜样 应该是了解一下,啥事discuzX2.5,百度看一下 discuz x2.5_百度百科 看完百度词条…

国密协议网关与IPSec VPN技术:保障数据安全传输的新途径

国密协议网关IPSec VPN隧道技术是一种结合了国家密码管理局(简称国密)的加密算法和IPSec VPN隧道技术的安全通信解决方案。 IPSec(Internet Protocol Security)是互联网协议安全的一种标准,用于保护网络通信的安全性和…

linux系统常用压缩和解压命令

文章目录 Ubuntu 系统中的文件压缩与解压指南一、常用的压缩和解压工具二、tar 工具三、gzip 工具四、bzip2 工具五、zip 和 unzip 工具六、7z 工具乱码批量解压脚本七、总结 Ubuntu 系统中的文件压缩与解压指南 在 Ubuntu 系统中,文件压缩与解压是日常操作中非常常…

vue脚手架与创建vue项目

一、前言 vue脚手架的安装与创建vue项目需要先行安装配置node与npm,详情可以看node、npm的下载、安装、配置_node 下载安装-CSDN博客 二、vue脚手架的使用 1、vue与vue脚手架的版本 Vue脚手架(Vue CLI)是Vue.js官方提供的一个命令行工具&…

四大策略,五大优势!麒麟信安云助力用户实现VMware替换无忧

2023 年 12 ⽉ 11 ⽇,VMware 正式官宣“所有 VMware by Broadcom 解决⽅案向订阅许可证的过渡,并停⽌销售永久许可证、永久产品的⽀持和订阅(SnS)续订以及混合购买计划/订阅购买计划积分(HPP/SPP)”。 202…

2024年电子、电气与信息科学国际会议(EEIS 2024)

2024年电子、电气与信息科学国际会议(EEIS 2024) 2024 International Conference on Electronics, Electrical and Information Science 【重要信息】 大会地点:昆明 大会官网:http://www.iceeis.com 投稿邮箱:iceeis…

vue数字翻盘,翻转效果

实现数字翻转的效果上面为出来的样子 下面为代码&#xff0c;使用的时候直接引入&#xff0c;还有就是把图片的路径自己换成自己或者先用颜色替代&#xff0c;传入num和numlength即可 <template><div v-for"(item, index) in processedNums" :key"in…

mysql-索引、存储引擎、事务、锁机制和优化

1. MySQL的索引 1.1 概述 索引是通过某种算法&#xff0c;构建出一个数据模型&#xff0c;用于快速找出在某个列中有以特定值的行&#xff0c;不使用索引&#xff0c;MySQL必须从一条记录开始读完整个表&#xff0c;直到找出相关的行&#xff0c;表越大查询数据所花的时间越多…

vue3 使用vant

使用前提&#xff1a; vite创建的vue3项目 vanthttps://vant-ui.github.io/vant/#/zh-CN/home npm i vant 引入样式&#xff1a; main.js import vant/lib/index.css vant封装 import { showLoadingToast,closeToast,showDialog,showConfirmDialog } from vant;export func…

OWASP top10--SQL注入(三、手工注入)

目录 access数据库 手工注入过程&#xff1a; 猜解数据库表名 猜解数据库表名里面的字段 猜解字段内容 SQL注入中的高级查询 mssql数据库 手工注入过程&#xff1a; sa权限 ​编辑dbowner权限 public权限 mysql数据库 1、对服务器文件进行读写操作(前提条件) 需要知…

安全阀检测要求标准:如何提高检测效率与准确性?

安全阀&#xff0c;作为承压设备的重要保护元件&#xff0c;其性能的稳定性和可靠性直接关系到设备的运行安全。 因此&#xff0c;对安全阀进行定期、规范的检测显得尤为重要。接下来&#xff0c;佰德将围绕安全阀的检测要求标准&#xff0c;从检测前准备工作到检测报告与记录…

第十二周 5.21面向对象的三大特性(封装、继承、多态)(二)

三、多态 1.理解: (1)多态:父类型的引用存储不同子类型的对象 父类类名 引用名 new 子类类名(); 引用 对象 父类型 子类型 …

创新融合,5G+工业操作系统引领未来工厂

为加速企业完成生产制造自动化和经营管理自动化&#xff0c;从而走向未来工厂&#xff0c;蓝卓不断探索supOS工业操作系统与前沿技术的的创新融合&#xff0c;而5G技术为工业操作系统提供了更多元化的赋能手段和想象空间。目前&#xff0c;supOS围绕生产、安全、质检、监控等领…

Python代码:十八、生成数字列表

1、描述 牛牛在牛客网系统录入了一连串数字&#xff0c;数字之间依靠逗号隔开&#xff0c;你能帮助他将这些数字存储在列表中吗&#xff0c;列表元素以int的形式。 输入描述&#xff1a; 输入一行整数&#xff0c;数字之间以空格间隔。 输出描述&#xff1a; 输出这些数字…

LuatOS学习

开发顺序 Lua是脚本语言中运行速度最快的语言 资源占用极低 脚本语言运行方式 脚本语言是从上往下一行一行运行的 变量 coun 123456 a,b,c 1,2,3交换 a,b b,a在测试环境中&#xff0c;用print(a,b)打印 nil类型 未声明的变量就是nil&#xff0c;nil用来表示此变量为空…

adb 启动app并查看启动时间

启动app adb shell am start -n 包名/界面名 获取app的启动时长 adb shell am start -W 包名/界面名 要启动一个app 就需要知道其包名与界面名,提前打开一个程序&#xff0c;然后执行以下程序 C:\Users\i5ba0>adb shell dumpsys window windows | findstr mFocusedAppm…

2024年6月PMP考试考前冲刺攻略

调整心态 考场就像战场一样&#xff0c;不仅是实力的较量&#xff0c;更是心理素质的较量。如果感到过于焦虑&#xff0c;可以通过运动等方式来缓解&#xff0c;也可以多与家人、朋友和老师沟通。只有稳定心态才能发挥出最大的实力&#xff01; 高效学习方法 课本是基础&…

vue+echart :点击趋势图中的某一点或是柱状图,出现弹窗,并传输数据

样式 在趋势图中点击某一个柱状图&#xff0c;出现下面的弹窗 代码实现 主要是在趋势图页面代码中&#xff0c;在初始化趋势图的设置中&#xff0c;添加对趋势图监听的点击方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…

详析河南道路与桥梁乙级资质新办条件

河南道路与桥梁乙级资质新办条件详析如下&#xff1a; 一、企业基本条件 独立企业法人资格&#xff1a; 申请人必须是具有独立企业法人资格的单位。注册资金&#xff1a; 企业的注册资金应不少于100万元人民币。社会信誉&#xff1a; 申请人应具有良好的社会信誉&#xff0c;无…