理解mysql 表分区(mysql partition)

<p>概述  </p><p>分区允许以一个任意的大小,跨系统、跨磁盘的将一个表分为多个部分。实际上,表的不同部分在不同的位置被存储为单独的表。用户所选择的、实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数值区间或数值列表,或者是一个内部HASH函数,或一个线性HASH函数。</p><p></p><p>partition的一些优点包括:</p><p>myisam支持将表的多个部分存储于不同的文件系统或是磁盘,可以存储更多数据</p><p>提供直接删除一个partition的语句,速度较快</p><p>通过partitioning-pruning优化某些查询语句</p><p></p><p>partition 的局限:</p><p>innodb不支持directory选择,partition后的表不能存储于多个路径中</p><p>目前的mysql版本(截止到mysql5.5)中还没有对partition进行并行优化(如 sum() count() max()等)</p><p>目前的mysql版本中还不支持多磁盘的并行IO</p><p></p><p>partition类型</p><p>RANGE分区</p><pre class="brush:bash;toolbar:false">CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT&#39;1970-01-01&#39;, separatedDATENOTNULLDEFAULT&#39;9999-12-31&#39;, job_codeINT, store_idINT ) PARTITIONBYRANGE(YEAR(separated))( PARTITIONp0VALUESLESSTHAN(1991), PARTITIONp1VALUESLESSTHAN(1996), PARTITIONp2VALUESLESSTHAN(2001), PARTITIONp3VALUESLESSTHANMAXVALUE );</pre><p>LIST分区</p><pre class="brush:bash;toolbar:false">CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT&#39;1970-01-01&#39;, separatedDATENOTNULLDEFAULT&#39;9999-12-31&#39;, job_codeINT, store_idINT ) PARTITIONBYLIST(store_id) PARTITIONpNorthVALUESIN(3,5,6,9,17), PARTITIONpEastVALUESIN(1,2,10,11,19,20), PARTITIONpWestVALUESIN(4,12,13,14,18), PARTITIONpCentralVALUESIN(7,8,15,16) );</pre><p>HASH分区</p><pre class="brush:bash;toolbar:false">CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT&#39;1970-01-01&#39;, separatedDATENOTNULLDEFAULT&#39;9999-12-31&#39;, job_codeINT, store_idINT ) PARTITIONBYHASH(store_id) PARTITIONS4; LINENEARHASH CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT&#39;1970-01-01&#39;, separatedDATENOTNULLDEFAULT&#39;9999-12-31&#39;, job_codeINT, store_idINT ) PARTITIONBYLINEARHASH(YEAR(hired)) PARTITIONS4;</pre><p>KEY分区</p><pre class="brush:bash;toolbar:false">CREATETABLEtk( col1INTNOTNULL, col2CHAR(5), col3DATE ) PARTITIONBYLINEARKEY(col1) PARTITIONS3;</pre><p>子分区</p><pre class="brush:bash;toolbar:false">CREATETABLEts(idINT,purchasedDATE) PARTITIONBYRANGE(YEAR(purchased)) SUBPARTITIONBYHASH(TO_DAYS(purchased)) SUBPARTITIONS2 ( PARTITIONp0VALUESLESSTHAN(1990), PARTITIONp1VALUESLESSTHAN(2000), PARTITIONp2VALUESLESSTHANMAXVALUE );</pre><p>分区修剪(Partition Pruning)</p><p>分区修剪是MySQL5.1.6版本后实现的,其原理很简单,一句话来描述就是“不要扫描那些没有匹配值的分区”。</p><p>分区管理(Partition Management)</p><p>分区维护(Partition Maintenance)</p>
RangeTime:0.006855s
RangeMem:207.53 KB
返回顶部 留言