MySQL分库分表相关面试知识点

article/2025/8/22 0:06:05

基础概念

分表

能够解决单表数据量过大带来的查询效率下降的问题

分库

面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义。此时,则需要通过数据分库策略,提高数据库并发访问能力。
优点:

分库、分表技术优化了数据存储方式,有效减小数据库服务器的负担、缩短查询响应时间。

数据分库、分表存储场景条件

  • 关系型数据库

  • 主从架构(master-slave)

  • 单表数据量在百万、千万级别

  • 数据库面临极高的并发访问

  • 分库、分表实现策略

    • 关键字取模,实现对数据访问进行路由。

如何进行数据切分

数据切分(Sharding),简单的来说,就是通过某种特定的条件,将存放在同一个数据库中的数据拆分存放到多个数据库(主机)中,从而达到分散单台机器负载的情况,即分库分表。根据数据切分规则的不同,主要有两种模式,

垂直切分(纵向切分),是对不同的表(或者Schema)进行切分,存储到不同的数据库(主机)之上。

水平切分(横向切分),是对同一个表中的数据进行切分,存储到不同的数据库(主机)之上。规则是根据表中数据的逻辑关系,按照某种条件拆分。

垂直切分

垂直切分,强调的是业务的拆分。一个数据库由多个表构成,每个表对应不同的业务,那么我们可以指按照业务的不同将表进行分类,并将其分布到不同的数据库上,这样就将数据分摊到了不同的库上面,做到专库专用。

举个例子,原数据库中有商品表、交易表、订单表,我们可以按照业务的不同进行垂直切分,把商品表、交易表、订单表分别拆分到商品库、交易库、订单库中去。

img

垂直拆分的优点:

拆分规则明确,拆分后业务清晰;系统之间进行整合或扩展变的容易;数据维护变的容易;按照成本、应用的等级、应用的类型等将表放到不同的机器上,便于管理。垂直拆分的缺点:

部分业务表无法关联(Join),只能通过接口方式解决,提高了系统的复杂度;受每种业务的不同限制,存在单库性能瓶颈,不易进行数据扩展和提升性能;分布式事务处理复杂。

水平切分(重点)

水平切分,强调的是技术层面的拆分。她是将其按照一定的逻辑规则将一个表中的数据分散到多个库中,在每个表中包含一部分数据,所有表加起来就是全量的数据。简单来说,我们可以将对数据的水平切分理解为按照数据行进行切分,就是将表中的某些行切分到一个数据库表中,而将其他行切分到其他数据库表中。

比如,原数据库有一张交易记录表,数据量非常大,其中表中有个地区字段,经过深入考证符合水平拆分的条件。我们就按照这个字段进行水平拆分,按不同的地区(北京、上海、江苏、浙江、广东等)拆分成10个库。

高峰时段同时有100万次请求,如果是单库,数据库就会承受100万次的请求压力,拆分成100个表分别放入10个库中,每个表进行1万次请求,则每个数据库会承受10万次的请求压力,这样压力就减少了很多,并且是成倍减少的。

img

水平拆分的优点:

拆分规则抽象好,join 操作基本可以数据库做;不存在单库大数据,高并发的性能瓶颈;应用端改造较少;提高了系统的稳定性跟负载能力。水平拆分的缺点:

拆分规则不好抽象;分片事务一致性难以解决;数据多次扩展难度大;跨库 join 性能较差。

横向/水平分表

作用

解决 表记录太大问题

主要解决问题

单表过大造成的性能问题;
单表过大造成的单服务器空间问题。
按某个字段分

如:将用户资料附件表分成3个附件分表pre_forum_attachment_[0|1|2],和1个附件索引表(存储tid和附件id关系),根据tid最后一位判断附件保存在哪个分表中。
按日期分表
日志类、统计类数据表按年、月、日、周分表。如:点击量统计statistics_202001、statistics_202002
通过MySQL的merge存储引擎实现
需要创建分表、总表,总表需要merge存储引擎。

示例代码
create table log_merge (
dt datetime not null,
info varchar (100) not null,index (dt)
) engine = merge
union= (log_2017,log_2018) insert_method = last;

纵向/垂直分表

作用:

​ 解决 列过多问题
常见的方式:

​ 根据活跃度分表、根据重要性分表等。

主要解决问题:

​ 表与表之间资源争用问题;
​ 锁争用机率小;
​ 实现核心与非核心的分级存储,如UDB登陆库拆分成一级二级三级库;
​ 数据库同步压力问题。
​ 具体策略

经常组合查询的列放在一个表,常用字段的表可考虑Memory引擎。
不经常使用的字段单独成表。
把text、blob等大字段拆分放在附表。如:把用户文章表分成主表news和从表news_data,主表存标题、关键字、浏览量等,从表存具体内容、模板等。

分库、分表注意事项

维度问题

针对用户购买记录数据,如果按照用户纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用户的购买情况,但是某商品被购买的情况则可能分布在多张表中,查找起来比较麻烦。
若按照商品维度分表,方便查找商品购买情况,但查找个人交易记录比较麻烦。

常见解决方案

通过扫表方式解决,效率太低,不可行。
记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。
通过搜索引擎解决,但如果实时性要求很高,则牵涉到实时搜索问题。
避免分表join操作。关联的表有可能不在同一数据库中。
避免跨库事务
避免在一个事务中修改db0、db1中的表,不仅操作复杂,而且影响效率。
分表宜多不宜少;避免后期可能二次拆分。
尽量同组数据统一DB服务器。例如将卖家a的商品和交易信息都放到db0中,当db1挂了的时候,卖家a相关的东西可以正常使用。即避免多个数据库中的数据产生依赖。


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

相关文章

MySQL分库分表及中间件Mycat

文章目录 一、前言1.1 垂直切分1.2 垂直切分的优缺点:1.3 水平切分1.3.1 水平分表1.3.2 水平分库 1.4 水平切分优缺点 二、Mycat 中间件实现读写分离2.1 mycat2.2 mycat安装2.3 利用mycat实现mysql的读写分离 三、Mysql高可用 一、前言 刚开始我们的系统只用了单机…

Mysql - 分库分表

介绍 问题分析 随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈: IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO&#x…

MySQL分库分表原理

前言 ❤Java学习路线个人总结-博客 ❤欢迎点赞👍收藏⭐留言 📝分享给需要的小伙伴 文章目录 前言1、为什么要分库分表02、分库分表03、不停机分库分表数据迁移4、分库分表实现5、读写分离实现 1、为什么要分库分表 分库分表目的:解决高并发&a…

mysql分库分表(二)

微信搜索:“二十同学” 公众号,欢迎关注一条不一样的成长之路 一种可以避免数据迁移的分库分表scale-out扩容模式 一种可以避免数据迁移的分库分表scale-out扩容方式 目前绝大多数应用采取的两种分库分表规则 mod方式dayofweek系列日期方式&#xff…

Mysql分库分表方案

相关文章: 1、 使用Spring AOP实现MySQL数据库读写分离案例分析 2、MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解 3、MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总结 4、使用mysqlreplicate命令快速搭建 Mysql 主…

mysql-分库分表

1、为什么要分库分表 1、为什么要分库分表 出现数据库瓶颈,比如IO瓶颈,CPU瓶颈 1、IO瓶颈 (1)磁盘读IO瓶颈- 数据体积比较大:大量的写操作,磁盘IO读写必然慢,效率低大量的读操作,…

mysql分库分表(一)

微信搜索:“二十同学” 公众号,欢迎关注一条不一样的成长之路 数据库分库分表策略的具体实现方案 相关文章: 1、 使用Spring AOP实现MySQL数据库读写分离案例分析 2、MySQL5.6 数据库主从(Master/Slave)同步安装与…

【MySQL】MySQL分库分表详解

目录 一、前言 1.1 数据量 1.2 磁盘 1.3 数据库连接 二、垂直拆分 or 水平拆分? 三、垂直拆分 3.1 垂直分库 3.2 垂直分表 3.3 垂直拆分的优缺点 四、水平拆分 4.1 水平分表 4.2 水平分库分表 4.3 水平拆分的优缺点 五、几种常用的分库分表的策略 5.1 根据数值范围 …

MySQL 分库分表

MySQL分库分表 概念 读写分离优化了互联网读多写少场景下的性能问题,考虑一个业务场景,如果读库的数据规模非常大,除了增加多个从库之外,还有其他的手段吗?实现数据库高可用,还有另外一个撒手锏&#xff…

MySQL之分库分表

为什么要分库分表 用户请求量太大 单服务器TPS、内存、IO都是有上限的,需要将请求打散分布到多个服务器 单库数据量太大 单库处理能力有限;单库所在服务器的磁盘空间有限;单库的操作IO有瓶颈 单表数据量太大 查询、插入、更新操作都会变慢&am…

【Mysql】分库分表

【Mysql】分库分表 文章目录 【Mysql】分库分表1. 介绍2. 拆分策略2.1 垂直拆分2.1.1 垂直分库2.1.2 垂直分表 2.2 水平拆分2.2.1 水平分库2.2.2 水平分表 1. 介绍 采用单数据库进行数据存储存在以下瓶颈: IO瓶颈:热点数据太多,数据库缓存不…

一文搞懂MySQL数据库分库分表

如果数据量过大,大家一般会分库分表。分库需要注意的内容比较少,但分表需要注意的内容就多了。 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没…

Mysql·分库分表

Mysql分库分表 在mysql中新建数据库用以表分库分表mycat解压后配置文件参数server.xml 主要配置mycat服务的参数,比如端口号,myact用户名和密码使用的逻辑数据库等rule.xml 主要配置路由策略,主要有分片的片键,拆分的策略&#xf…

MySQL分库分表,何时分?怎么分?

👨‍🎓 博主介绍: IT邦德,江湖人称jeames007,10年DBA工作经验 中国DBA联盟(ACDU)成员,目前从事DBA及程序编程 (Web\java\Python)工作,主要服务于生产制造 现拥有 Oracle …

MySQL 分库分表实践

文章目录 一、为什么要分库分表二、库表太大产生的问题三、垂直拆分1. 垂直分库2. 垂直分表 四、水平分表1. 配置水平分表2. 测试水平分表 一、为什么要分库分表 数据库架构演变 刚开始多数项目用单机数据库就够了,随着服务器流量越来越大,面对的请求也…

MySQL如何分库分表

1. 我们为什么需要分库分表 在分库分表之前,就需要考虑为什么需要拆分。我们做一件事,肯定是有充分理由的。所以得想好分库分表的理由是什么。我们现在就从两个维度去思考它,为什么要分库?为什么要分表? 1.1 为什么要…

MYSQL 之 分库分表

分库分表 关系型数据库本身⽐较容易成为系统瓶颈,单机存储容量、连接数、处理能⼒都有限。当单表的数据量 达到2000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严 重。此时就要考虑对其进⾏切分…

MySQL-分库分表详解(一)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

如何实现MYSQL分库分表

我们学习了在高并发下数据库的一种优化方案:读写分离,它就是依靠主从复制的技术使得数据库实现了数据复制为多份,增强了抵抗大量并发读请求的能力,提升了数据库的查询性能的同时,也提升了数据的安全性。当某一个数据库…

MySQL 分库分表,写得太好了!

https://www.toutiao.com/a6603492496779510276/?tt_frommobile_qq&utm_campaignclient_share&timestamp1549497188&appnews_article&utm_sourcemobile_qq&iid59568063679&utm_mediumtoutiao_android&group_id6603492496779510276 Mysql分库分表…