創(chuàng)建mysql表分區(qū)的方法_第1頁(yè)
創(chuàng)建mysql表分區(qū)的方法_第2頁(yè)
創(chuàng)建mysql表分區(qū)的方法_第3頁(yè)
創(chuàng)建mysql表分區(qū)的方法_第4頁(yè)
創(chuàng)建mysql表分區(qū)的方法_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

創(chuàng)建mysql表分區(qū)的方法我來(lái)給大家介紹一下mysql表分區(qū)創(chuàng)建與使用吧,希望對(duì)各位同學(xué)會(huì)有所幫助。表分區(qū)的測(cè)試使用,主要內(nèi)容來(lái)自于其他博客文章以及mysql5.1的參考手冊(cè)。表分區(qū)是最近才知道的哦,以前自己做都是分表來(lái)實(shí)現(xiàn)上億級(jí)別的數(shù)據(jù)了,下面我來(lái)給大家介紹一下mysql表分區(qū)創(chuàng)建與使用吧,希望對(duì)各位同學(xué)會(huì)有所幫助。

表分區(qū)的測(cè)試使用,主要內(nèi)容來(lái)自于其他博客文章以及mysql5.1的參考手冊(cè)

mysql測(cè)試版本:mysql5.5.28

mysql物理存儲(chǔ)文件(有mysql配置的datadir決定存儲(chǔ)路徑)格式簡(jiǎn)介

數(shù)據(jù)庫(kù)engine為MYISAM

frm表結(jié)構(gòu)文件,myd表數(shù)據(jù)文件,myi表索引文件。

INNODBengine對(duì)應(yīng)的表物理存儲(chǔ)文件

innodb的數(shù)據(jù)庫(kù)的物理文件結(jié)構(gòu)為:

.frm文件

.ibd文件和.ibdata文件:

這兩種文件都是存放innodb數(shù)據(jù)的文件,之所以用兩種文件來(lái)存放innodb的數(shù)據(jù),是因?yàn)閕nnodb的數(shù)據(jù)存儲(chǔ)方式能夠通過(guò)配置來(lái)決定是使用共享表空間存放存儲(chǔ)數(shù)據(jù),還是用獨(dú)享表空間存放存儲(chǔ)數(shù)據(jù)。

獨(dú)享表空間存儲(chǔ)方式使用.ibd文件,并且每個(gè)表一個(gè)ibd文件

共享表空間存儲(chǔ)方式使用.ibdata文件,所有表共同使用一個(gè)ibdata文件

創(chuàng)建分區(qū)

分區(qū)的一些優(yōu)點(diǎn)包括:

·與單個(gè)磁盤(pán)或文件系統(tǒng)分區(qū)相比,可以存儲(chǔ)更多的數(shù)據(jù)。

·對(duì)于那些已經(jīng)失去保存意義的數(shù)據(jù),通??梢酝ㄟ^(guò)刪除與那些數(shù)據(jù)有關(guān)的分區(qū),很容易地刪除那些數(shù)據(jù)。相反地,在某些情況下,添加新數(shù)據(jù)的過(guò)程又可以通過(guò)為那些新數(shù)據(jù)專(zhuān)門(mén)增加一個(gè)新的分區(qū),來(lái)很方便地實(shí)現(xiàn)。

通常和分區(qū)有關(guān)的其他優(yōu)點(diǎn)包括下面列出的這些。MySQL分區(qū)中的這些功能目前還沒(méi)有實(shí)現(xiàn),但是在我們的優(yōu)先級(jí)列表中,具有高的優(yōu)先級(jí);我們希望在5.1的生產(chǎn)版本中,能包括這些功能。

·一些查詢可以得到極大的優(yōu)化,這主要是借助于滿足一個(gè)給定WHERE語(yǔ)句的數(shù)據(jù)可以只保存在一個(gè)或多個(gè)分區(qū)內(nèi),這樣在查找時(shí)就不用查找其他剩余的分區(qū)。因?yàn)榉謪^(qū)可以在創(chuàng)建了分區(qū)表后進(jìn)行修改,所以在第一次配置分區(qū)方案時(shí)還不曾這么做時(shí),可以重新組織數(shù)據(jù),來(lái)提高那些常用查詢的效率。

·

涉及到例如SUM()和COUNT()這樣聚合函數(shù)的查詢,可以很容易地進(jìn)行并行處理。這種查詢的一個(gè)簡(jiǎn)單例子如“SELECTsalesperson_id,COUNT(orders)asorder_totalFROMsalesGROUPBYsalesperson_id;”。通過(guò)“并行”,這意味著該查詢可以在每個(gè)分區(qū)上同時(shí)進(jìn)行,最終結(jié)果只需通過(guò)總計(jì)所有分區(qū)得到的結(jié)果。

·

通過(guò)跨多個(gè)磁盤(pán)來(lái)分散數(shù)據(jù)查詢,來(lái)獲得更大的查詢吞吐量。

簡(jiǎn)而言之就是數(shù)據(jù)管理優(yōu)化,查詢更快,數(shù)據(jù)查詢并行

檢測(cè)mysql是否支持分區(qū)復(fù)制代碼代碼如下:

mysql>showvariableslike

"%partition%";

+-------------------+-------+

|Variable_name

|Value|

+-------------------+-------+

|have_partitioning|YES

|

+-------------------+-------+

1rowinset

RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。復(fù)制代碼代碼如下:

DROPTABLEIFEXISTS`p_range`;

CREATETABLE`p_range`(

`id`int(10)NOTNULLAUTO_INCREMENT,

`name`char(20)NOTNULL,

PRIMARYKEY(`id`)

)ENGINE=MyISAMAUTO_INCREMENT=9DEFAULTCHARSET=utf8

/*!50100PARTITIONBYRANGE(id)

(PARTITIONp0VALUESLESSTHAN(8)ENGINE=MyISAM)*/;

range分區(qū)就是partitionbyrange(id)表示按id1-7的數(shù)據(jù)存儲(chǔ)在p0分區(qū);如果id大于7了則數(shù)據(jù)不能寫(xiě)入了,因?yàn)闆](méi)有對(duì)應(yīng)的數(shù)據(jù)分區(qū)來(lái)存儲(chǔ);

所以這時(shí)在創(chuàng)建分區(qū)時(shí)需要使用maxvalues關(guān)鍵字了復(fù)制代碼代碼如下:

PARTITIONBYRANGE(id)

(

PARTITIONp0VALUESLESSTHAN(8),

PARTITIONp1VALUESLESSTHANMAXVALUE)

這樣就表示,所有id大于7的數(shù)據(jù)記錄存在在p1分區(qū)里。

RANGE分區(qū)在如下場(chǎng)合特別有用:

·

當(dāng)需要?jiǎng)h除“舊的”數(shù)據(jù)時(shí)。如果你使用上面最近的那個(gè)例子給出的分區(qū)方案,你只需簡(jiǎn)單地使用“ALTERTABLEemployeesDROPPARTITIONp0;”來(lái)刪除所有在1991年前就已經(jīng)停止工作的雇員相對(duì)應(yīng)的所有行。對(duì)于有大量行的表,這比運(yùn)行一個(gè)如“DELETEFROMemployeesWHEREYEAR(separated)<=1990;”這樣的一個(gè)DELETE查詢要有效得多。

·

想要使用一個(gè)包含有日期或時(shí)間值,或包含有從一些其他級(jí)數(shù)開(kāi)始增長(zhǎng)的值的列。

·

經(jīng)常運(yùn)行直接依賴于用于分割表的列的查詢。例如,當(dāng)執(zhí)行一個(gè)如“SELECTCOUNT(*)FROMemployeesWHEREYEAR(separated)=2000GROUPBYstore_id;”這樣的查詢時(shí),MySQL可以很迅速地確定只有分區(qū)p2需要掃描,這是因?yàn)橛嘞碌姆謪^(qū)不可能包含有符合該WHERE子句的任何記錄。

LIST分區(qū):類(lèi)似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。

list分區(qū)可以理解為按一個(gè)鍵的id區(qū)間進(jìn)行數(shù)據(jù)存儲(chǔ),比如類(lèi)型表1,2,3,4的所有記錄存儲(chǔ)在p0里面,5,6,7,8存在在p1分區(qū)里面

這里與range分區(qū)一樣,如果現(xiàn)在有條記錄typeid是9,那么這條記錄是不能存入的;

需要注意的是:LIST分區(qū)沒(méi)有類(lèi)似如“VALUESLESSTHANMAXVALUE”這樣的包含其他值在內(nèi)的定義。將要匹配的任何值都必須在值列表中找到。復(fù)制代碼代碼如下:

DROPTABLEIFEXISTS`p_list`;

CREATETABLE`p_list`(

`id`int(10)NOTNULLAUTO_INCREMENT,

`typeid`mediumint(10)NOTNULLDEFAULT'0',

`typename`char(20)DEFAULTNULL,

PRIMARYKEY(`id`,`typeid`)

)ENGINE=MyISAMAUTO_INCREMENT=9DEFAULTCHARSET=utf8

/*!50100PARTITIONBYLIST(typeid)

(PARTITIONp0VALUESIN(1,2,3,4)ENGINE=MyISAM,

PARTITIONp1VALUESIN(5,6,7,8)ENGINE=MyISAM)*/;

HASH分區(qū):基于用戶定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。

HASH分區(qū)主要用來(lái)確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布。在RANGE和LIST分區(qū)中,必須明確指定一個(gè)給定的列值或列值集合應(yīng)該保存在哪個(gè)分區(qū)中;而在HASH分區(qū)中,MySQL自動(dòng)完成這些工作,你所要做的只是基于將要被哈希的列值指定一個(gè)列值或表達(dá)式,以及指定被分區(qū)的表將要被分割成的分區(qū)數(shù)量。

要使用HASH分區(qū)來(lái)分割一個(gè)表,要在CREATETABLE語(yǔ)句上添加一個(gè)“PARTITIONBYHASH(expr)”子句,其中“expr”是一個(gè)返回一個(gè)整數(shù)的表達(dá)式。它可以僅僅是字段類(lèi)型為MySQL整型的一列的名字。此外,你很可能需要在后面再添加一個(gè)“PARTITIONSnum”子句,其中num是一個(gè)非負(fù)的整數(shù),它表示表將要被分割成分區(qū)的數(shù)量。如果沒(méi)有包括一個(gè)PARTITIONS子句,那么分區(qū)的數(shù)量將默認(rèn)為1。復(fù)制代碼代碼如下:

DROPTABLEIFEXISTS`p_hash`;

CREATETABLE`p_hash`(

`id`int(10)NOTNULLAUTO_INCREMENT,

`storeid`mediumint(10)NOTNULLDEFAULT'0',

`storename`char(255)DEFAULTNULL,

PRIMARYKEY(`id`,`storeid`)

)ENGINE=InnoDBAUTO_INCREMENT=11DEFAULTCHARSET=utf8

/*!50100PARTITIONBYHASH(storeid)

PARTITIONS4*/;

InnoDB引擎

簡(jiǎn)單點(diǎn)說(shuō)就是數(shù)據(jù)的存入可以按partitionbyhash(expr);這里的expr可以是鍵名也可以是表達(dá)式比如YEAR(time),如果是表達(dá)式的情況下

“但是應(yīng)當(dāng)記住,每當(dāng)插入或更新(或者可能刪除)一行,這個(gè)表達(dá)式都要計(jì)算一次;這意味著非常復(fù)雜的表達(dá)式可能會(huì)引起性能問(wèn)題,尤其是在執(zhí)行同時(shí)影響大量行的運(yùn)算(例如批量插入)的時(shí)候。”

在執(zhí)行刪除、寫(xiě)入、更新時(shí)這個(gè)表達(dá)式都會(huì)計(jì)算一次。

數(shù)據(jù)的分布采用基于用戶函數(shù)結(jié)果的模數(shù)來(lái)確定使用哪個(gè)編號(hào)的分區(qū)。換句話,對(duì)于一個(gè)表達(dá)式“expr”,將要保存記錄的分區(qū)編號(hào)為N,其中“N=MOD(expr,num)”。

比如上面的storeid為10;那么N=MOD(10,4);N是等于2的,那么這條記錄就存儲(chǔ)在p2的分區(qū)里面。

如果插入一個(gè)表達(dá)式列值為'2005-09-15′的記錄到表中,那么保存該條記錄的分區(qū)確定如下:MOD(YEAR('2005-09-01′),4)

=

MOD(2005,4)

=

1;就存儲(chǔ)在p1分區(qū)里面了。

“MySQL5.1還支持一個(gè)被稱(chēng)為“l(fā)inearhashing(線性哈希功能)”的變量,它使用一個(gè)更加復(fù)雜的算法來(lái)確定新行插入到已經(jīng)分區(qū)了的表中的位置。

線性哈希分區(qū)和常規(guī)哈希分區(qū)在語(yǔ)法上的唯一區(qū)別在于,在“PARTITIONBY”子句中添加“LINEAR”關(guān)鍵字;線性哈希功能使用的一個(gè)線性的2的冪(powers-of-two)運(yùn)算法則

按照線性哈希分區(qū)的優(yōu)點(diǎn)在于增加、刪除、合并和拆分分區(qū)將變得更加快捷,有利于處理含有極其大量(1000GB)數(shù)據(jù)的表。

它的缺點(diǎn)在于,與使用常規(guī)HASH分區(qū)得到的數(shù)據(jù)分布相比,各個(gè)分區(qū)間數(shù)據(jù)的分布不大可能均衡?!?/p>

KEY分區(qū):類(lèi)似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。復(fù)制代碼代碼如下:

DROPTABLEIFEXISTS`p_key`;

CREATETABLE`p_key`(

`id`int(10)NOTNULLAUTO_INCREMENT,

`keyname`char(20)DEFAULTNULL,

`keyval`varchar(1000)DEFAULTNULL,

PRIMARYKEY(`id`)

)ENGINE=MyISAMAUTO_INCREMENT=12DEFAULTCHARSET=utf8

/*!50100PARTITIONBYKEY(id)

PARTITIONS4*/;

按照KEY進(jìn)行分區(qū)類(lèi)似于按照HASH分區(qū),除了HASH分區(qū)使用的用戶定義的表達(dá)式,而KEY分區(qū)的哈希函數(shù)是由MySQL服務(wù)器提供。MySQL簇(Cluster)使用函數(shù)MD5()來(lái)實(shí)現(xiàn)KEY分區(qū);對(duì)于使用其他存儲(chǔ)引擎的表,服務(wù)器使用其自己內(nèi)部的哈希函數(shù),這些函數(shù)是基于與PASSWORD()一樣的運(yùn)算法則。

“CREATETABLE…PARTITIONBYKEY”的語(yǔ)法規(guī)則類(lèi)似于創(chuàng)建一個(gè)通過(guò)HASH分區(qū)的表的規(guī)則。它們唯一的區(qū)別在于使用的關(guān)鍵字是KEY而不是HASH,并且KEY分區(qū)只采用一個(gè)或多個(gè)列名的一個(gè)列表。

與hash的區(qū)別就是,hash使用用戶定義的表達(dá)式如YEAR(time);而key分區(qū)則是由mysql服務(wù)器提供的。同樣KEY也是可以使用linear線性key的,與hashlinear是相同的算法。

子分區(qū):是分區(qū)表中每個(gè)分區(qū)的再次分割。復(fù)制代碼代碼如下:

DROPTABLEIFEXISTS`p_subpartition`;

CREATETABLE`p_subpartition`(

`id`int(10)DEFAULTNULL,

`title`char(255)NOTNULL,

`createtime`dateNOTNULL

)ENGINE=MyISAMDEFAULTCHARSET=utf8

/*!50100

PARTITIONBYRANGE(YEAR(createtime))

SUBPARTITIONBYHASH(MONTH(createtime))

(PARTITIONp0VALUESLESSTHAN(2012)

(SUBPARTITIONs1ENGINE=MyISAM,

SUBPARTITIONs2ENGINE=MyISAM),

PARTITIONp1VALUESLESSTHAN(2013)

(SUBPARTITIONs3ENGINE=MyISAM,

SUBPARTITIONs4ENGINE=MyISAM),

PARTITIONp2VALUESLESSTHANMAXVALUE

(SUBPARTITIONs5ENGINE=MyISAM,

SUBPARTITIONs6ENGINE=MyISAM))*/;

可以看到p_subpartition有三個(gè)分區(qū)p0,p1,p2;而這三個(gè)分區(qū)每一個(gè)又進(jìn)一步分為2個(gè)分區(qū)。那么整個(gè)表都就分為6個(gè)小分區(qū);

可以看到代表p_sobpartitionp0.myd的文件消失了,取代的是p_subpartition#p#p0#sp#s1.myd

在MySQL5.1中,對(duì)于已經(jīng)通過(guò)RANGE或LIST分區(qū)了的表再進(jìn)行子分區(qū)是可能的。

子分區(qū)是分區(qū)表中每個(gè)分區(qū)的再次分割,子分區(qū)既可以使用HASH希分區(qū),也可以使用KEY分區(qū)。這也被稱(chēng)為復(fù)合分區(qū)(compositepartitioning)。

1,如果一個(gè)分區(qū)中創(chuàng)建了子分區(qū),其他分區(qū)也要有子分區(qū)

2,如果創(chuàng)建了了分區(qū),每個(gè)分區(qū)中的子分區(qū)數(shù)必有相同

3,同一分區(qū)內(nèi)的子分區(qū),名字不相同,不同分區(qū)內(nèi)的子分區(qū)名子可以相同(5.1.50不適用)

分區(qū)注意點(diǎn)

1、重新分區(qū)時(shí),如果原分區(qū)里面存在maxvalue則新的分區(qū)里面也必須包含maxvalue否則就錯(cuò)誤。

altertablep_range2x

reorganizepartitionp1,p2

into(partitionp0valueslessthan(5),partitionp1valueslessthanmaxvalue);

[Err]1520–Reorganizeofrangepartitionscannotchangetotalrangesexceptforlastpartitionwhereitcanextendtherange

2、分區(qū)刪除時(shí),數(shù)據(jù)也同樣會(huì)被刪除

altertablep_rangedroppartitionp0;

3、如果range分區(qū)列表里面沒(méi)有maxvalue則如有新數(shù)據(jù)大于現(xiàn)在分區(qū)range數(shù)據(jù)值那么這個(gè)數(shù)據(jù)是無(wú)法寫(xiě)入到數(shù)據(jù)庫(kù)表的。

4、修改表名不需要?jiǎng)h除分區(qū)后在進(jìn)行更改,修改表名后分區(qū)存儲(chǔ)mydmyi對(duì)應(yīng)也會(huì)自動(dòng)更改。

如果希望從所有分區(qū)刪除所有的數(shù)據(jù),但是又保留表的定義和表的分區(qū)模式,使用TRUNCATETABLE命令。(請(qǐng)參見(jiàn)13.2.9節(jié),“TRUNCATE語(yǔ)法”)。

如果希望改變表的分區(qū)而又不丟失數(shù)據(jù),使用“ALTERTABLE…REORGANIZEPARTITION”語(yǔ)句。參見(jiàn)下面的內(nèi)容,或者在13.1.2節(jié),“ALTERTABLE語(yǔ)法”中參考關(guān)于REORGANIZEPARTITION的信息。

5、對(duì)表進(jìn)行分區(qū)時(shí),不論采用哪種分區(qū)方式如果表中存在主鍵那么主鍵必須在分區(qū)列中。表分區(qū)的局限性。

6、list方式分區(qū)沒(méi)有類(lèi)似于range那種lessthanmaxvalue的寫(xiě)法,也就是說(shuō)list分區(qū)表的所有數(shù)據(jù)都必須在分區(qū)字段的值列表集合中。

7、在MySQL5.1版中,同一個(gè)分區(qū)表的所有分區(qū)必須使用同一個(gè)存儲(chǔ)引擎;例如,不能對(duì)一個(gè)分區(qū)使用MyISAM,而對(duì)另一個(gè)使用InnoDB。

8、分區(qū)的名字是不區(qū)分大小寫(xiě)的,myp1與MYp1是相同的。

分區(qū)的管理

range與list分區(qū)的改變動(dòng)作不能適用于hash與key方式的分區(qū)。刪除與添加動(dòng)作是都能使用的。

以下面的例子復(fù)制代碼代碼如下:

DROPTABLEIFEXISTS`p_list`;

CREATETABLE`p_list`(

`id`int(10)NOTNULLAUTO_INCREMENT,

`typeid`mediumint(10)NOTNULLDEFAULT'0',

`typename`char(20)DEFAULTNULL,

PRIMARYKEY(`id`,`typeid`)

)ENGINE=MyISAMAUTO_INCREMENT=9DEFAULTCHARSET=utf8

/*!50100PARTITIONBYLIST(typeid)

(PARTITIONp0VALUESIN(1,2,3,4)ENGINE=MyISAM,

PARTITIONp1VALUESIN(5,6,7,8)ENGINE=MyISAM)*/;

range與list分區(qū)的管理

刪除分區(qū)

ALTERTABLEtrDROPPARTITIONp1;

需要注意的是刪除分區(qū)后,該分區(qū)的所有數(shù)據(jù)都沒(méi)有了。同時(shí)刪除后存在一個(gè)重大影響也就是typeid為5,6,7,8的記錄是不能寫(xiě)入到該表了的!

清空數(shù)據(jù)

如果想要保留表結(jié)構(gòu)與分區(qū)結(jié)構(gòu)可以使用TRUNCATETABLE清空表

更改分區(qū)保留數(shù)據(jù)

ALTERTABLEtbl_nameREORGANIZEPARTITIONpartition_listINTO(partition_definitions);如果想保留數(shù)據(jù)進(jìn)行分區(qū)的更改

ALTERTABLEp_listREORGANIZEPARTITIONp0INTO(

PARTITIONs0VALUESIN(1,2),

PARTITIONs1VALUESIN(3,4),

);這樣就能進(jìn)行分區(qū)的合并了,那怎么進(jìn)行拆分呢

ALTERTABLEp_listREORGANIZEPARTITIONs0,s1INTO(

PARTITIONp0VALUESIN(1,2,3,4),

);使用REORGANIZEPARTITION進(jìn)行數(shù)據(jù)的合并與拆分,數(shù)據(jù)是沒(méi)有丟失的。

在使用REORGANIZE進(jìn)行重新分區(qū)時(shí),需要注意幾點(diǎn):

1、用來(lái)確定新分區(qū)模式的PARTITION子句使用與用在CREATETABLE中確定分區(qū)模式的PARTITION子句相同的規(guī)則。(partition分區(qū)子句必須與創(chuàng)建原分區(qū)時(shí)的規(guī)則相同)

2、partition_definitions列表中分區(qū)的合集應(yīng)該與在partition_list中命名分區(qū)的合集占有相同的區(qū)間或值集合。(不管是合并還是拆分,s0,s1到p0;p0到s0,s1里面的區(qū)間或者值都必須相同)

3、對(duì)于按照RANGE分區(qū)的表,只能重新組織相鄰的分區(qū);不能跳過(guò)RANGE分區(qū)。(比如按range年份p01990,p12000,p22013三個(gè)分區(qū);在合并時(shí)partitionp0,p2into()

這樣是不行的,因?yàn)檫@兩個(gè)分區(qū)不是相鄰的分區(qū);)

4、不能使用REORGANIZEPARTITION來(lái)改變表的分區(qū)類(lèi)型;也就是說(shuō),例如,不能把RANGE分區(qū)變?yōu)镠ASH分區(qū),反之亦然。也不能使用該命令來(lái)改變分區(qū)表達(dá)式或列。

增加分區(qū)

ALTERTABLEp_listADDPARTITION(PARTITIONp2VALUESIN(9,10,11));

但是不能使用

ALTERTABLEp_listADDPARTITION(PARTITIONp2VALUESIN(9,14));

這樣mysql會(huì)產(chǎn)生錯(cuò)誤1465(HY000):在LIST分區(qū)中,同一個(gè)常數(shù)的多次定義

hash與key分區(qū)的管理在改變分區(qū)設(shè)置方面,按照HASH分區(qū)或KEY分區(qū)的表彼此非常相似,但是它們又與按照RANGE或LIST分區(qū)的表在很多方面有差別。

關(guān)于添加和刪除按照RANGE或LIST進(jìn)行分區(qū)的表的分區(qū)

不能使用與從按照RANGE或LIST分區(qū)的表中刪除分區(qū)相同的方式,來(lái)從HASH或KEY分區(qū)的表中刪除分區(qū)。但是,可以使用“ALTERTABLE...COALESCEPARTITION”命令來(lái)合并HASH或KEY分區(qū)。

查看源代碼打印幫助1DROPTABLEIFEXISTS`p_hash`;

2

3CREATETABLE`p_hash`(

4`id`int(10)NOTNULLAUTO_INCREMENT,

5`storeid`mediumint(10)NOTNULLDEFAULT'0',

6`storename`char(255)DEFAULTNULL,

7PRIMARYKEY(`id`,`storeid`)

8)ENGINE=InnoDBAUTO_INCREMENT=11DEFAULTCHARSET=utf8

9/*!50100PARTITIONBYHASH(storeid)

10PARTITIONS4*/;

如p_hash的分區(qū)數(shù)為4個(gè);

要減少分區(qū)數(shù)為2個(gè)

ALTERTABLEp_hashCOALESCEPARTITION2;

對(duì)于按照HASH,KEY,LINEARHASH,或LINEARKEY分區(qū)的表,COALESCE能起到同樣的作用。COALESCE不能用來(lái)增加分區(qū)的數(shù)量,如果你嘗試這么做,結(jié)果會(huì)出現(xiàn)類(lèi)似于下面的錯(cuò)誤:

mysql>ALTERTABLEclientsCOALESCEPARTITION18;

錯(cuò)誤1478(HY000):不能移動(dòng)所有分區(qū),使用DROPTABLE代替要增加顧客表的分區(qū)數(shù)量從12到18,使用“ALTERTABLE…ADDPARTITION”,具體如下:

ALTERTABLEclientsADDPARTITIONPARTITIONS18;注釋?zhuān)骸癆LTERTABLE…REORGANIZEPARTITION”不能用于按照HASH或HASH分區(qū)的表。

分區(qū)維護(hù)

重建分區(qū)

這和先刪除保存在分區(qū)中的所有記錄,然后重新插入它們,具有同樣的效果。它可用于整理分區(qū)碎片。

ALTERTABLEt1REBUILDPARTITION(p0,p1);

優(yōu)化分區(qū)如果從分區(qū)中刪除了大量的行,或者對(duì)一個(gè)帶有可變長(zhǎng)度的行(也就是說(shuō),有VARCHAR,BLOB,或TEXT類(lèi)型的列)作了許多修改,

可以使用“ALTERTABLE…OPTIMIZEPARTITI

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論