当前位置:首页 > 芯闻号 > 充电吧
[导读]一,什么是数据库分区前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(

一,什么是数据库分区

前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的。如果一张表的数据量太大的话,那么myd,myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样呢,我们查找一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如果表的数据太大,可能一个磁盘放不下,这个时候,我们可以把数据分配到不同的磁盘里面去。
分区的二种方式

1,横向分区

什么是横向分区呢?就是横着来分区了,举例来说明一下,假如有100W条数据,分成十份,前10W条数据放到第一个分区,第二个10W条数据放到第二个分区,依此类推。也就是把表分成了十分,根用merge来分表,有点像哦。取出一条数据的时候,这条数据包含了表结构中的所有字段,也就是说横向分区,并没有改变表的结构。

2,纵向分区

什么是纵向分区呢?就是竖来分区了,举例来说明,在设计用户表的时候,开始的时候没有考虑好,而把个人的所有信息都放到了一张表里面去,这样这个表里面就会有比较大的字段,如个人简介,而这些简介呢,也许不会有好多人去看,所以等到有人要看的时候,在去查找,分表的时候,可以把这样的大字段,分开来。

感觉数据库的分区好像是切苹果,到底是横着切呢,还是竖着切,根据个人喜好了,mysql提供的分区属于第一种,横向分区,并且细分成很多种方式。下面将举例说明一下。

二,mysql的分区

我觉着吧,mysql的分区只有一种方式,只不过运用不同的算法,規则将数据分配到不同的区块中而已。

1,mysql5.1及以上支持分区功能

安装安装的时候,我们就可以查看一下

查看复制打印? [root@BlackGhostmysql-5.1.50]#./configure--help|grep-A3Partition ===PartitionSupport=== PluginName:partition Description:MySQLPartitioningSupport Supportsbuild:static Configurations:max,max-no-ndb

查看一下,如果发现有上面这个东西,说明他是支持分区的,默认是打开的。如果你已经安装过了mysql的话

查看复制打印? mysql>showvariableslike"%part%"; +-------------------+-------+ |Variable_name|Value| +-------------------+-------+ |have_partitioning|YES| +-------------------+-------+ 1rowinset(0.00sec)

查看一下变量,如果支持的话,会有上面的提示的。

2,range分区

按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行

查看复制打印? //创建range分区表 mysql>CREATETABLEIFNOTEXISTS`user`( ->`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'用户ID', ->`name`varchar(50)NOTNULLDEFAULT''COMMENT'名称', ->`sex`int(1)NOTNULLDEFAULT'0'COMMENT'0为男,1为女', ->PRIMARYKEY(`id`) ->)ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_INCREMENT=1 ->PARTITIONBYRANGE(id)( ->PARTITIONp0VALUESLESSTHAN(3), ->PARTITIONp1VALUESLESSTHAN(6), ->PARTITIONp2VALUESLESSTHAN(9), ->PARTITIONp3VALUESLESSTHAN(12), ->PARTITIONp4VALUESLESSTHANMAXVALUE ->); QueryOK,0rowsaffected(0.13sec) //插入一些数据 mysql>INSERTINTO`test`.`user`(`name`,`sex`)VALUES('tank','0') ->,('zhang',1),('ying',1),('张',1),('映',0),('test1',1),('tank2',1) ->,('tank1',1),('test2',1),('test3',1),('test4',1),('test5',1),('tank3',1) ->,('tank4',1),('tank5',1),('tank6',1),('tank7',1),('tank8',1),('tank9',1) ->,('tank10',1),('tank11',1),('tank12',1),('tank13',1),('tank21',1),('tank42',1); QueryOK,25rowsaffected(0.05sec) Records:25Duplicates:0Warnings:0 //到存放数据库表文件的地方看一下,my.cnf里面有配置,datadir后面就是 [root@BlackGhosttest]#ls|grepuser|xargsdu-sh 4.0Kuser#P#p0.MYD 4.0Kuser#P#p0.MYI 4.0Kuser#P#p1.MYD 4.0Kuser#P#p1.MYI 4.0Kuser#P#p2.MYD 4.0Kuser#P#p2.MYI 4.0Kuser#P#p3.MYD 4.0Kuser#P#p3.MYI 4.0Kuser#P#p4.MYD 4.0Kuser#P#p4.MYI 12Kuser.frm 4.0Kuser.par //取出数据 mysql>selectcount(id)ascountfromuser; +-------+ |count| +-------+ |25| +-------+ 1rowinset(0.00sec) //删除第四个分区 mysql>altertableuserdroppartitionp4; QueryOK,0rowsaffected(0.11sec) Records:0Duplicates:0Warnings:0 /**存放在分区里面的数据丢失了,第四个分区里面有14条数据,剩下的3个分区 只有11条数据,但是统计出来的文件大小都是4.0K,从这儿我们可以看出分区的 最小区块是4K */ mysql>selectcount(id)ascountfromuser; +-------+ |count| +-------+ |11| +-------+ 1rowinset(0.00sec) //第四个区块已删除 [root@BlackGhosttest]#ls|grepuser|xargsdu-sh 4.0Kuser#P#p0.MYD 4.0Kuser#P#p0.MYI 4.0Kuser#P#p1.MYD 4.0Kuser#P#p1.MYI 4.0Kuser#P#p2.MYD 4.0Kuser#P#p2.MYI 4.0Kuser#P#p3.MYD 4.0Kuser#P#p3.MYI 12Kuser.frm 4.0Kuser.par /*可以对现有表进行分区,并且会按規则自动的将表中的数据分配相应的分区 中,这样就比较好了,可以省去很多事情,看下面的操作*/ mysql>altertableaapartitionbyRANGE(id) ->(PARTITIONp1VALUESlessthan(1), ->PARTITIONp2VALUESlessthan(5), ->PARTITIONp3VALUESlessthanMAXVALUE); QueryOK,15rowsaffected(0.21sec)//对15数据进行分区 Records:15Duplicates:0Warnings:0 //总共有15条 mysql>selectcount(*)fromaa; +----------+ |count(*)| +----------+ |15| +----------+ 1rowinset(0.00sec) //删除一个分区 mysql>altertableaadroppartitionp2; QueryOK,0rowsaffected(0.30sec) Records:0Duplicates:0Warnings:0 //只有11条了,说明对现有的表分区成功了 mysql>selectcount(*)fromaa; +----------+ |count(*)| +----------+ |11| +----------+ 1rowinset(0.00sec)

3,list分区

LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分 区是从属于一个连续区间值的集合。

查看复制打印? //这种方式失败 mysql>CREATETABLEIFNOTEXISTS`list_part`( ->`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'用户ID', ->`province_id`int(2)NOTNULLDEFAULT0COMMENT'省', ->`name`varchar(50)NOTNULLDEFAULT''COMMENT'名称', ->`sex`int(1)NOTNULLDEFAULT'0'COMMENT'0为男,1为女', ->PRIMARYKEY(`id`) ->)ENGINE=INNODBDEFAULTCHARSET=utf8AUTO_INCREMENT=1 ->PARTITIONBYLIST(province_id)( ->PARTITIONp0VALUESIN(1,2,3,4,5,6,7,8), ->PARTITIONp1VALUESIN(9,10,11,12,16,21), ->PARTITIONp2VALUESIN(13,14,15,19), ->PARTITIONp3VALUESIN(17,18,20,22,23,24) ->); ERROR1503(HY000):APRIMARYKEYmustincludeallcolumnsinthetable'spartitioningfunction //这种方式成功 mysql>CREATETABLEIFNOTEXISTS`list_part`( ->`id`int(11)NOTNULLCOMMENT'用户ID', ->`province_id`int(2)NOTNULLDEFAULT0COMMENT'省', ->`name`varchar(50)NOTNULLDEFAULT''COMMENT'名称', ->`sex`int(1)NOTNULLDEFAULT'0'COMMENT'0为男,1为女' ->)ENGINE=INNODBDEFAULTCHARSET=utf8 ->PARTITIONBYLIST(province_id)( ->PARTITIONp0VALUESIN(1,2,3,4,5,6,7,8), ->PARTITIONp1VALUESIN(9,10,11,12,16,21), ->PARTITIONp2VALUESIN(13,14,15,19), ->PARTITIONp3VALUESIN(17,18,20,22,23,24) ->); QueryOK,0rowsaffected(0.33sec)

上面的这个创建list分区时,如果有主銉的话,分区时主键必须在其中,不然就会报错。如果我不用主键,分区就创建成功了,一般情况下,一个张表肯定会有一个主键,这算是一个分区的局限性吧。

如果对数据进行测试,请参考range分区的测试来操作

4,hash分区

HASH分区主要用来确保数据在预先确定数目的分区中平均分布,你所要做的只是基于将要被哈希的列值指定一个列值或表达式,以 及指定被分区的表将要被分割成的分区数量。

查看复制打印? mysql>CREATETABLEIFNOTEXISTS`hash_part`( ->`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'评论ID', ->`comment`varchar(1000)NOTNULLDEFAULT''COMMENT'评论', ->`ip`varchar(25)NOTNULLDEFAULT''COMMENT'来源IP', ->PRIMARYKEY(`id`) ->)ENGINE=INNODBDEFAULTCHARSET=utf8AUTO_INCREMENT=1 ->PARTITIONBYHASH(id) ->PARTITIONS3; QueryOK,0rowsaffected(0.06sec)

测试请参考range分区的操作

5,key分区

按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用 户定义的表达式,而KEY分区的 哈希函数是由MySQL 服务器提供。

查看复制打印? mysql>CREATETABLEIFNOTEXISTS`key_part`( ->`news_id`int(11)NOTNULLCOMMENT'新闻ID', ->`content`varchar(1000)NOTNULLDEFAULT''COMMENT'新闻内容', ->`u_id`varchar(25)NOTNULLDEFAULT''COMMENT'来源IP', ->`create_time`DATENOTNULLDEFAULT'0000-00-0000:00:00'COMMENT'时间' ->)ENGINE=INNODBDEFAULTCHARSET=utf8 ->PARTITIONBYLINEARHASH(YEAR(create_time)) ->PARTITIONS3; QueryOK,0rowsaffected(0.07sec)

测试请参考range分区的操作

6,子分区

子分区是分区表中每个分区的再次分割,子分区既可以使用HASH希分区,也可以使用KEY分区。这 也被称为复合分区(composite partitioning)。

1,如果一个分区中创建了子分区,其他分区也要有子分区

2,如果创建了了分区,每个分区中的子分区数必有相同

3,同一分区内的子分区,名字不相同,不同分区内的子分区名子可以相同(5.1.50不适用)

查看复制打印? mysql>CREATETABLEIFNOTEXISTS`sub_part`( ->`news_id`int(11)NOTNULLCOMMENT'新闻ID', ->`content`varchar(1000)NOTNULLDEFAULT''COMMENT'新闻内容', ->`u_id`int(11)NOTNULLDEFAULT0sCOMMENT'来源IP', ->`create_time`DATENOTNULLDEFAULT'0000-00-0000:00:00'COMMENT'时间' ->)ENGINE=INNODBDEFAULTCHARSET=utf8 ->PARTITIONBYRANGE(YEAR(create_time)) ->SUBPARTITIONBYHASH(TO_DAYS(create_time))( ->PARTITIONp0VALUESLESSTHAN(1990)(SUBPARTITIONs0,SUBPARTITIONs1,SUBPARTITIONs2), ->PARTITIONp1VALUESLESSTHAN(2000)(SUBPARTITIONs3,SUBPARTITIONs4,SUBPARTITIONgood), ->PARTITIONp2VALUESLESSTHANMAXVALUE(SUBPARTITIONtank0,SUBPARTITIONtank1,SUBPARTITIONtank3) ->); QueryOK,0rowsaffected(0.07sec)

官方网站说不同分区内的子分区可以有相同的名字,但是mysql5.1.50却不行会提示以下错误

ERROR 1517 (HY000): Duplicate partition name s1

三,分区管理

1,删除分区

mysql>altertableuserdroppartitionp4;

2,新增分区

查看复制打印? //range添加新分区 mysql>altertableuseraddpartition(partitionp4valueslessthanMAXVALUE); QueryOK,0rowsaffected(0.06sec) Records:0Duplicates:0Warnings:0 //list添加新分区 mysql>altertablelist_partaddpartition(partitionp4valuesin(25,26,28)); QueryOK,0rowsaffected(0.01sec) Records:0Duplicates:0Warnings:0 //hash重新分区 mysql>altertablehash_partaddpartitionpartitions4; QueryOK,0rowsaffected(0.12sec) Records:0Duplicates:0Warnings:0 //key重新分区 mysql>altertablekey_partaddpartitionpartitions4; QueryOK,1rowaffected(0.06sec)//有数据也会被重新分配 Records:1Duplicates:0Warnings:0 //子分区添加新分区,虽然我没有指定子分区,但是系统会给子分区命名的 mysql>altertablesub1_partaddpartition(partitionp3valueslessthanMAXVALUE); QueryOK,0rowsaffected(0.02sec) Records:0Duplicates:0Warnings:0 mysql>showcreatetablesub1_partG; ***************************1.row*************************** Table:sub1_part CreateTable:CREATETABLE`sub1_part`( `news_id`int(11)NOTNULLCOMMENT'新闻ID', `content`varchar(1000)NOTNULLDEFAULT''COMMENT'新闻内容', `u_id`varchar(25)NOTNULLDEFAULT''COMMENT'来源IP', `create_time`dateNOTNULLDEFAULT'0000-00-00'COMMENT'时间' )ENGINE=InnoDBDEFAULTCHARSET=utf8 !50100PARTITIONBYRANGE(YEAR(create_time)) SUBPARTITIONBYHASH(TO_DAYS(create_time)) (PARTITIONp0VALUESLESSTHAN(1990) (SUBPARTITIONs0ENGINE=InnoDB, SUBPARTITIONs1ENGINE=InnoDB, SUBPARTITIONs2ENGINE=InnoDB), PARTITIONp1VALUESLESSTHAN(2000) (SUBPARTITIONs3ENGINE=InnoDB, SUBPARTITIONs4ENGINE=InnoDB, SUBPARTITIONgoodENGINE=InnoDB), PARTITIONp2VALUESLESSTHAN(3000) (SUBPARTITIONtank0ENGINE=InnoDB, SUBPARTITIONtank1ENGINE=InnoDB, SUBPARTITIONtank3ENGINE=InnoDB), PARTITIONp3VALUESLESSTHANMAXVALUE (SUBPARTITIONp3sp0ENGINE=InnoDB,//子分区的名子是自动生成的 SUBPARTITIONp3sp1ENGINE=InnoDB, SUBPARTITIONp3sp2ENGINE=InnoDB)) 1rowinset(0.00sec)

3,重新分区

查看复制打印? //range重新分区 mysql>ALTERTABLEuserREORGANIZEPARTITIONp0,p1,p2,p3,p4INTO(PARTITIONp0VALUESLESSTHANMAXVALUE); QueryOK,11rowsaffected(0.08sec) Records:11Duplicates:0Warnings:0 //list重新分区 mysql>ALTERTABLElist_partREORGANIZEPARTITIONp0,p1,p2,p3,p4INTO(PARTITIONp0VALUESin(1,2,3,4,5)); QueryOK,0rowsaffected(0.28sec) Records:0Duplicates:0Warnings:0 //hash和key分区不能用REORGANIZE,官方网站说的很清楚 mysql>ALTERTABLEkey_partREORGANIZEPARTITIONCOALESCEPARTITION9; ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'PARTITION9'atline1

四,分区优点

1,分区可以分在多个磁盘,存储更大一点

2,根据查找条件,也就是where后面的条件,查找只查找相应的分区不用全部查找了

3,进行大数据搜索时可以进行并行处理。

4,跨多个磁盘来分散数据查询,来获得更大的查询吞吐量

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭