mysql partition

part 1:  需求

很多時候,如果一個表的數據足夠大的時候,操作(query,insert) 的效率就會降低。此時將一個表分區就變得必要


part 2: 幫助信息

url 1: http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

# mysql 官方文檔,講解mysql partition 

url 2: http://dev.mysql.com/doc/refman/5.1/en/alter-table-partition-operations.html

# mysql官方文檔,講解mysqll 修改分區

url 3: http://www.jzxue.com/shujuku/mysql/200912/24-3297.html

or  http://www.jz123.cn/text/0826274.html 

# 如果英文或是耐心不是太差,看url 1 和 url 2 的英文文檔再加上測試就足夠了。這裏的中文文檔也挺好的,可以看一下。


part 3: 概要講解 & 應用舉例

1:mysql partition 的類型主要有 range, list, hash, key 四種, 具體的語法結構和示例如下:

type 1: range

CREATE TABLE employees (
    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 (21),

    PARTITION p3 VALUES LESS THAN MAXVALUE

);


type 2: list

CREATE TABLE employees (
    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 pNorth VALUES 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)
);


type 3: hash

CREATE TABLE employees (
    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( YEAR(hired) )
PARTITIONS 4;

type 4: key

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;


2:mysql 子分區

CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) )
    SUBPARTITIONS 2 (
        PARTITION p0 VALUES LESS THAN (1990),
        PARTITION p1 VALUES LESS THAN (2000),
        PARTITION p2 VALUES LESS THAN MAXVALUE
    );


3: mysql 添加分區

mysql>alter table T_LOCATION add partition (partition p2012_09_01 values less than (TO_DAYS('2012-09-1'))); 


4: mysql 刪除分區

mysql>alter table T_LOCATION_days drop partition p2012_09_01 ;

#NOTE: hash 分區中有 coalesce 分區


5: mysql 修改分區

mysql> alter table T_LOCATION reorganize partition p2012_09_01 into  (partition p2012_10_01 values less than (TO_DAYS('2012-10-1')));
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0


7: 查看分區信息

mysql> select   TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH  
 from  INFORMATION_SCHEMA.PARTITIONS  
where TABLE_SCHEMA = 'LN_PABB' ;


8: 顯示query 涉及的分區

mysql> explain partitions select count(*) from T_LOCATION_days  where timestamp  =   '2010-05-05' \G;  -- and timestamp < '2010-07-27'  \G;


part 4: 常見問題

#todo


part 5: 規律總結

#todo

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