问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Mysql分表和分区的区别,分库和分表区别

发布网友 发布时间:2022-04-24 15:07

我来回答

1个回答

热心网友 时间:2022-04-07 20:00

分表和分区的区别:

一、什么是mysql分表,分区 

分表:从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法

分区:分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考mysql分区功能详细介绍,以及实例 

二、mysql分表和分区有什么区别呢 

1、实现方式上 
①mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。 

[root@BlackGhost test]# ls |grep user
alluser.MRG
alluser.frm
user1.MYD
user1.MYI
user1.frm
user2.MYD
user2.MYI
user2.frm

简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2。他们二个都是独立的表,取数据的时候,我们可以通过总表来取。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面。我们来看看.MRG到底是什么东西 

[root@BlackGhost test]# cat alluser.MRG |more
user1
user2
#INSERT_METHOD=LAST


从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式。可以把总表理解成一个外壳,或者是联接池。 

②分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。 

[root@BlackGhost test]# ls |grep aa
aa#P#p1.MYD
aa#P#p1.MYI
aa#P#p3.MYD
aa#P#p3.MYI
aa.frm
aa.par

从上面我们可以看出,aa这张表,分为二个区,p1和p3,本来是三个区,被我删了一个区。我们都知道一张表对应三个文件.MYD,.MYI,.frm。分 区呢根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了,这张表的分区信息,根分表中的.MRG有点像。分区后,还是一张,而不是多张表。 
如orderid,userid,ordertime,.....
ordertime<2015-01-01 #p0
ordertime<2015-04-01 #p1
ordertime<2015-07-01 #p2
ordertime<2015-10-01 #p3
ordertime<2016-01-01 #p4
按照时间分区。大部分只查询最近的订单数据,那么大部分只访问一个分区,比整个表小多了,数据库可以更加好的缓存,性能也提高了。这个是数据库分的,应用程序透明,无需修改。


2,数据处理上 
①、分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。看下面的例子: 

select * from alluser where id='12'表面上看,是对表alluser进行操作的,其实不是的。是对alluser里面的分表进行了操作。 

②、分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。 

3、提高性能上 

①、分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同 的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。 

②、mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。 
在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。 

4、实现的难易度上 

①、分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。 

②、分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。 

三、mysql分表和分区有什么联系呢 

1、都能提高mysql的性高,在高并发状态下都有一个良好的表面。 

2、分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

分库分表区别:

1、什么是分库分表?

从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。


2、为什么要分库分表?

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈,。


3、分库分表的实施策略。
如果你的单机性能很低了,那可以尝试分库。分库,业务透明,在物理实现上分成多个服务器,不同的分库在不同服务器上。分区可以把表分到不同的硬盘上,但不能分配到不同服务器上。一台机器的性能是有*的,用分库可以解决单台服务器性能不够,或者成本过高问题。
当分区之后,表还是很大,处理不过来,这时候可以用分库。
orderid,userid,ordertime,.....
userid%4=0,用分库1
userid%4=1,用分库2
userid%4=2, 用分库3
userid%4=3,用分库4
上面这个就是一个简单的分库路由,根据userid选择分库,即不同的服务器


分库分表有垂直切分和水平切分两种。
3.1、何谓垂直切分,即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。

如userid,name,addr一个表,为了防止表过大,分成2个表。
userid,name
userid,addr


3.2、何谓水平切分,当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列、按性别、按省,进行划分,然后存储到多个结构相同的表,和不同的库上。

例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上。


3.3、应该使用哪一种方式来实施数据库分库分表,这要看数据库中数据量的瓶颈所在,并综合项目的业务类型进行考虑。


如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选。


而如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况之下就应该选择水平切分,水平切分比垂直切分要复杂一些,它将原本逻辑上属于一体的数据进行了物理分割,除了在分割时要对分割的粒度做好评估,考虑数据平均和负载平均,后期也将对项目人员及应用程序产生额外的数据管理负担。


在现实项目中,往往是这两种情况兼而有之,这就需要做出权衡,甚至既需要垂直切分,又需要水平切分。我们的游戏项目便综合使用了垂直与水平切分,我们首先对数据库进行垂直切分,然后,再针对一部分表,通常是用户数据表,进行水平切分。


4 分库分表存在的问题。

4.1 事务问题。

在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。


4.2 跨库跨表的join问题。

在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到*,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。


4.3 额外的数据管理负担和数据运算压力。

额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算,例如,对于一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见关在拘留所里的人又出了交通事故,是什么意思? ...我朋友前阵子撞死了人,没有违规,当时立即报案了,现在在拘留所... 醉驾出事故,车已经给修了,现在已经进拘留所十多天了,什么时候能判... 朋友因为工地伤亡事故被拘留,现在已经25天了,赔偿金也付了10多天了... 江淮帅铃国4??加油发动机抖动冒黑烟是怎么回事? ...只换机油和格,现在5万公里了,请需要换些什么东西 诗经·国风·中谷有蓷原文、译文以及鉴赏 求解签 情缘 下签 条其啸矣。遇人之不淑矣。 解曰:孽缘遮眼 强栖双... 条其啸矣 如何将域解除? HACCP的最新审核依据? haccp七大原理是什么? 请问飞机的机翼有什么用?详细介绍 Haccp体系是什么? 飞机的机翼有什么作用? haccp是怎么回事? HACCP的七个原理是什么? HACCP是什么意思? 这买了蔬菜放冰箱里用塑料袋包着还是敞着更好 买的菜放在冰箱里,需要套个袋子么? vivou1退出不了简易桌面 vivo y83怎样设置极简模式 冰箱保鲜室蔬菜保存时用不用装袋 菜叶洗干净了直接放入保鲜袋里扎紧后能直接放入冰箱里吗? 如何开启VIVO y51的极简模式(老年模式)? vivos10pro简易模式 蔬菜放在冰箱怎么存储,用塑料袋密封吗 把水果蔬菜放保鲜袋里 保鲜袋子需要敞开个口吗 还是全封闭? vivos7如何关闭极简模式? vivo手机怎么退出简易桌面? 为何分表后mysql效率会更低? 分表和分区表的区别和选择 分库分表之后,id 主键如何处理? 数据库分表后如何查询数据? mysql分表,分区的区别和联系 mysql分表的3种方法一,先说一下为什么要分表 分表和分区有什么区别 mysql分表后如何确定查询数据在哪个表中 mysql分表之后怎样按照字段名查询数据 T450s如何设置U盘启动 家里装分表要申请吗? 装机大师制作好启动盘了,ThinkPad T450笔记本要怎么U盘重装系统win10? 数据库为什么要分库分表,数据库分库分表 thinkpad t450装系统(有U盘且没问题),按f12后选择U盘启动后又返回了这个界面,如图 联想笔记本电脑t450光盘启动 t450s用u盘恢复w8后开机启动不了 求大神告知T450用U盘装系统怎么进bios t450加固态硬盘装系统怎么重装系统 新买的t450s不能正常开机,必选复位孔才能开机,求助 thinkpad T450如何使用U盘重装系统