《mysql分表分区的区别与联系》由会员分享,可在线阅读,更多相关《mysql分表分区的区别与联系(18页珍藏版)》请在金锄头文库上搜索。
1、mysql分表,分区的区别与联系一,什么是mysql分表,分区什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考mysql分区功能详细介绍,以及实例二,mysql分表和分区有什么区别呢1,实现方式上a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。1. rootBlackGhosttest#ls|grepuser 2. alluser.
2、MRG 3. alluser.frm 4. user1.MYD 5. user1.MYI 6. user1.frm 7. user2.MYD 8. user2.MYI 9. user2.frmrootBlackGhost test# ls |grep useralluser.MRGalluser.frmuser1.MYDuser1.MYIuser1.frmuser2.MYDuser2.MYIuser2.frm简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2。他们二个都是独立的表,取数据的时候,我们可以通过总表来取。
3、这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面。我们来看看.MRG到底是什么东西1. rootBlackGhosttest#catalluser.MRG|more 2. user1 3. user2 4. #INSERT_METHOD=LASTrootBlackGhost test# cat alluser.MRG |moreuser1user2#INSERT_METHOD=LAST从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式。可以把总表理解成一个外壳,或者是联接池。b),分区不一样,一张大表进行
4、分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。1. rootBlackGhosttest#ls|grepaa 2. aa#P#p1.MYD 3. aa#P#p1.MYI 4. aa#P#p3.MYD 5. aa#P#p3.MYI 6. aa.frm 7. aa.parrootBlackGhost test# ls |grep aaaa#P#p1.MYDaa#P#p1.MYIaa#P#p3.MYDaa#P#p3.MYIaa.frmaa.par从上面我们可以看出,aa这张表,分为二个区,p1和p3,本来是三个区,被我删了一个区。我们都知道一张表对应三个文件.MYD,.MYI,.
5、frm。分区呢根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了,这张表的分区信息,根分表中的.MRG有点像。分区后,还是一张,而不是多张表。2,数据处理上a),分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。看下面的例子:select * from alluser where id=12表面上看,是对表alluser进行操作的,其实不是的。是对alluser里面的分表进行了操作。b),分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成
6、。3,提高性能上a),分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。b),mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。4),实现的难易度上a),分表的方法有
7、很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。b),分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。三,mysql分表和分区有什么联系呢1,都能提高mysql的性高,在高并发状态下都有一个良好的表面。2,分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。Mysql 表分区201
8、0-10-19 15:51:06|分类: mysql |标签: |字号大中小订阅 一、什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表。mysql5.1开始支持数据表分区了。如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。二、为什么要对表进行分区为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。分区的一些优点包括: 1)、与单个磁盘或文件系统分区相比,可以存储更多的数据。2)、对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些
9、情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。 3)、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。 4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以
10、很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。 5)、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。三、分区类型 RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 HASH分区:基于用户
11、定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。 KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。RANGE分区 基于属于一个给定连续区间的列值,把多行分配给分区。 这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。以下是实例。Sql代码 CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVAR
12、CHAR(30), hiredDATENOTNULLDEFAULT1970-01-01, separatedDATENOTNULLDEFAULT9999-12-31, job_codeINTNOTNULL, store_idINTNOTNULL) partitionBYRANGE(store_id)( partitionp0VALUESLESSTHAN(6), partitionp1VALUESLESSTHAN(11), partitionp2VALUESLESSTHAN(16), partitionp3VALUESLESSTHAN(21) );CREATE TABLE employees (
13、 id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT 1970-01-01, separated DATE NOT NULL DEFAULT 9999-12-31, job_code INT NOT NULL, store_id INT NOT NULL ) partition BY RANGE (store_id) ( partition p0 VALUES LESS THAN (6), partition p1 VALUES LESS THAN (11), partition
14、p2 VALUES LESS THAN (16), partition p3 VALUES LESS THAN (21) ); 按照这种分区方案,在商店1到5工作的雇员相对应的所有行被保存在分区P0中,商店6到10的雇员保存在P1中,依次类推。注意,每个分区都是按顺序进行定义,从最低到最高。这是PARTITION BY RANGE 语法的要求;在这点上,它类似于C或Java中的“switch . case”语句。 对于包含数据(72, Michael, Widenius, 1998-06-25, NULL, 13)的一个新行,可以很容易地确定它将插入到p2分区中,但是如果增加了一个编号为第21的商店,将会发生什么呢?在这种方案下,由于没有规则把store_id大于20的商店包含在内,服务器将不知道把该行保存在何处,将会导致错误。 要避免这种错误,可以通过在CREATE TABLE语句中使用一个“catchall” VALUES LESS THAN子句,该子句提供给所有大于明确指定的最高值的值:Sql代码 CREATETABLEemployees( idINTNOTNULL, fna