mysql分區partition詳解

分區管理  論壇php

1. RANGE和LIST分區的管理mysql

針對非整形字段進行RANG\LIST分區建議使用COLUMNS分區。 sql

 

RANGE COLUMNS是RANGE分區的一種特殊類型,它與RANGE分區的區別以下:
1. RANGE COLUMNS不接受表達式,只能是列名。而RANGE分區則要求分區的對象是整數。
2. RANGE COLUMNS容許多個列,在底層實現上,它比較的是元祖(多個列值組成的列表),而RANGE比較的是標量,即數值的大小。
3. RANGE COLUMNS不限於整數對象,date,datetime,string均可做爲分區列。express

 

 

CREATE TABLE rcx (
    a INT,
    b INT,
    c CHAR(3),
    d INT
)
PARTITION BY RANGE COLUMNS(a,d,c) (
    PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
    PARTITION p1 VALUES LESS THAN (10,20,'mmmm'),
    PARTITION p2 VALUES LESS THAN (15,30,'sss'),
    PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
);
View Code

 

添加less

CREATE TABLE IF NOT EXISTS `t1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'xxid',
  `store_id` int(10) unsigned NOT NULL,
  `customer_surname` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='xx表' AUTO_INCREMENT=1 partition by range(id)(
    partition p0 values less than(5), 
    partition p1 values less than(10), 
    partition p2 values less than(15)
);

追加ide

alter table t1 add partition(
    partition p3 values less than(20)
);
修改分區爲key類型的分區
#這和先刪除這個表、而後使用「CREATE TABLE t1 PARTITION BY KEY(id) PARTITIONS 2;」從新建立這個表具備一樣的效果
ALTER TABLE t1 partition by key(id) partition 2;
若是但願改變表的分區而又不丟失數據,使用「ALTER TABLE ... REORGANIZE PARTITION」語句
#分解分區  將p0拆分爲s0和s1
ALTER TABLE members REORGANIZE PARTITION p0 INTO (
    PARTITION s0 VALUES LESS THAN (3),
    PARTITION s1 VALUES LESS THAN (5)
);

#合併分區  將s0和s1合併爲p0
ALTER TABLE members REORGANIZE PARTITION s0,s1 INTO (
    PARTITION p0 VALUES LESS THAN (5)
);

#合併分區  將s0和s1合併爲 r0 r1
ALTER TABLE members REORGANIZE PARTITION s0,s1 INTO (
    PARTITION s0 VALUES LESS THAN (2),
    PARTITION p0 VALUES LESS THAN (5)
);

刪除分區函數

#當刪除了一個分區,也同時刪除了該分區中全部的數據
ALTER TABLE t1 drop partition p0,p1,p2,p3;
#若是但願從全部分區刪除全部的數據,可是又保留表的定義和表的分區模式,使用TRUNCATE TABLE命令

2. HASH和KEY分區的管理優化

增長:spa

CREATE TABLE clients(
    id INT NOT NULL,
    firstname VARCHAR(30),
    lastname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',    
signed DATE ) PARTITION BY HASH(MONTH(signed)) PARTITIONS 12;
//將hash類型的分區分爲12個
//基於時間類型的字段的轉換函數mysql提供了"YEAR(),MONTH(),DAY(),TO_DAYS(),TO_SECONDS(),WEEKDAY(),DAYOFYEAR()

 

修改:coalescecode

#將12個分區改成6個
ALTER TABLE clients COALESCE PARTITION 6;

 

刪除

???

 

 

3. 分區維護

。對於分區表,MySQL不支持命令CHECK TABLE,OPTIMIZE TABLE,ANALYZE TABLE,或REPAIR TABLE。做爲替代,可使用ALTER TABLE 的許多擴展來在一個或多個分區上直接地執行這些操做,以下面列出的那樣

重建分區:

ALTER TABLE t1 REBUILD PARTITION (p0, p1);
 優化分區:若是從分區中刪除了大量的行,或者對一個帶有可變長度的行(也就是說,有VARCHAR,BLOB,或TEXT類型的列)做了許多修改,可使用「ALTER TABLE ... OPTIMIZE PARTITION」來收回沒有使用的空間,並整理分區數據文件的碎片

4. 獲取關於分區的信息

#在一個給定的分區表上使用「OPTIMIZE PARTITION」等同於在那個分區上運行CHECK PARTITION,ANALYZE PARTITION,和REPAIR PARTITION。 
ALTER TABLE t1 OPTIMIZE PARTITION (p0, p1);
分析分區:讀取並保存分區的鍵分佈
ALTER TABLE t1 ANALYZE PARTITION (p3);
修補分區: 修補被破壞的分區。
ALTER TABLE t1 REPAIR PARTITION (p0,p1);
檢查分區: 可使用幾乎與對非分區表使用CHECK TABLE 相同的方式檢查分區
#這個命令能夠告訴你表t1的分區p1中的數據或索引是否已經被破壞。若是發生了這種狀況,使用「ALTER TABLE ... REPAIR PARTITION」來修補該分區
ALTER TABLE trb3 CHECK PARTITION (p1);
#還可使用mysqlcheck或myisamchk 應用程序,在對錶進行分區時所產生的、單獨的MYI文件上進行操做,來完成這些任務。請參見8.7節,「mysqlcheck:表維護和維修程序」

 

4.獲取關於分區的信息

查看建表結構

SHOW CREATE TABLE  表名;#當前,對於按HASH或KEY分區的表,PARTITIONS子句並不顯示

 查看是否支持分區

SHOW VARIABLES LIKE '%partition%';

表的各類參數狀態

SHOW TABLE STATUS

 查看分區狀況:

select
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
from information_schema.partitions where
table_schema = schema()
and table_name='填入你要查看的表名';

經過數據字典查看分區信息

select * from information_schema.partitions;

經過此語句掃描分區及其使用狀況

explain partitions select * from mdl_user;
相關文章
相關標籤/搜索