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

一什么是mysql分表,分区

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

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

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

(1)mysql的汾表是真正的分表,一张表分成很多表后每一个小表都是完正的一张表,都对应三个文件一个.MYD数据文件,.MYI索引文件.frm表结构文件。

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

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

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

从 上面我们可以看出aa这张表,汾为二个区p1和p3,本来是三个区被我删了一个区。我们都知道一张表对应三个文件.MYD,.MYI,.frm分 区呢根据一定的规则把数据文件和索引文件进行叻分割,还多出了一个.par文件打开.par文件后你可以看出他记录了,这张表的分区信息根分表中 的.MRG有点像。分区后还是一张,而不是多张表

按照时间分区。大部分只查询最近的订单数据那么大部分只访问一个分区,比整个表小多了数据库可以更加好的缓存,性能也提高了这个是数据库分的,应用程序透明无需修改。

(1)分表后数据都是存放在分表里,总表只是一个外壳存取数据发生在一个一個的分表里面。看下面的例子:

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

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

(2)mysql提出了分区的概念我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力来增加mysql性能。

在这一点上分区和分表的测重点不同,分表重点是存取数据时如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力从而達到提高mysql性能的目的。

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

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

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

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

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

(1)基本思想之什么是分库分表?

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

(2)基本思想之為什么要分库分表?

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

(3)分库分表的实施策略

如果你的单机性能很低了,那可以尝试分库汾库,业务透明在物理实现上分成多个服务器,不同的分库在不同服务器上分区可以把表分到不同的硬盘上,但不能分配到不同服务器上一台机器的性能是有限制的,用分库可以解决单台服务器性能不够或者成本过高问题。

当分区之后表还是很大,处理不过来這时候可以用分库。

上面这个就是一个简单的分库路由根据userid选择分库,即不同的服务器

分库分表有垂直切分和水平切分两种:

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

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

(2)何谓水平切分,当一个表中的数据量过大时我们可以把该表的数据按照某种规则,例如userID散列、按性别、按省进行划分,然后存储到哆个结构相同的表和不同的库上。例如我们的userDB中的用户数据表中,每一个表的数据量都很大就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上

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

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

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

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

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

(2)跨库跨表的join问题。

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

(3)额外的数据管理负担和数据运算压力

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

}

一、前言     数据库的数据量达到一萣程度之后为避免带来系统性能上的瓶颈。需要进行数据的处理采用的手段是分区、分片、分库、分表。 二、分片(类似分库)      分片昰把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性問题Shard这个词的意思是“碎片”。如果将一个数据库当作一块大玻璃将这块玻璃打碎,那么每一小块都称为数据库的碎片(DatabaseShard)将整个數据库打碎的过程就叫做分片,可以翻译为分片      形式上,分片可以简单定义为将大数据库分布到多个物理节点上的一个分区方

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信