《MYSQL數(shù)據(jù)庫(kù)深入淺析MySQL COLUMNS分區(qū)》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫(kù)深入淺析MySQL COLUMNS分區(qū),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
介紹MYSQL入門
COLUMN分區(qū)是5.5開始引入的分區(qū)功能,只有RANGE COLUMN和LIST COLUMN這兩種分區(qū);支持整形、日期、字符串;RANGE和LIST的分區(qū)方式非常的相似.MYSQL入門
COLUMNS和RANGE和LIST分區(qū)的區(qū)別MYSQL入門
1.針對(duì)日期字段的分區(qū)就不需要再使用函數(shù)進(jìn)行轉(zhuǎn)換了,例如針對(duì)date字段進(jìn)行分區(qū)不需要再使用YEAR()表達(dá)式進(jìn)行轉(zhuǎn)換.MYSQL入門
2.COLUMN分區(qū)支持多個(gè)字段作為分區(qū)鍵但是不支持表達(dá)式作為分區(qū)鍵.MYSQL入門
COLUMNS支持的類型MYSQL入門
整形支持:tinyint,smallint,mediumint,int,bigint;不支持decimal和floatMYSQL入門
時(shí)間類型支持:date,datetimeMYSQL入門
字符類型支持:char,varchar,binary,varbinary;不支持text,blobMYSQL入門
一、RANGE COLUMNS分區(qū)MYSQL入門
1.日期字段分區(qū)MYSQL入門
CREATE TABLE members ( id INT, joined DATE NOT NULL ) PARTITION BY RANGE COLUMNS(joined) ( PARTITION a VALUES LESS THAN ('1960-01-01'), PARTITION b VALUES LESS THAN ('1970-01-01'), PARTITION c VALUES LESS THAN ('1980-01-01'), PARTITION d VALUES LESS THAN ('1990-01-01'), PARTITION e VALUES LESS THAN MAXVALUE );
1.插入測(cè)試數(shù)據(jù)MYSQL入門
insert into members(id,joined) values(1,'1950-01-01'),(1,'1960-01-01'),(1,'1980-01-01'),(1,'1990-01-01');
2.查詢分區(qū)數(shù)據(jù)分布MYSQL入門
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='members';
當(dāng)前有5個(gè)分區(qū)只插入了4條記錄,其中C分區(qū)是沒有記錄的,結(jié)果和實(shí)際一樣.MYSQL入門
MYSQL入門
3.分析執(zhí)行計(jì)劃MYSQL入門
explain select id,joined from tb_partition.members where joined=YEAR(now()); explain select id,joined from tb_partition.members where joined='1963-01-01';
MYSQL入門
第一條查詢使用了函數(shù)導(dǎo)致查詢沒有走具體的分區(qū)而是掃描的所有的分區(qū),而第二條查詢執(zhí)行語句查找具體的分區(qū).MYSQL入門
2.多個(gè)字段組合分區(qū)MYSQL入門
CREATE TABLE rcx ( a INT, b INT ) PARTITION BY RANGE COLUMNS(a,b) ( PARTITION p0 VALUES LESS THAN (5,10), PARTITION p1 VALUES LESS THAN (10,20), PARTITION p2 VALUES LESS THAN (15,30), PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE) );
注意:多字段的分區(qū)鍵比較是基于數(shù)組的比較.它先用插入的數(shù)據(jù)的第一個(gè)字段值和分區(qū)的第一個(gè)值進(jìn)行比較,如果插入的第一個(gè)值小于分區(qū)的第一個(gè)值那么就不需要比較第二個(gè)值就屬于該分區(qū);如果第一個(gè)值等于分區(qū)的第一個(gè)值,開始比較第二個(gè)值同樣如果第二個(gè)值小于分區(qū)的第二個(gè)值那么就屬于該分區(qū).MYSQL入門
MYSQL入門
例如:MYSQL入門
insert into rcx(a,b)values(1,20),(10,15),(10,30);
第一組值:(1,20);1<5所以不需要再比較20了,該記錄屬于p0分區(qū).MYSQL入門
第二組值:(10,15),10>5,10=10且15<20,所以該記錄屬于P1分區(qū)MYSQL入門
第三組值:(10,30),10=10但是30>20,所以它不屬于p1,它滿足10<15所以它屬于p2MYSQL入門
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='rcx';
MYSQL入門
注意:RANGE COLUMN的多列分區(qū)第一列的分區(qū)值一定是順序增長(zhǎng)的,不能出現(xiàn)交叉值,第二列的值隨便,例如以下分區(qū)就會(huì)報(bào)錯(cuò)MYSQL入門
PARTITION BY RANGE COLUMNS(a,b) ( PARTITION p0 VALUES LESS THAN (5,10), PARTITION p1 VALUES LESS THAN (10,20), PARTITION p2 VALUES LESS THAN (8,30), PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE) );
由于分區(qū)P2的第一列比P1的第一列要小,所以報(bào)錯(cuò),后面的分區(qū)第一列的值一定要比前面分區(qū)值要大,第二列沒規(guī)定.MYSQL入門
二、LIST COLUMNS分區(qū)MYSQL入門
1.非整形字段分區(qū)MYSQL入門
CREATE TABLE listvar ( id INT NOT NULL, hired DATETIME NOT NULL ) PARTITION BY LIST COLUMNS(hired) ( PARTITION a VALUES IN ('1990-01-01 10:00:00','1991-01-01 10:00:00'), PARTITION b VALUES IN ('1992-01-01 10:00:00'), PARTITION c VALUES IN ('1993-01-01 10:00:00'), PARTITION d VALUES IN ('1994-01-01 10:00:00') ); ALTER TABLE listvar ADD INDEX ix_hired(hired); INSERT INTO listvar() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(1,'1992-01-01 10:00:00'),(1,'1993-01-01 10:00:00');
LIST COLUMNS分區(qū)對(duì)分整形字段進(jìn)行分區(qū)就無需使用函數(shù)對(duì)字段處理成整形,所以對(duì)非整形字段進(jìn)行分區(qū)建議選擇COLUMNS分區(qū).MYSQL入門
MYSQL入門
EXPLAIN SELECT * FROM listvar WHERE hired='1990-01-01 10:00:00';
MYSQL入門
2.多字段分區(qū)MYSQL入門
CREATE TABLE listvardou ( id INT NOT NULL, hired DATETIME NOT NULL ) PARTITION BY LIST COLUMNS(id,hired) ( PARTITION a VALUES IN ( (1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00') ), PARTITION b VALUES IN ( (2,'1992-01-01 10:00:00') ), PARTITION c VALUES IN ( (3,'1993-01-01 10:00:00') ), PARTITION d VALUES IN ( (4,'1994-01-01 10:00:00') ) ); ALTER TABLE listvardou ADD INDEX ix_hired(hired); INSERT INTO listvardou() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(2,'1992-01-01 10:00:00'),(3,'1993-01-01 10:00:00'); SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='listvardou';
MYSQL入門
EXPLAIN SELECT * FROM listvardou WHERE id=1 and hired='1990-01-01 10:00:00';
MYSQL入門
由于分區(qū)是組合字段,filtered只有50%,對(duì)于組合分區(qū)索引也最好是建組合索引,其實(shí)如果能通過id字段刷選出數(shù)據(jù),單獨(dú)建id字段的索引也是有效果的,但是組合索引的效果是最好的,其實(shí)和非分區(qū)鍵索引的概念差不多.MYSQL入門
ALTER TABLE listvardou ADD INDEX ix_hired1(id,hired);
MYSQL入門
備注:文章中的示例摘自mysql官方參考手冊(cè)MYSQL入門
三、移除表的分區(qū)MYSQL入門
ALTER TABLE tablename REMOVE PARTITIONING ;
注意:使用remove移除分區(qū)是僅僅移除分區(qū)的定義,并不會(huì)刪除數(shù)據(jù)和drop PARTITION不一樣,后者會(huì)連同數(shù)據(jù)一起刪除MYSQL入門
總結(jié)MYSQL入門
RANGE COLUMNS和LIST COLUMNS分區(qū)其實(shí)是RANG和LIST分區(qū)的升級(jí),所以可以直接使用COLUMN分區(qū).注意COLUMNS分區(qū)不支持timestamp字段類型.MYSQL入門
以上所述是小編給大家介紹的MySQL COLUMNS分區(qū),希望對(duì)大家有所贊助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的.在此也非常感謝大家對(duì)維易PHP網(wǎng)站的支持!MYSQL入門
歡迎參與《MYSQL數(shù)據(jù)庫(kù)深入淺析MySQL COLUMNS分區(qū)》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/13086.html