创建mysql表分区的方法.docx

上传人:lao****ou 文档编号:812250 上传时间:2024-06-02 格式:DOCX 页数:15 大小:40.86KB
下载 相关 举报
创建mysql表分区的方法.docx_第1页
第1页 / 共15页
创建mysql表分区的方法.docx_第2页
第2页 / 共15页
创建mysql表分区的方法.docx_第3页
第3页 / 共15页
创建mysql表分区的方法.docx_第4页
第4页 / 共15页
创建mysql表分区的方法.docx_第5页
第5页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《创建mysql表分区的方法.docx》由会员分享,可在线阅读,更多相关《创建mysql表分区的方法.docx(15页珍藏版)》请在第一文库网上搜索。

1、创建mysq1表分区的方法我来给大家介绍一下mysq1表分区创建与使用吧,希望对各位同学会有所帮助。表分区的测试使用,主要内容来自于其他博客文章以及mysq15.1的参考手册。表分区是最近才知道的哦,以前自己做都是分表来实现上亿级别的数据了,下面我来给大家介绍一下mysq1表分区创建与使用吧,希望对各位同学会有所帮助。表分区的测试使用,主要内容来自于其他博客文章以及mysq15.1的参考手册mysq1测试版本:mysq15.5.28mysq1物理存储文件(有mysq1配置的datadir决定存储路径)格式简介数据库engine为MYISAMfrm表结构文件,myd表数据文件,myi表索引文件。

2、INNODBengine对应的表物理存储文件innodb的数据库的物理文件结构为:.frm文件Jbd文件和.ibdata文件:这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。独享表空间存储方式使用,ibd文件,并且每个表一个ibd文件共享表空间存储方式使用Jbdata文件,所有表共同使用一个ibdata文件创建分区分区的一些优点包括:,与单个磁盘或文件系统分区相比,可以存储更多的数据。,对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的

3、分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQ1分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。涉及到例如SUM()和COUNT(

4、)这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如SE1ECTSaIespersonJdzCOUNT(Orders)asorder_tota1FROMsa1esGROUPBYSaIespersonJd;通过并行,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。,通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。简而言之就是数据管理优化,查询更快,数据查询并行检测mysq1是否支持分区复制代码代码如下:mysqIshowvariab1es1ike,%partition%;+IVariab1e_nameVa1ue+Ihave_partiti

5、oningYES+1rowinsetRANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。复制代码代码如下:DROPTAB1EIFEXISTS、p_range;CREATETAB1E、p_range(idint(10)NOTNU11AUTOJNCREMENT,namechar(20)NOTNU11,PRIMARYKEY(id)ENGINE=MyISAMAUTOJNCREMENT=9DEFAU1TCHARSET=utf8*!50100PARTITIONBYRANGE(id)(PARTITIONpVA1UES1ESSTHAN(8)ENGINE=MyISAM)*;range分区就是par

6、titionbyrange(id)表示按id1-7的数据存储在PO分区;如果id大于7了则数据不能写入了,因为没有对应的数据分区来存储;所以这时在创建分区时需要使用maxva1ues关键字了复制代码代码如下:PARTITIONBYRANGE(id)PARTITIONpVA1UES1ESSTHAN(8)zPARTITIONp1VA1UES1ESSTHANMAXVA1UE)这样就表示,所有id大于7的数据记录存在在P1分区里。RANGE分区在如下场合特别有用:,当需要删除旧的数据时。如果你使用上面最近的那个例子给出的分区方案,你只需简单地使用A1TERTAB1Eemp1oyeesDROPPARTI

7、TIONpO;”来册除所有在1991年前就已经停止工作的雇员相对应的所有行。对于有大量行的表,这比运行一个如DE1ETEFROMemp1oyeesWHEREYEAR(Separated)=1990;”这样的一个DE1ETE查询要有效得多。,想要使用一个包含有日期或时间值,或包含有从一些其他级数开始增长的值的列。,经常运行直接依赖于用于分割表的列的查询。例如,当执行一个如SE1ECTCOUNT(*)FROMemp1oyeesWHEREYEAR(Separated)=2000GROUPBYStOre_id;这样的查询时,MySQ1可以很迅速地确定只有分区p2需要扫描,这是因为余下的分区不可能包含有

8、符合该WHERE子句的任何记录。1IST分区:类似于按RANGE分区,区别在于1IST分区是基于列值匹配一个离散值集合中的某个值来进行选择。IiSt分区可以理解为按一个键的id区间进行数据存储,比如类型表1,2,3,4的所有记录存储在PO里面,5,6,7,8存在在P1分区里面这里与range分区一样,如果现在有条记录typeid是9,那么这条记录是不能存入的;需要注意的是:1IST分区没有类似如VA1UES1ESSTHANMAXVA1UE这样的包含其他值在内的定义。将要匹配的任何值都必须在值列表中找到。复制代码代码如下:DROPTAB1EIFEXISTSpjist;CREATETAB1E、pj

9、ist(idint(10)NOTNU11AUTOJNCREMENT,typeidmediumint(10)NOTNU11DEFAU1T,0,ztypenamechar(20)DEFAU1TNU11,PRIMARYKEY(idtypeid)ENGINE=MyISAMAUTOJNCREMENT=9DEFAU1TCHARSET=utf8*!50100PARTITIONBY1IST(typeid)(PARTITIONpVA1UESIN(1z2,3z4)ENGINE=MyISAM,PARTITIONp1VA1UESIN(5,6,7,8)ENGINE=MyISAM)*;HASH分区:基于用户定义的表达式的

10、返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQ1中有效的、产生非负整数值的任何表达式。HASH分区主要用来确保数据在预先确定数目的分区中平均分布。在RANGE和1IST分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中;而在HASH分区中,MySQ1自动完成这些工作,你所要做的只是基于将要被哈希的列值指定一个列值或表达式,以及指定被分区的表将要被分割成的分区数量。要使用HASH分区来分割一个表,要在CREATETAB1E语句上添加一个PARTITIONBYHASH(expr)子句,其中exp是一个返回一个整数的表达式。它可以仅仅

11、是字段类型为MySQ1整型的一列的名字。此外,你很可能需要在后面再添加一个PARTITIONSnum子句,其中num是一个非负的整数,它表示表将要被分割成分区的数量。如果没有包括一个PARTrr1oNS子句,那么分区的数量将默认为Io复制代码代码如下:DROPTAB1EIFEXISTSp_hash;CREATETAB1Ep_hash(idint(10)NOTNU11AUTOJNCREMENT,storeidmediumint(10)NOTNU11DEFAU1T,0,zstorenamechar(255)DEFAU1TNU11,PRIMARYKEYCid,storeid)ENGINE=InnoD

12、BAUTOJNCREMENT=11DEFAU1TCHARSET=utf8*!50100PARTITIONBYHASH(storeid)PARTITIONS4*;InnoDB弓擎简单点说就是数据的存入可以按partitionbyhash(expr);这里的expr可以是键名也可以是表达式比如YEAR(time),如果是表达式的情况下但是应当记住,每当插入或更新(或者可能删除)一行,这个表达式都要计算一次;这意味着非常复杂的表达式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候。在执行删除、写入、更新时这个表达式都会计算一次。数据的分布采用基于用户函数结果的模数来确定使用

13、哪个编号的分区。换句话,对于一个表达式expr,将要保存记录的分区编号为N,其中N=MOD(expr,num),o比如上面的StOreid为10;那么N=MOD(10,4);N是等于2的,那么这条记录就存储在p2的分区里面。如果插入一个表达式列值为2005-0915,的记录到表中,那么保存该条记录的分区确定如下:MoD(YEARc2005-0901),4)=MOD(2005,4)=1;就存储在P1分区里面了。MySQ15.1还支持一个被称为1inearhashing(线性哈希功能)的变量,它使用一个更加复杂的算法来确定新行插入到已经分区了的表中的位置。线性哈希分区和常规哈希分区在语法上的唯一区

14、别在于,在叩ARTrrIONBY子句中添加1INEAR关键字;线性哈希功能使用的一个线性的2的幕(PoWerS-of-two)运算法则按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(IOOOGB)数据的表。它的缺点在于,与使用常规HASH分区得到的数据分布相比,各个分区间数据的分布不大可能均衡。KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQ1服务器提供其自身的哈希函数。必须有一列或多列包含整数值。复制代码代码如下:DROPTAB1EIFEXISTSp_key;CREATETAB1Ep_key(idint(10)N

15、OTNU11AUTOJNCREMENT,keynamechar(20)DEFAU1TNU11,keyva1Varchar(IOOO)DEFAU1TNU11,PRIMARYKEYCiCr)ENGINE=MyISAMAUTOJNCREMENT=12DEFAU1TCHARSET=utf8*!50100PARTITIONBYKEY(id)PARTITIONS4*;按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的哈希函数是由MySQ1服务器提供。MySQ1簇(C1uster)使用函数MD5()来实现KEY分区;对于使用其他存储引擎的表,服务器使用其自己内部的哈希函数,这些函数是基于与PASSWoRD()一样的运算法则。CREATETAB1E.PARTITIONBYKEY的语法规则类似于创建一个通过HASH分区的表的规则。它们唯一的区别在于使用的关键字是KEY而不是HASH,并且KEY分区只采用一个或多个列名的一个列表。与hash的区别就是,hash使用用户定义的表达式如YEAR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服