【MySQL使用分區(qū)表的好處】
1.可以把一些歸類(lèi)的數(shù)據(jù)放在一個(gè)分區(qū)中,可以減少服務(wù)器檢查數(shù)據(jù)的數(shù)量加快查詢(xún)。
2.方便維護(hù),通過(guò)刪除分區(qū)來(lái)刪除老的數(shù)據(jù)。
3.分區(qū)數(shù)據(jù)可以被分布到不同的物理位置,可以做分布式有效利用多個(gè)硬盤(pán)驅(qū)動(dòng)器。
【MySQL可以建立四種分區(qū)類(lèi)型的分區(qū)】
RANGE 分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
LIST 分區(qū):類(lèi)似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。
HASH分區(qū):基于用戶(hù)定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
KEY 分區(qū):類(lèi)似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。
一般用得多的是range分區(qū)和list分區(qū)。
【查看是否支持分區(qū)】
show variables like "%part%";
【如何查看mysql分區(qū)信息】
select * from INFORMATION_SCHEMA.PARTITIONS where table_name='user'; (這里查看user表的分區(qū)信息)
【查看執(zhí)行一條查詢(xún)SQL會(huì)掃描的分區(qū)】
explain partitions select * from user where id=10;
【如何創(chuàng)建分區(qū)】
1.建表時(shí)就分區(qū):
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶(hù)ID',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '名稱(chēng)',
`sex` int(1) NOT NULL DEFAULT '0' COMMENT '0為男,1為女',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN (3),
PARTITION p1 VALUES LESS THAN (6),
PARTITION p2 VALUES LESS THAN (9),
PARTITION p3 VALUES LESS THAN (12),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
2.對(duì)現(xiàn)有表進(jìn)行分區(qū):可以對(duì)現(xiàn)有表進(jìn)行分區(qū),并且會(huì)按規(guī)則自動(dòng)的將表中的數(shù)據(jù)分配相應(yīng)的分區(qū)中
alter table 表名 partition by RANGE(字段)
(PARTITION p1 VALUES less than (1),
PARTITION p2 VALUES less than (5),
PARTITION p3 VALUES less than MAXVALUE);
【刪除一個(gè)分區(qū)】
(當(dāng)刪除了一個(gè)分區(qū),也同時(shí)刪除了該分區(qū)中所有的數(shù)據(jù))
ALTER TABLE 表名 DROP PARTITION p2;
【分區(qū)合并】
下面的SQL,將p201001 - p201009 合并為3個(gè)分區(qū)p2010Q1 - p2010Q3
ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);
【分區(qū)的拆分】
下面的SQL,將p2010Q1 分區(qū),拆分為s2009 與s2010 兩個(gè)分區(qū)
ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO (
PARTITION s2009 VALUES LESS THAN (201001),
PARTITION s2010 VALUES LESS THAN (201004)
);
【分區(qū)索引的局限】
1.所有分區(qū)都要使用同樣的引擎。
2.分區(qū)表的每一個(gè)唯一索引必須包含由分區(qū)函數(shù)引用的列。
3.mysql能避免查詢(xún)所有的分區(qū),但仍然鎖定了所有分區(qū)。
4.分區(qū)函數(shù)能使用的函數(shù)和表達(dá)式有限,例如函數(shù)有上面的4種。
5.分區(qū)不支持外鍵。
6.不能使用LOAD INDEX INTO CACHE
7.分區(qū)并不能總是改善性能,要進(jìn)行性能評(píng)測(cè)。