mysql分库分表方案_mysql spring 分表-csdn博客


本站和网页 https://blog.csdn.net/liuchangjie0112/article/details/81871269 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Mysql分库分表方案_mysql spring 分表-CSDN博客
Mysql分库分表方案
最新推荐文章于 2024-03-13 10:15:46 发布
痴书先生
阅读量6.9k
收藏
24
点赞数
分类专栏:
【MySQL高级】
文章标签:
分库分表
专栏收录该内容
28 篇文章
3 订阅
订阅专栏
1.为什么要分表:
当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。
mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。
2. mysql proxy:amoeba
做mysql集群,利用amoeba。
从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。可以通过amoeba来配置。
3.大数据量并且访问频繁的表,将其分为若干个表。
比如对于某网站平台的数据库表-公司表,数据量很大,这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。
某网站现在的数据量至多是5000万条,可以设计每张表容纳的数据量是500万条,也就是拆分成10张表。
那么如何判断某张表的数据是否容量已满呢?可以在程序段对于要新增数据的表,在插入前先做统计表记录数量的操作,当<500万条数据,就直接插入,当已经到达阀值,可以在程序段新创建数据库表(或者已经事先创建好),再执行插入操作。
4. 利用merge存储引擎来实现分表
如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了。用merge存储引擎来实现分表, 这种方法比较适合。
举例子:
数据库架构
1、简单的MySQL主从复制:
MySQL的主从复制解决了数据库的读写分离,并很好的提升了读的性能,其图如下:
其主从复制的过程如下图所示:
但是,主从复制也带来其他一系列性能瓶颈问题:
写入无法扩展
写入无法缓存
复制延时
锁表率上升
表变大,缓存率下降
那问题产生总得解决的,这就产生下面的优化方案,一起来看看。
2、MySQL垂直分区
如果把业务切割得足够独立,那把不同业务的数据放到不同的数据库服务器将是一个不错的方案,而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,并且也起到了负载分流的作用,大大提升了数据库的吞吐能力。经过垂直分区后的数据库架构图如下:
然而,尽管业务之间已经足够独立了,但是有些业务之间或多或少总会有点联系,如用户,基本上都会和每个业务相关联,况且这种分区方式,也不能解决单张表数据量暴涨的问题,因此为何不试试水平分割呢?
3、MySQL水平分片(Sharding)
这是一个非常好的思路,将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可,原理图如下:
如何来确定某个用户所在的shard呢,可以建一张用户和shard对应的数据表,每次请求先从这张表找用户的shard id,再从对应shard中查询相关数据,如下图所示:
单库单表 
单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到。 
单库多表 
随着用户数量的增加,user表的数据量会越来越大,当数据量达到一定程度的时候对user表的查询会渐渐的变慢,从而影响整个DB的性能。如果使用mysql, 还有一个更严重的问题是,当需要添加一列的时候,mysql会锁表,期间所有的读写操作只能等待。 
可以通过某种方式将user进行水平的切分,产生两个表结构完全一样的user_0000,user_0001等表,user_0000 + user_0001 + …的数据刚好是一份完整的数据。 
多库多表 
随着数据量增加也许单台DB的存储空间不够,随着查询量的增加单台数据库服务器已经没办法支撑。这个时候可以再对数据库进行水平区分。 
分库分表规则 
设计表的时候需要确定此表按照什么样的规则进行分库分表。例如,当有新用户时,程序得确定将此用户信息添加到哪个表中;同理,当登录的时候我们得通过用户的账号找到数据库中对应的记录,所有的这些都需要按照某一规则进行。 
路由 
通过分库分表规则查找到对应的表和库的过程。如分库分表的规则是user_id mod 4的方式,当用户新注册了一个账号,账号id的123,我们可以通过id mod 4的方式确定此账号应该保存到User_0003表中。当用户123登录的时候,我们通过123 mod 4后确定记录在User_0003中。 
分库分表产生的问题,及注意事项 
1.分库分表维度的问题 
假如用户购买了商品,需要将交易记录保存取来,如果按照用户的纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用户的 购买情况,但是某商品被购买的情况则很有可能分布在多张表中,查找起来比较麻烦。反之,按照商品维度分表,可以很方便的查找到此商品的购买情况,但要查找 到买人的交易记录比较麻烦。 
所以常见的解决方式有:
通过扫表的方式解决,此方法基本不可能,效率太低了。 
记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。 
通过搜索引擎解决,但如果实时性要求很高,又得关系到实时搜索。 
2.联合查询的问题 
联合查询基本不可能,因为关联的表有可能不在同一数据库中。 
3.避免跨库事务 
避免在一个事务中修改db0中的表的时候同时修改db1中的表,一个是操作起来更复杂,效率也会有一定影响。 
4.尽量把同一组数据放到同一DB服务器上 
例如将卖家a的商品和交易信息都放到db0中,当db1挂了的时候,卖家a相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。 
一主多备 
在实际的应用中,绝大部分情况都是读远大于写。Mysql提供了读写分离的机制,所有的写操作都必须对应到Master,读操作可以在 Master和Slave机器上进行,Slave与Master的结构完全一样,一个Master可以有多个Slave,甚至Slave下还可以挂 Slave,通过此方式可以有效的提高DB集群的 QPS.                                                       
所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。 
此外,可以看出Master是集群的瓶颈,当写操作过多,会严重影响到Master的稳定性,如果Master挂掉,整个集群都将不能正常工作。 
所以
1. 当读压力很大的时候,可以考虑添加Slave机器的分式解决,但是当Slave机器达到一定的数量就得考虑分库了。
2. 当写压力很大的时候,就必须得进行分库操作。 
MySQL使用为什么要分库分表 
可以用说用到MySQL的地方,只要数据量一大, 马上就会遇到一个问题,要分库分表。
这里引用一个问题
为什么要分库分表呢?MySQL处理不了大的表吗? 
其实是可以处理的大表的。我所经历的项目中单表物理上文件大小在80G多,单表记录数在5亿以上,而且这个表 属于一个非常核用的表:朋友关系表。
但这种方式可以说不是一个最佳方式。因为面临文件系统如Ext3文件系统对大于大文件处理上也有许多问题。
这个层面可以用xfs文件系统进行替换。但MySQL单表太大后有一个问题是不好解决: 表结构调整相关的操作基本不在可能。所以大项在使用中都会面监着分库分表的应用。
从Innodb本身来讲数据文件的Btree上只有两个锁, 叶子节点锁和子节点锁,可以想而知道,当发生页拆分或是添加新叶时都会造成表里不能写入数据。
所以分库分表还就是一个比较好的选择了。
那么分库分表多少合适呢? 
经测试在单表1000万条记录一下,写入读取性能是比较好的. 这样在留点buffer,那么单表全是数据字型的保持在800万条记录以下, 有字符型的单表保持在500万以下。
如果按 100库100表来规划,如用户业务: 
500万*100*100 = 50000000万 = 5000亿记录。
心里有一个数了,按业务做规划还是比较容易的。
优惠劵
关注
点赞
觉得还不错?
一键收藏
知道了
评论
Mysql分库分表方案 1.为什么要分表:当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。 mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对...
复制链接
扫一扫
专栏目录
Mysql
数据库分库和
分表
方式(常用)
09-10
本文主要给大家介绍
方式(常用),涉及到
mysql
数据库相关知识,对
数据库
相关知识感兴趣的朋友一起学习吧
的3种方法
热门推荐
wulong710的专栏
11-12
1万+
参考:https://blog.csdn.net/czh500/article/details/89735492
一,先说一下为什么要
一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。
的目的就在于此,减小数据库的负担,缩短查询时间。
根据个人经验,
执行一个sql的过程如下:
1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果。
在这个执行过程中最花时间在什么地方呢?
第一,是排队等待的时间
参与评论
您还未登录,请先
登录
后发表或查看评论
160道
MySQL
数据库精选面试题+答案解析
最新发布
m0_61568580的博客
03-13
1105
当我们使用order by将查询结果按照某个字段排序时,如果该字段没有建立索引,那么执行计划会将查询出的所有数据使用外部排序(将数据从硬盘分批读取到内存使用内部排序,最后合并排序结果),这个操作是很影响性能的,因为需要将查询涉及到的所有数据从磁盘中读到内存(如果单条数据过大或者数据量过多都会降低效率),更无论读到内存之后的排序了。而且如果分页的,那么只用取出索引表某个范围内的索引对应的数据,而不用像上述那取出所有数据进行排序再返回某个范围内的数据。如果两个事务没有更新相同的⾏,它们在备库上可以并⾏执⾏。
方案
长林攻城狮的博客
03-19
1635
常用的
以及常用中间件都有哪些?
,分区的区别和联系
Chinaxxren
10-25
541
一,什么是
,分区
什么是
,从表面意思上看呢,就是把一张表分成N多个小表,具体请看
什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考
分区功能详细介绍,以及实例
二,
和分区有什么区别呢
1,实现方式上
a),
是真正的
,一张表分成很多表后,每一个...
+技术
分享
02-03
架构原理 1、
架构演变 2、
&常用中间件 3、Sharding-JDBC 4、
过程中存在哪些问题以及如何解决 ps:可用于公司技术分享
大数据分库和
php解决
07-08
本文讲的是
分库
、php实现
高并发解决
数据库之
_ITPUB博客.mhtml
04-17
(Mycat
11-19
详细讲解了如何配置mycat,如何在
spring
boot项目中集成mycat,如何在配置文件中配置
网易
数据库DDB
02-25
互联网时代,也是关系型数据库独领风骚的时代,从早期的Oracle独步天下,到现在
蒸蒸日上,关系型...同时,也希望通过线性扩容降低全量数据迁移对线上服务带来的影响,
便应运而生。
的原理是
一文彻底搞懂
MYSQL
weixin_42273066的博客
05-26
1702
把一部
字段放入一张表,另一部分放入其他的表。按照表字段的使用频次分门别类的划分。例如:在商品列表查询时,列表中只是展示部分字段,同时这个列表查询比详情信息查询更加高频,并不需要把所有字段都展示,我们可以单独把列表信息单独拿出来当一张表。当表数据量很大时,可以将表按字段切开,将热门字段、冷门字段分开放置在不同表中,这些库可以放在不同的存储设备上,避免IO争抢。垂直切分带来的性能提升主要集中在热门数据的操作效率上,而且磁盘争用情况减少。同理也可以大字段进行拆分扩展表想法。
mclongyi的专栏
12-02
1424
数据库之互联网常用
一、数据库瓶颈
1、IO瓶颈
2、CPU瓶颈
二、
1、水平分库
2、水平
3、垂直分库
4、垂直
三、
工具
四、
步骤
五、
问题
1、非partition key的查询问题(水平
,拆分策略为常用的hash法)
2、非partition key跨库跨表分页查询问题(水平
3、扩容问题(水平
六、
总结
七、
示例
篇 』:
表的聚合与联合查询
m0_56361048的博客
02-09
3549
表的聚合与联合查询详解与剖析
表中的聚合查询
小小码农
02-02
1212
,总结的非常好!
weixin_53370274的博客
03-14
361
公司最近在搞服务分离,数据切分方面的东西,因为单张包裹表的数据量实在是太大,并且还在以每天60W的量增长。之前了解过数据库的
,读过几篇博文,但就只知道个模糊概念, 而且现在回想起来什么都是模模糊糊的。今天看了一下午的数据库
,看了很多文章,现在做个总结,“摘抄”下来。(但更期待后期的实操) 会从以下几个方面说起:第一部分:实际网站发展过程中面临的问题。第二部分:有哪几种切分方式,垂直和水平的区别和适用面。第三部分:目前市面有的一些开源产品,技术,它们的优缺点是什么。
数据库系列文章 之
的三种方法
Coder_Boy_的博客
07-15
3113
这样我就成功的将一张user表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样给程序员带来了很大的工作量,有没有好的办法解决这一点呢?做什么事都有一个度,超过个度就过变得很差,不能一味的做数据库服务器集群,硬件是要花钱买的,也不要一味的
,分出来1000表,
的存储归根到底还以文件的形势存在硬盘上面,一张表对应三个文件,1000个
就是对应3000个文件,这样检索起来也会变的很慢。第一,是排队等待的时间,第二,sql的执行时间。
MySql
zh_nanfang的博客
08-24
951
1、
:主要是当前库的承载能力满足不了日益增加的业务需求,每天都会产生大量的数据,导致对数据操作出现瓶颈。分库策略:常用的是根据业务需求进行分库:比如按照用户的维度对数据进行分库等
策略:一般常用的是按照日期的维度进行
,尤其是在数据中台对ads表或者ods表进行处理的时候,大部分都是按照日期的维度
:互联网公司常用
汇总
kaixincheng2009的专栏
08-18
1089
作者:尜尜人物原文:cnblogs.com/littlecharacter/p/9342129.html本文目录一、数据库瓶颈IO瓶颈CPU瓶颈二、
水平分库水平
垂直分库垂直...
操作步骤
08-25
引用提到了三种常见的数据库解决
,其中之一就是
是一种解决数据库瓶颈问题的方法。而引用则强调了在进行
之前需要确定瓶颈在哪里,并且合理地进行拆分。
下面是
的一般操作步骤:
1. 首先,我们需要评估当前数据库的性能瓶颈,确定是否需要进行
操作。一般来说,当数据库的读写压力过大,导致性能下降时,可能需要考虑进行
2. 如果决定进行
,需要先选择分库还是
,以及水平还是垂直的拆分方式。这取决于具体的业务需求和数据特点。例如,可以根据某个字段(如用户ID)进行分库,或者根据某个表进行
3. 在进行
之前,需要进行数据迁移和调整。这包括创建新的库和表结构,将数据从原有的库和表迁移到新的库和表中。可以使用一些工具和脚本来帮助完成这一过程。
4. 在
之后,需要对应用程序进行相应的修改,以适应新的数据库结构。这可能涉及到修改数据库连接配置、SQL语句的编写等方面。
5. 进行
后,需要进行性能测试和监控,以确保新的数据库架构能够满足业务需求,并且性能有所提升。根据测试结果,可能需要进行调优和优化的操作。
需要注意的是,在进行
操作时,需要谨慎考虑,避免过度拆分,造成管理和维护的复杂性增加。同时,还需要考虑数据一致性和分布式事务的问题,以确保数据的完整性和正确性。
总结来说,
操作包括评估瓶颈、选择拆分方式、数据迁移和调整、修改应用程序和性能测试监控等步骤。根据具体业务需求和数据特点,可以采取适合的
。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
*1* *3* [海量数据下的
](https://blog.csdn.net/wqsbenren/article/details/100036609)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
*2* [
](https://blog.csdn.net/wei55255555/article/details/80406758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
CSDN认证博客专家
CSDN认证企业博客
码龄10年
暂无认证
200
原创
4万+
周排名
14万+
总排名
93万+
访问
等级
8662
积分
184
粉丝
272
获赞
202
867
私信
热门文章
推荐一款最好用的windows文件管理器
119672
华为手机通过ADB永久关闭系统更新
46596
周期性线程池newScheduledThreadPool详解
42963
如何查看项目svn路径
31296
SSH2 协议详解
21333
分类专栏
【大数据】
1篇
【区块链】
28篇
【Linux那些事儿】
34篇
【Java】
43篇
【实用代码】
12篇
【Nginx】
【Spring深入】
【Java多线程】
18篇
【SpringCloud微服务架构】
【SpringBoot 2.x】
2篇
【Java虚拟机】
【mybatis深入】
【JavaWeb知识点】
【经验总结】
20篇
【诗词鉴赏】
4篇
【生活杂谈】
26篇
【踩过的坑】
22篇
【Java进阶】
7篇
【Java框架】
【JDK新特性】
【Java分布式项目】
【Maven总结】
【版本管理】
10篇
【Docker+Kubernetes微服务容器化实践】
3篇
【消息队列MQ】
【python】
【项目管理】
15篇
【计算机网络】
【前端】
31篇
【公众号&小程序】
5篇
【JSON数据】
【基础常识】
13篇
【IDE工具】
29篇
【面试总结】
【单元测试】
最新评论
关于union和join区别和联系
guyuan_demo:
我才发现2015年的文章,快10年了
指挥部在下面:
这个布局一坨答辩
ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例
翡冷翠之夜:
微信不存在啊
三流学校毕业生的程序学习之路
natureCP0510:
风雨过后,终见彩虹
倔强的初学者:
scheduleAtFixedRate()是反复执行任务,在for()循环中创建了9个scheduleAtFixedRate()任务,将反复执行9个任务,你这控制台打印日志不应该是这个吧,楼主需要亲自验证一下代码再发帖
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
最新文章
Docker容器安装mysql 8 教程
虚拟机修改主机名的步骤总结
消息中间件 RabbitMQ
2023年
2021年
2020年
2019年
70篇
2018年
73篇
2017年
118篇
2016年
52篇
2015年
目录
被折叠的 
 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额
3.43
前往充值 >
需支付:
10.00
取消
确定
下一步
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值