一、維護分區
對於表的維護,我們一般有如下幾種方式: CHECK TABLE, OPTIMIZE TABLE, ANALYZE TABLE和REPAIR TABLE。
而這幾種方式,對於分區同樣適用。下面,我們一一闡述各種的作用。
1. Rebuilding partitions
重建分區,它相當於先刪除分區中的數據,然後重新插入。這個主要是用於分區的碎片整理。
譬如:
ALTER TABLE t1 REBUILD PARTITION p0, p1;
2. Optimizing partitions
該命令主要是用於回收空閒空間和分區的碎片整理。對分區執行該命令,相當於依次對分區執行 CHECK PARTITION, ANALYZE PARTITION,REPAIR PARTITION命令。
譬如:
ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;
注意:
一些存儲引擎,譬如InnoDB,並不支持基於分區的Optimizing。當你執行該命令時,會rebuild整張表,在 MySQL 5.6.9版本以上,執行該命令會導致整張表被rebuild和analyze。在這種情況下,建議直接使用 ALTER TABLE ... REBUILD PARTITION 或 ALTER TABLE ... ANALYZE PARTITION。
3. Analyzing partitions
讀取和存儲分區中值的分布情況
ALTER TABLE t1 ANALYZE PARTITION p3;
4. Repairing partitions
修復被破壞的分區
ALTER TABLE t1 REPAIR PARTITION p0,p1;
5. Checking partitions
檢查分區是否存在錯誤
ALTER TABLE trb3 CHECK PARTITION p1;
注意:
1> mysqlcheck和myisamchk並不支持分區表
2> 上述分區名也可用all替代,指的是對所有分區進行操作。
3> ANALYZE, CHECK, OPTIMIZE, REBUILD, REPAIR和TRUNCATE命令並不適用於子分區。
二、如何獲取分區的相關信息
1. 通過 SHOW CREATE TABLE 語句來查看分區表的分區子句
譬如:
mysql> show create table e\G *************************** 1. row *************************** Table: e Create Table: CREATE TABLE `e` ( `id` int(11) NOT NULL, `fname` varchar(30) DEFAULT NULL, `lname` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (50) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (100) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (150) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ 1 row in set (0.00 sec)
2. 通過 SHOW TABLE STATUS 語句來查看表是否分區
對應Create_options字段,譬如:
mysql> show table status\G *************************** 1. row *************************** Name: e Engine: InnoDB Version: 10 Row_format: Compact Rows: 6 Avg_row_length: 10922 Data_length: 65536 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2015-12-07 22:26:06 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: partitioned Comment:
3. 查看 INFORMATION_SCHEMA.PARTITIONS表
4. 通過 EXPLAIN PARTITIONS SELECT 語句查看對於具體的SELECT語句,會訪問哪個分區。
三、分區交換
分區交換的語法如下:
ALTER TABLE pt EXCHANGE PARTITION p WITH TABLE nt
其中,pt是分區表,p是pt的分區(注:也可以是子分區),nt是目標表。
其實,分區交換的限制還是蠻多的:
1> nt不能為分區表
2> nt不能為臨時表
3> nt和pt的結構必須一致
4> nt不存在任何外鍵約束,即既不能是主鍵,也不能是外鍵。
5> nt中的數據不能位於p分區的范圍之外。
具體可參考MySQL的官方文檔
http://dev.mysql.com/doc/refman/5.6/en/partitioning-management-exchange.html