<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'1970-01-01',
separatedDATENOTNULLDEFAULT'9999-12-31',
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'1970-01-01',
separatedDATENOTNULLDEFAULT'9999-12-31',
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'1970-01-01',
separatedDATENOTNULLDEFAULT'9999-12-31',
job_codeINT,
store_idINT
)
PARTITIONBYHASH(store_id)
PARTITIONS4;
LINENEARHASH
CREATETABLEemployees(
idINTNOTNULL,
fnameVARCHAR(30),
lnameVARCHAR(30),
hiredDATENOTNULLDEFAULT'1970-01-01',
separatedDATENOTNULLDEFAULT'9999-12-31',
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>