mysql 垂直分表 设计_水平分表和垂直分表

article/2025/10/27 16:50:03

一、数据库瓶颈

不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。

1、IO瓶颈

第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。

第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。

2、CPU瓶颈

第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 ->,建立合适的索引,在业务Service层进行业务计算。

第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,增加CPU运算的操作 -> 水平分表。

二、分库分表

1、水平分库

932dbf6f2d5e3aad5442e4ebfa0e0374.png

1、概念:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。

2、结果:

每个库的结构都一样;

每个库的数据都不一样,没有交集;

所有库的并集是全量数据;

3、场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。

4、分析:库多了,io和cpu的压力自然可以成倍缓解。

2、水平分表

52bfe7f1186822cdadad57016d87782c.png

1、概念:以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。

2、结果:

每个表的结构都一样;

每个表的数据都不一样,没有交集;

所有表的并集是全量数据;

3、场景:系统绝对并发量并没有上来,只是单表的数据量太多,影响了SQL效率,加重了CPU负担,以至于成为瓶颈。

4、分析:表的数据量少了,单次SQL执行效率高,自然减轻了CPU的负担。

3、垂直分库

1c9f4063f8c01621a70ef99918c40276.png

1、概念:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。

2、结果:

每个库的结构都不一样;

每个库的数据也不一样,没有交集;

所有库的并集是全量数据;

3、场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。

4、分析:到这一步,基本上就可以服务化了。例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。

4、垂直分表

07037aed73cd65ef99c2444bd296852b.png

1、概念:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。

2、结果:

2.1、每个表的结构都不一样;

2.2、每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据;

2.3、所有表的并集是全量数据;

3、场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读IO,产生IO瓶颈。

4、分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读IO。拆了之后,要想获得全部数据就需要关联两个表来取数据。

但记住,千万别用join,因为join不仅会增加CPU负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。关联数据,应该在业务Service层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。

三、分库分表工具

1、sharding-sphere:jar,前身是sharding-jdbc;

2、TDDL:jar,Taobao Distribute Data Layer;

3、Mycat:中间件。

注:工具的利弊,请自行调研,官网和社区优先。

四、分库分表步骤

根据容量(当前容量和增长量)评估分库或分表个数 -> 选key(均匀)-> 分表规则(hash或range等)-> 执行(一般双写)-> 扩容问题(尽量减少数据的移动)。

五、分库分表问题

六、分库分表总结

1、分库分表,首先得知道瓶颈在哪里,然后才能合理地拆分(分库还是分表?水平还是垂直?分几个?)。且不可为了分库分表而拆分。

2、选key很重要,既要考虑到拆分均匀,也要考虑到非partition key的查询。

3、只要能满足需求,拆分规则越简单越好。


http://chatgpt.dhexx.cn/article/DIi88kOY.shtml

相关文章

ShardingSphere分库分表

ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续开发。在国内历经了当当网、电信翼支付、京东数科等多…

mysql innodb分表技术_mysql分表技术

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法。 目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解。 首先,我们需…

mybatis实现分表

分析上面登陆,当前表按照年份分表了,最大的一张表超过500w建议分表 注意:之前写的经过多方测试发现遍历的时候参数传递不进去,现如今已经完善 package org.jeecg.config.mybatis;import lombok.extern.slf4j.Slf4j; import org.apache.ibati…

mysql 分表条件_mysql分表详解

本人混迹qq群2年多了,经常听到有人说“数据表太大了,需要分表”,“xxxx了,要分表”的言论,那么,到底为什么要分表? 难道数据量大就要分表? mysql数据量对索引的影响 本人mysql版本为…

ShardingSphere简介与分表使用

一、ShardingSphere简介 1、简介 ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目。 ShardingSphere 是一套开源的分布式数据库中间件解决方案。 ShardingSphere 产品定位为 Database Plus,旨在构建异构数据库上层的标准和生态圈。 它…

mysql mybatis分表查询_mybatis 自动分表

参考: 相关源码已上传至我的 github 欢迎转载,转载请注明出处,尊重作者劳动成果:https://www.cnblogs.com/li-mzx/p/9963312.html 前言 小弟才疏学浅,可能很多问题也没有考虑到,权当抛砖引玉,希望各位大神指点 项目背景: 希望做一个功能,能在sql操作数据库时,根据某个…

mysql 分区分表_mysql分库分区分表

一、分表 分表分为水平分表和垂直分表。 水平分表原理: 分表策略通常是用户ID取模,如果不是整数,可以首先将其进行hash获取到整。 水平分表遇到的问题: 1. 跨表直接连接查询无法进行 2. 我们需要统计数据的时候 3. 如果数据…

Mock平台介绍

Mock平台可以用来模拟接口,具备了get方法,post方法,header,cookie,重定向等功能。 Mock平台的搭建应用于mock框架,在github上可以下载到开源的代码。 下载地址:http://repo1.maven.org/maven2/…

Mock 框架 Moq 的使用

Intro# Moq 是 .NET 中一个很流vb.net教程行的 Mock 框架,使c#教程用 Mock 框架我python基础教程们可以只针对我java基础教程们关注的代码进行测试,对于sql教程依赖项使用 Mock 对象配置预期的依赖服务的行为。 Moq 是基于 Castle 的动态代理来实现的&…

mockjs入门

mockjs 1,mock.js是什么? mockjs是生成随机数据的一款前端工具,用来模拟 Ajax 请求,生成并返回模拟数据 2,为什么用mockjs? 当程序员做项目开发时,前端工程师要请求后端做好的数据时,有可能…

monkey简介

https://blog.csdn.net/lebang08/article/details/70858532 https://www.cnblogs.com/aland-1415/p/6949964.html https://blog.csdn.net/aisemi/article/details/55254348 一、Monkey 简介 monkey是Android SDK中自带的一个命令行工具,使用Java语言写成&#xf…

mokey的介绍和使用

一、monkey介绍 monkey是Android SDK提供的一个命令行工具,可以简单方便的发送伪随机的用户时间流,对Android APP做压力(稳定性、健壮性)测试。主要是为了测试APP是否存在无响应和崩溃的情况。 二、monkey的使用 1、前提条件&a…

APP测试— 测试工具mokey

文章目录 1 Mokey概念2 运行Monkey(对手机进行300次无规律点击)3 Mokey常规参数4 Monkey 事件类参数5 Monkey 约束类参数 1 Mokey概念 1)Monkey是Android SDK提供的一个命令行工具,可以简单、方便的运行任何版本的Android模拟器和…

Kafka配置用户名密码访问

1 软件版本 kafka_2.12-2.4.0.tgz(带zookeeper) 2 kafka服务端部署 2.1 将安装包上传到服务器,并解压 tar zxvf kafka_2.12-2.4.0.tgz -C /datamv kafka_2.12-2.4.0 kafka2.2 修改kafka配置文件 server.properties vim /data/kafka/conf…

linux 用户名和密码的处理

1. 创建新用户和密码 # 创建用户 testuser useradd testuser# 给已创建的用户testuser设置密码 passwd testuser# 新创建的用户会在 /home 下创建一个用户目录testuser# 修改用户这个命令的相关参数 usermod --help# 删除用户testuser userdel testuser# 删除用户所在目录rm -…

用户名,密码登录

1.导入项目需要的依赖,分层 注意:如果你的数据库是5.5的版本,依赖要用低版本的,高版本不稳定,新增的内容不识别,会报各种各样奇葩的错误 2.创建实体类 它的属性要和数据库字段对应 package com.oa.entity…

实现用户输入用户名和密码登录

题目 实现用户输入用户名和密码登录,当用户名为admin或administrator且密码为666666时,显示“登录成功”,否则显示“登录失败”,登录失败时允许重复输入三次。 实例 参考程序 User1 "admin" User2 "administr…

计算机用户名和初始密码,电脑默认的用户名和密码是多少

优质回答 回答者:止树2018 电脑用户默认是没有密码的,除非你设置了,没有设置的前提下,直接按回车键就可以进系统了。 电脑默认的用户是administrator,如果你创建了自己的新用户名,那么,原始管理…

服务器密码以及用户名怎么修改

服务器密码以及用户名怎么修改 我是艾西,今天给大家说下服务器密码如何修改 windows2003系统: 1、右键我的电脑,点击“管理”: 2、在“本地用户和组”中打开“用户”,在右侧找到 Administrator 账户进行修改。 200…

电脑更改开机密码和用户名

一、电脑更改开机密码 1、快捷键CtrlAltDel出现以下界面。 2、点击“更改密码”,出现修改密码的界面,输入旧的密码,以及新的密码,确定即可。 二、电脑更改开机用户名 1、打开电脑的”控制面板“。 2、在控制面板中点击“用户帐户…