mysql分區(qū)

mysql分區(qū)

Mysql支持水平分區(qū),并不支持垂直分區(qū);
水平分區(qū):指將同一表中不同行的記錄分配到不同的物理文件中;
垂直分區(qū):指將同一表中不同列的記錄分配到不同的物理文件中;
其中CSV、FEDORATED、MERGE等引擎不支持分區(qū),MYISAM、InnoDB、NDB等引擎支持分區(qū)

目的

將一個(gè)表或索引分解為多個(gè)更小、更可管理的部分,從邏輯上講,只有一個(gè)表或者索引,但是物理上這個(gè)表或者索引可能由數(shù)十個(gè)物理分區(qū)組成;每個(gè)分區(qū)都是獨(dú)立的對象,可以獨(dú)自處理,也可以作為一個(gè)更大對象的一部分進(jìn)行處理(如果分區(qū)表很大,亦可以將分區(qū)分配到不同的磁盤上去);在執(zhí)行查詢的時(shí)候,優(yōu)化器會(huì)根據(jù)分區(qū)定義過濾哪些沒有我們需要數(shù)據(jù)的分區(qū),這樣查詢就無須全表掃描所有分區(qū),只查找包含需要數(shù)據(jù)的分區(qū)即可

適用場景

  1. 表非常大以至于無法全部都放到內(nèi)存,或者只在表的最后部分有熱點(diǎn)數(shù)據(jù),其他均為歷史數(shù)據(jù)
  2. 分區(qū)表數(shù)據(jù)更容易維護(hù)(可獨(dú)立對分區(qū)進(jìn)行優(yōu)化、檢查、修復(fù)及批量刪除大數(shù)據(jù)可以采用drop分區(qū)的形式等)
  3. 分區(qū)表的數(shù)據(jù)可以分布在不同的物理設(shè)備上,從而高效地利用多個(gè)硬件設(shè)備
  4. 分區(qū)表可以避免某些特殊的瓶頸(ps: InnoDB的單個(gè)索引的互斥訪問、ext3文件系統(tǒng)的inode鎖競爭等)
  5. 可以備份和恢復(fù)獨(dú)立的分區(qū),非常適用于大數(shù)據(jù)集的場景

分區(qū)表限制

  • 單表最多支持1024個(gè)分區(qū)
  • MySQL5.1只能對數(shù)據(jù)表的整型列進(jìn)行分區(qū),或者數(shù)據(jù)列可以通過分區(qū)函數(shù)轉(zhuǎn)化成整型列;
  • MySQL5.5的RANGE LIST類型可以直接使用列進(jìn)行分區(qū)
  • 如果分區(qū)字段中有主鍵或唯一索引的列,那么所有的主鍵列和唯一索引列都必須包含進(jìn)來
  • 分區(qū)表無法使用外鍵約束
  • 分區(qū)必須使用相同的Engine
  • 對于MyISAM分區(qū)表,不能在使用LOAD INDEX INTO CACHE操作
  • 對于MyISAM分區(qū)表,使用時(shí)會(huì)打開更多的文件描述符(單個(gè)分區(qū)是一個(gè)獨(dú)立的文件)

分區(qū)策略

  • 全量掃描數(shù)據(jù),不需要任何索引:通過where條件大概定位哪個(gè)分區(qū),必須將查詢所需要掃描的分區(qū)個(gè)數(shù)限制在很小的數(shù)量
  • 建立分區(qū)索引,分離熱點(diǎn):如將明顯的熱點(diǎn)數(shù)據(jù)分離到一個(gè)分區(qū),使其盡量緩存到內(nèi)存中,這樣就能充分使用索引和緩存
  • 注意:以上策略均以查詢得到過濾,丟掉額外的分區(qū),分區(qū)本身不產(chǎn)生額外的代價(jià)為準(zhǔn)則】

分區(qū)表使用過程的坑

  • NULL值會(huì)使分區(qū)過濾無效:

分表的表達(dá)式的值可以是NULL,第一個(gè)分區(qū)為特殊分區(qū)存放NULL或者非法值
如: PARTITION BY RANGE YEAR(order_date)進(jìn)行分區(qū),那么order_date為NULL或者非法值,記錄存放在第一個(gè)分區(qū):
WHERE order_date BETWEEN ‘2014-01-01’ AND ‘2014-01-31’查詢時(shí)會(huì)檢查兩個(gè)分區(qū):
第一個(gè)分區(qū)及1月份分區(qū),避免第一分區(qū)數(shù)據(jù)過大時(shí)造成查詢代價(jià)過高,可以使用:建立第一分區(qū)專門存放order_date為NULL和非法值記錄 PARTITION p_nulls VALUES LESS THAN(0)

MySQL5.5以后可以才用一下語法解決問題: PARTITION BY RANGE COLUMNS(order_date)

  • 分區(qū)列和索引列不匹配

此種情況下查詢無法進(jìn)行分區(qū)過濾,分區(qū)失效除非查詢中包含了可以過濾分區(qū)的條件

RANGE類型分區(qū)隨著分區(qū)數(shù)量增加會(huì)對MYSQL額外增加查詢分區(qū)定義列表(符合條件行在哪個(gè)分區(qū))的壓力,盡量限制適當(dāng)?shù)姆謪^(qū)數(shù)量;key和hash類型分區(qū)不存在此問題
重組分區(qū)或者類似alter語句可能會(huì)造成很大的開銷
新建或者刪除分區(qū)操作很快,重組分區(qū)或者類似ALTER語句操作會(huì)先創(chuàng)建一個(gè)臨時(shí)的分區(qū),將數(shù)據(jù)復(fù)制其中,然后在刪除原分區(qū)

分區(qū)表類型

  1. RANGE分區(qū):行數(shù)據(jù)基于屬于一個(gè)給定連續(xù)區(qū)間的列值被放入分區(qū)

MySQL5.5開始支持RANGE COLUMNS的分區(qū)(引入Columns分區(qū)解決了MySQL 5.5版本之前RANGE分區(qū)和LIST分區(qū)只支持整數(shù)分區(qū),從而導(dǎo)致需要額外的函數(shù)計(jì)算得到整數(shù)或者通過額外的轉(zhuǎn)換表來轉(zhuǎn)換為整數(shù)再分區(qū)的問題。Columns分區(qū)可以細(xì)分為RANGE Columns分區(qū)和LIST Columns分區(qū),RANGE Columns分區(qū)和LIST Columns分區(qū)都支持整數(shù)、日期時(shí)間、字符串三大數(shù)據(jù)類型)

  1. LIST分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來進(jìn)行選擇。
    MySQL5.5開始支持RANGE COLUMNS的分區(qū)

  2. COLUMNS分區(qū):可以無需通過表達(dá)式進(jìn)行轉(zhuǎn)換直接對非整形字段進(jìn)行分區(qū),同時(shí)COLUMNS分區(qū)還支持多個(gè)字段組合分區(qū),只有RANGELIST存在COLUMNS分區(qū),COLUMNS是RANGE和LIST分區(qū)的升級。

  3. HASH分區(qū):基于給定的分區(qū)個(gè)數(shù),將數(shù)據(jù)分配到不同的分區(qū),HASH分區(qū)只能針對整數(shù)進(jìn)行HASH,對于非整形的字段只能通過表達(dá)式將其轉(zhuǎn)換成整數(shù)。

  4. KEY分區(qū):根據(jù)MySQLS數(shù)據(jù)庫提供的哈希函數(shù)來進(jìn)行分區(qū) 【注:無論創(chuàng)建何種類型的分區(qū),如果表中存在主鍵或唯一索引時(shí),分區(qū)列必須是唯一索引的一個(gè)組成部分】支持除text和BLOB之外的所有數(shù)據(jù)類型的分區(qū),key分區(qū)可以直接基于字段做分區(qū)無需轉(zhuǎn)換成整數(shù)。

說明

  1. 注意分區(qū)名的大小寫敏感問題,和關(guān)鍵字問題。

  2. 無論哪種分區(qū)類型,要么分區(qū)表中沒有主鍵或唯一鍵,要么主鍵或唯一鍵包含在分區(qū)列里面,對于存在主鍵或者唯一鍵的表不能使用主鍵或者唯一鍵之外的字段作為分區(qū)字段。

  3. 5.7以前的版本顯示分區(qū)的執(zhí)行計(jì)劃使用:explain PARTITIONS;5.7以后直接執(zhí)行:explain

  4. 沒有強(qiáng)制要求分區(qū)列非空,建議分區(qū)的列為NOT NULL的列;在RANGE 分區(qū)中如果往分區(qū)列中插入NULL值會(huì)被當(dāng)作最小的值來處理,在LIST分區(qū)中NULL值必須在枚舉列表中否則插入失敗,在HASH/KEY分區(qū)中NULL值會(huì)被當(dāng)作0來處理。

  5. 基于時(shí)間類型的字段的轉(zhuǎn)換函數(shù)mysql提供了"YEAR(),MONTH(),DAY(),TO_DAYS(),TO_SECONDS(),WEEKDAY(),DAYOFYEAR()"

  6. 拆分合并分區(qū)后會(huì)導(dǎo)致修改的分區(qū)的統(tǒng)計(jì)信息失效,沒有修改的分區(qū)的統(tǒng)計(jì)信息還在,不影響新插入的值加入到統(tǒng)計(jì)信息;這時(shí)需要對表執(zhí)行Analyze操作.

  7. 針對非整形字段進(jìn)行RANG\LIST分區(qū)建議使用COLUMNS分區(qū)。

分區(qū)表相關(guān)操作

分區(qū)相關(guān)查詢

查看當(dāng)前數(shù)據(jù)庫是否支持分區(qū)
mysql> show variables like '%partition%';
+---------------------------------------+-------+
| Variable_name | Value |
+---------------------------------------+-------+
| have_partitioning | YES |
| innodb_adaptive_hash_index_partitions | 1 |
+---------------------------------------+-------+
2 rows in set
查看創(chuàng)建分區(qū)表的CREATE語句
mysql>show create table operation_log;
查看表是否為分區(qū)表(Create_options)
mysql>show table status(當(dāng)前庫所有表狀態(tài))
mysql>show table status from lockrank like '%operation_log%';(lockrank庫operation_log表狀態(tài))
Table: operation_log
Create Table: CREATE TABLE `operation_log` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `cid` mediumint(7) unsigned NOT NULL,
  `accountid` mediumint(8) NOT NULL DEFAULT '0' ,
  `flag` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `addtime` int(11) unsigned NOT NULL,
  `device` tinyint(1) unsigned NOT NULL DEFAULT '1' ,
  PRIMARY KEY (`id`,`addtime`),
  KEY `idx_accountid_addtime` (`accountid`,`addtime`),
  KEY `idx_accountid_flag` (`accountid`,`flag`),
) ENGINE=InnoDB AUTO_INCREMENT=50951039 DEFAULT CHARSET=utf8 COMMENT='操作記錄'
/*!50100 PARTITION BY RANGE (addtime)
(PARTITION `2013-05` VALUES LESS THAN (1370016000) ENGINE = InnoDB,
 PARTITION `2013-06` VALUES LESS THAN (1372608000) ENGINE = InnoDB,
 PARTITION `2013-07` VALUES LESS THAN (1375286400) ENGINE = InnoDB,
 PARTITION `2013-08` VALUES LESS THAN (1377964800) ENGINE = InnoDB,
 PARTITION `2013-09` VALUES LESS THAN (1380556800) ENGINE = InnoDB,
 PARTITION `2013-10` VALUES LESS THAN (1383235200) ENGINE = InnoDB,
 PARTITION `2013-11` VALUES LESS THAN (1385827200) ENGINE = InnoDB,
 PARTITION `2013-12` VALUES LESS THAN (1388505600) ENGINE = InnoDB,
 PARTITION `2014-01` VALUES LESS THAN (1391184000) ENGINE = InnoDB,
 PARTITION `2014-02` VALUES LESS THAN (1393603200) ENGINE = InnoDB,
 PARTITION `2014-03` VALUES LESS THAN (1396281600) ENGINE = InnoDB,
 PARTITION `2014-04` VALUES LESS THAN (1398873600) ENGINE = InnoDB,
 PARTITION `2014-05` VALUES LESS THAN (1401552000) ENGINE = InnoDB,
 PARTITION `2014-06` VALUES LESS THAN (1404144000) ENGINE = InnoDB,
 PARTITION `2014-07` VALUES LESS THAN (1406822400) ENGINE = InnoDB,
 PARTITION `2014-08` VALUES LESS THAN (1409500800) ENGINE = InnoDB,
 PARTITION `2014-09` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
1 row in set (0.00 sec)
查看select如何使用分區(qū)
mysql> explain partitions select id,accountid,cid,flag from operation_log where addtime="1369362524" \G ;
 *************************** 1\. row ***************************
   id: 1
  select_type: SIMPLE
table: operation_log
   partitions: 2013-05
 type: ALL
possible_keys: NULL
  key: NULL
  key_len: NULL
  ref: NULL
 rows: 4384356
Extra: Using where
1 row in set (0.00 sec)
分區(qū)表元數(shù)據(jù)統(tǒng)計(jì)表:INFORMATION_SCHEMA.PARTITIONS
查看分區(qū)表operation_log的分區(qū)信息
mysql> SELECT partition_name part, partition_expression expr, partition_description descr, table_rows FROM INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = schema() AND TABLE_NAME='operation_log';
+---------+---------+------------+------------+
| part| expr| descr | table_rows |
+---------+---------+------------+------------+
| 2013-05 | addtime | 1370016000 | 5999642 |
| 2013-06 | addtime | 1372608000 | 4579263 |
| 2013-07 | addtime | 1375286400 | 3223772 |
| 2013-08 | addtime | 1377964800 | 1995058 |
| 2013-09 | addtime | 1380556800 | 2497406 |
| 2013-10 | addtime | 1383235200 | 4106974 |
| 2013-11 | addtime | 1385827200 | 6209559 |
| 2013-12 | addtime | 1388505600 | 6415349 |
| 2014-01 | addtime | 1391184000 | 3953594 |
| 2014-02 | addtime | 1393603200 | 0 |
| 2014-03 | addtime | 1396281600 | 0 |
| 2014-04 | addtime | 1398873600 | 0 |
| 2014-05 | addtime | 1401552000 | 0 |
| 2014-06 | addtime | 1404144000 | 0 |
| 2014-07 | addtime | 1406822400 | 0 |
| 2014-08 | addtime | 1409500800 | 0 |
| 2014-09 | addtime | MAXVALUE | 0 |
+---------+---------+------------+------------+
17 rows in set (1.48 sec)

創(chuàng)建分區(qū)操作

  • RANGE分區(qū):
mysql> CREATE TABLE `operation_log` (
 ->  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 -> `cid` mediumint(7) unsigned NOT NULL,
 -> `accountid` mediumint(8) NOT NULL DEFAULT '0' ,
 ->  `flag` tinyint(1) unsigned NOT NULL DEFAULT '0',
 ->  `addtime` int(11) unsigned NOT NULL,
 -> `device` tinyint(1) unsigned NOT NULL DEFAULT '1' ,
 ->  PRIMARY KEY (`id`,`addtime`),
 -> KEY `idx_accountid_addtime` (`accountid`,`addtime`),
 ->  KEY `idx_accountid_flag` (`accountid`,`flag`),
 ->) ENGINE=InnoDB AUTO_INCREMENT=50951039 DEFAULT CHARSET=utf8 COMMENT='操作記錄'
 ->/*!50100 PARTITION BY RANGE (addtime)
 ->(PARTITION `2013-05` VALUES LESS THAN (1370016000) ENGINE = InnoDB,
 -> PARTITION `2013-06` VALUES LESS THAN (1372608000) ENGINE = InnoDB,
 -> PARTITION `2013-07` VALUES LESS THAN (1375286400) ENGINE = InnoDB,
 -> PARTITION `2013-08` VALUES LESS THAN (1377964800) ENGINE = InnoDB,
 -> PARTITION `2013-09` VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
1 row in set (0.00 sec)
( LESS THAN MAXVALUE考慮到可能的最大值)
  • list分區(qū)
    //這種方式失敗

    mysql> CREATE TABLE IF NOT EXISTS `list_part` (
     ->   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
     ->   `province_id` int(2) NOT NULL DEFAULT 0 COMMENT '省',
     ->   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名稱',
     ->   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0為男,1為女',
     ->   PRIMARY KEY (`id`)
     -> ) ENGINE=INNODB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
     -> PARTITION BY LIST (province_id) (
     -> PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8),
     -> PARTITION p1 VALUES IN (9,10,11,12,16,21),
     -> PARTITION p2 VALUES IN (13,14,15,19),
     -> PARTITION p3 VALUES IN (17,18,20,22,23,24)
     -> );
    ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
    //這種方式成功
    mysql> CREATE TABLE IF NOT EXISTS `list_part` (
     ->   `id` int(11) NOT NULL  COMMENT '用戶ID',
     ->   `province_id` int(2) NOT NULL DEFAULT 0 COMMENT '省',
     ->   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名稱',
     ->   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0為男,1為女'
     -> ) ENGINE=INNODB  DEFAULT CHARSET=utf8
     -> PARTITION BY LIST (province_id) (
     -> PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8),
     -> PARTITION p1 VALUES IN (9,10,11,12,16,21),
     -> PARTITION p2 VALUES IN (13,14,15,19),
     -> PARTITION p3 VALUES IN (17,18,20,22,23,24)
     -> );
    Query OK, 0 rows affected (0.33 sec)
    上面的這個(gè)創(chuàng)建list分區(qū)時(shí),如果有主銉的話,分區(qū)時(shí)主鍵必須在其中,不然就會(huì)報(bào)錯(cuò)。如果我不用主鍵,分區(qū)就創(chuàng)建成功了,一般情況下,一個(gè)張表肯定會(huì)有一個(gè)主鍵,這算是一個(gè)分區(qū)的局限性
    

* hash分區(qū)

mysql> CREATE TABLE IF NOT EXISTS hash_part (
-> id int(11) NOT NULL AUTO_INCREMENT COMMENT '評論ID',
-> comment varchar(1000) NOT NULL DEFAULT '' COMMENT '評論',
-> ip varchar(25) NOT NULL DEFAULT '' COMMENT '來源IP',
-> PRIMARY KEY (id)
-> ) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
-> PARTITION BY HASH(id)
-> PARTITIONS 3;
Query OK, 0 rows affected (0.06 sec)


* key分區(qū) 

mysql> CREATE TABLE IF NOT EXISTS key_part (
-> news_id int(11) NOT NULL COMMENT '新聞ID',
-> content varchar(1000) NOT NULL DEFAULT '' COMMENT '新聞內(nèi)容',
-> u_id varchar(25) NOT NULL DEFAULT '' COMMENT '來源IP',
-> create_time DATE NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '時(shí)間'
-> ) ENGINE=INNODB DEFAULT CHARSET=utf8
-> PARTITION BY LINEAR HASH(YEAR(create_time))
-> PARTITIONS 3;
Query OK, 0 rows affected (0.07 sec)



#### 增加子分區(qū)操作
>子分區(qū)是分區(qū)表中每個(gè)分區(qū)的再次分割,子分區(qū)既可以使用HASH希分區(qū),也可以使用KEY分區(qū)。這 也被稱為復(fù)合分區(qū)(composite partitioning)


1. 如果一個(gè)分區(qū)中創(chuàng)建了子分區(qū),其他分區(qū)也要有子分區(qū)
2. 如果創(chuàng)建了了分區(qū),每個(gè)分區(qū)中的子分區(qū)數(shù)必須相同
3. 同一分區(qū)內(nèi)的子分區(qū),名字不相同,不同分區(qū)內(nèi)的子分區(qū)名子可以相同(5.1.50不適用)

mysql> CREATE TABLE IF NOT EXISTS sub_part (
-> news_id int(11) NOT NULL COMMENT '新聞ID',
-> content varchar(1000) NOT NULL DEFAULT '' COMMENT '新聞內(nèi)容',
-> u_id int(11) NOT NULL DEFAULT 0s COMMENT '來源IP',
-> create_time DATE NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '時(shí)間'
-> ) ENGINE=INNODB DEFAULT CHARSET=utf8
-> PARTITION BY RANGE(YEAR(create_time))
-> SUBPARTITION BY HASH(TO_DAYS(create_time))(
-> PARTITION p0 VALUES LESS THAN (1990)(SUBPARTITION s0,SUBPARTITION s1,SUBPARTITION s2),
-> PARTITION p1 VALUES LESS THAN (2000)(SUBPARTITION s3,SUBPARTITION s4,SUBPARTITION good),
-> PARTITION p2 VALUES LESS THAN MAXVALUE(SUBPARTITION tank0,SUBPARTITION tank1,SUBPARTITION tank3)
-> );
Query OK, 0 rows affected (0.07 sec)


### 分區(qū)管理

#### 增加分區(qū)操作(針對設(shè)置MAXVALUE)

##### range添加分區(qū)

mysql>alter table operation_log add partition(partition 2013-10 values less than (1383235200));

--->適用于沒有設(shè)置MAXVALUE的分區(qū)添加
ERROR 1481 (HY000):MAXVALUE can only be used in last partition definition

mysql>alter table operation_log REORGANIZE partition 2013-09 into (partition 2013-09 values less than (1380556800),partition 2013-10 values less than (1383235200),partition 2013-11 values less than maxvalue);


##### list添加分區(qū)

mysql> alter table list_part add partition(partition p4 values in (25,26,28));
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

##### hash重新分區(qū)

mysql> alter table list_part add partition(partition p4 values in (25,26,28));
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0


##### key重新分區(qū)

mysql> alter table key_part add partition partitions 4;
Query OK, 1 row affected (0.06 sec)//有數(shù)據(jù)也會(huì)被重新分配
Records: 1 Duplicates: 0 Warnings: 0


##### 子分區(qū)添加新分區(qū),雖然我沒有指定子分區(qū),但是系統(tǒng)會(huì)給子分區(qū)命名的

mysql> alter table sub1_part add partition(partition p3 values less than MAXVALUE);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

1.移除表的分區(qū)

ALTER TABLE tablename
REMOVE PARTITIONING ;

注意:使用remove移除分區(qū)是僅僅移除分區(qū)的定義,并不會(huì)刪除數(shù)據(jù)和drop PARTITION不一樣,后者會(huì)連同數(shù)據(jù)一起刪除

2.對已經(jīng)存在記錄的表創(chuàng)建分區(qū),以增加range分區(qū)為例,和創(chuàng)建表建分區(qū)的語法一樣。

ALTER TABLE tb_partition.tb_varchar
PARTITION BY RANGE(id) PARTITIONS 3( PARTITION part0 VALUES LESS THAN (5000), PARTITION part1 VALUES LESS THAN (10000), PARTITION part2 VALUES LESS THAN (MAXVALUE)) ;

注意:對已有的表創(chuàng)建分區(qū)之后,數(shù)據(jù)會(huì)按照分區(qū)的定義分布到各個(gè)分區(qū)文件當(dāng)中

##### 刪除分區(qū)操作

alter table user drop partition2013-05;



#### 分區(qū)表其他操作

* 重建分區(qū)(官方:與先drop所有記錄然后reinsert是一樣的效果;用于整理表碎片)
`alter table operation_log rebuild partition `2014-01`;`

* 重建多個(gè)分區(qū)

alter table operation_log rebuild partition 2014-01,2014-02;


過程如下:
pro
優(yōu)化分區(qū)(如果刪除了一個(gè)分區(qū)的大量記錄或者對一個(gè)分區(qū)的varchar blob text數(shù)據(jù)類型的字段做了許多更新,此時(shí)可以對分區(qū)進(jìn)行優(yōu)化以回收未使用的空間和整理分區(qū)數(shù)據(jù)文件)
alter table operation_log optimize partition 2014-01;
優(yōu)化的操作相當(dāng)于check partition,analyze partition 和repair patition

分析分區(qū)
alter table operation_log analyze partition 2014-01;

修復(fù)分區(qū)
alter table operation_log repair partition 2014-01;

檢查分區(qū)
alter table operation_log check partition 2014-01;

注釋:
mysqlcheck、myisamchk并不支持分區(qū)表,analyze,check,optimize,rebuild,repair,truncate不支持子分區(qū)操作
在MySQL5.6中,可以使用清空一個(gè)分區(qū)數(shù)據(jù):alter table operation_log truncate partition 2014-01;
清空該分區(qū)表所有分區(qū)數(shù)據(jù):alter table operation_log truncate partition all;



更多詳細(xì)可閱讀 https://www.cnblogs.com/chenmh/p/5623474.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一,什么是數(shù)據(jù)庫分區(qū)前段時(shí)間寫過一篇關(guān)于mysql分表的的文章,下面來說一下什么是數(shù)據(jù)庫分區(qū),以mysql為例。m...
    MrKai平凡之路閱讀 1,262評論 0 5
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,917評論 0 13
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,972評論 0 9
  • 原文鏈接 http://blog.csdn.net/kobejayandy/article/details/547...
    lucode閱讀 1,031評論 0 0
  • 一、背景話說風(fēng)和日麗的一天,為提高隨著業(yè)務(wù)增長的大表(3510449行吧)的訪問效率,于是決定對表分區(qū),記錄如下。...
    peteLee閱讀 10,110評論 0 3

友情鏈接更多精彩內(nèi)容