MySQL表分區使用詳解

MySQL表分區使用詳解

一、表分區概述

1. 什麼是表分區?

    表分區,是指根據一定規則,將數據庫中的一張表分解成多個更小的,容易管理的部分。從邏輯上看,只有一張        表,但是底層卻是由多個物理分區組成。

2. 表分區與分表的區別

   分表:指的是通過一定規則,將一張表分解成多張不同的表。比如將用戶訂單記錄根據時間成多個表。 分表與分  區的區別在於:分區從邏輯上來講只有一張表,而分表則是將一張表分解成多張表。

3. 表分區有什麼好處?

    1)分區表的數據可以分佈在不同的物理設備上,從而高效地利用多個硬件設備。

    2)和單個磁盤或者文件系統相比,可以存儲更多數據

    3)優化查詢。在where語句中包含分區條件時,可以只掃描一個或多個分區表來提高查詢效率;涉及sumcount語句時,也可以在多個分區上並行處理,最後彙總結果。

    4)分區表更容易維護。例如:想批量刪除大量數據可以清除整個分區。

    5)可以使用分區表來避免某些特殊的瓶頸,例如InnoDB的單個索引的互斥訪問,ext3問價你係統的inode鎖競爭等。

4. 分區表的限制因素

1)一個表最多只能有1024個分區

2MySQL5.1中,分區表達式必須是整數,或者返回整數的表達式。在MySQL5.5中提供了非整數表達式分區的支持。

3)如果分區字段中有主鍵或者唯一索引的列,那麼多有主鍵列和唯一索引列都必須包含進來。即:分區字段要麼不包含主鍵或者索引列,要麼包含全部主鍵和索引列。

 4)分區表中無法使用外鍵約束

5mysql的分區適用於一個表的所有數據和索引,不能只對表數據分區而不對索引分區,也不能只對索引分區而不對錶分區,也不能只對表的一部分數據分區。

*效率

http://blog.csdn.net/king_818/article/details/51395589

二、分區方式

1.RANGE Partitioning(範圍分區)

   This type ofpartitioning assigns rows to partitions based on column values falling within agivenrange

   例子:

CREATE TABLE employees_range(

    id INT NOT NULL,

    fname VARCHAR(30),

    lname VARCHAR(30),

    hired DATE NOT NULL DEFAULT '1970-01-01',

    separated DATE NOT NULL DEFAULT'9999-12-31',

    job_code INT NOT NULL,

    store_id INT NOT NULL

)

PARTITION BY RANGE (store_id) (

    PARTITION p0 VALUES LESS THAN (6),

    PARTITION p1 VALUES LESS THAN (11),

    PARTITION p2 VALUES LESS THAN (16),

    PARTITION p3 VALUES LESS THAN MAXVALUE

);


備註:時間等類型均可

2.LIST Partitioning(預定義列表分區)

Similar topartitioning by RANGE, except that the partition is selected based on columnsmatching one of a set of discrete values

例子:

CREATE TABLE employees_list (

    id INT NOT NULL,

    fname VARCHAR(30),

    lname VARCHAR(30),

    hired DATE NOT NULL DEFAULT '1970-01-01',

    separated DATE NOT NULL DEFAULT'9999-12-31',

    job_code INT,

    store_id INT

)

PARTITION BY LIST(store_id)(

    PARTITION pNorthVALUES IN (3,5,6,9,17),

    PARTITION pEast VALUES IN(1,2,10,11,19,20),

    PARTITION pWest VALUES IN(4,12,13,14,18),

    PARTITION pCentral VALUES IN(7,8,15,16)

);


3.HASH Partitioning(哈希分區)

With this type ofpartitioning, a partition is selected based on the value returned by auser-defined expression that operates on column values in rows to be insertedinto the table. The function may consist of any expression valid in MySQL thatyields a nonnegative integer value. An extension to this type, LINEAR HASH, isalso available

CREATE TABLE employees_hash(

    id INT NOT NULL,

    fname VARCHAR(30),

    lname VARCHAR(30),

    hired DATE NOT NULL DEFAULT '1970-01-01',

    separated DATE NOT NULL DEFAULT'9999-12-31',

    job_code INT,

    store_id INT

)

PARTITION BY HASH(store_id)

PARTITIONS 4;


備註:根據哈希函數,下篇文章進行詳解

4.KEY Partitioning(鍵值分區

This type ofpartitioning is similar to partitioning by HASH, except that only one or morecolumns to be evaluated are supplied, and the MySQL server provides its ownhashing function. These columns can contain other than integer values, sincethe hashing function supplied by MySQL guarantees an integer result regardlessof the column data type. An extension to this type, LINEAR KEY, is alsoavailable

例子:

CREATE TABLE employees_key (

    id INT NOT NULL,

    fname VARCHAR(30),

    lname VARCHAR(30),

    hired DATE NOT NULL DEFAULT '1970-01-01',

    separated DATE NOT NULL DEFAULT'9999-12-31',

    job VARCHAR(30) NOT NULL,

    store_id INT

)

PARTITION BY KEY(job)

PARTITIONS 4


備註:

*不支持用戶自定義表達式

*支持blobtext類型外的其它類型作爲分區鍵

*創建Key分區表的時候,可以不指定分區鍵,默認會首先選擇使用主        鍵作爲分區

*liner key expr

V = POWER(2,CEILING(LOG(2, num)))

5.COMPOSITE(複合分區)

MySQLVersion>=5.6

子分區其實是對每個分區表的每個分區進行再次分隔,目前只有RANGELIST分區的表可以再進行子分區,子分區只能是HASH或者KEY分區。子分區可以將原本的數據進行再次的分區劃分。



例子:

CREATE TABLE employees_range_hash (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY RANGE(TO_DAYS(hired))
SUBPARTITION BY HASH(store_id) (
	PARTITION p0 VALUES LESS THAN (1990) (
		SUBPARTITION s0,
		SUBPARTITION s1
	),
	PARTITION p1 VALUES LESS THAN (2000) (
		SUBPARTITION s2,
		SUBPARTITION s3
	),
	PARTITION p2 VALUES LESS THAN MAXVALUE (
		SUBPARTITION s4,
		SUBPARTITION s5
	)
);


三、分區操作命令整理

1.查詢分區

SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME=' employees_list ';
2.增加/刪除./合併

FOR RANGE /LIST

*增加分區

alter table table_name add partition(partition p0 values ...(exp))

*刪除分區

alter table table_name drop partition[partition name];

*拆分合並分區

ALTER TABLE table_nameREORGANIZEPARTITION p0 INTO (

    PARTITION s0 VALUES LESS THAN (3),

    PARTITION s1 VALUES LESS THAN (6)

);

FOR HASH /KEY

*增加分區

alter table table_name add partitionpartitions[num];

*刪除分區

alter table table_name coalesce partition[num];

*拆分合並分區

ALTER TABLE table_nameREORGANIZEPARTITION p0 INTO (

    PARTITION s0 VALUES LESS THAN (3),

    PARTITION s1 VALUES LESS THAN (6)

)

*移除表的分區

ALTER TABLE tablename REMOVE PARTITIONING ;

*分區針對日期字段進行分區可以使用時間類型的函數進行轉換成整形,但是如果你的查詢語句需要利用分區那麼查詢語句也需要使用相同的時間函數進行查詢。to_days(date), year(date)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章