Mysql分區(qū)表

創(chuàng)建分區(qū)表

CREATE TABLE `partition_table_name` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(64) NOT NULL,
  `id_card_num` varchar(20) NOT NULL,
  `name` varchar(100) NOT NULL,
  `phone_num` varchar(30) NOT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE ((year(create_time)*100+month(create_time))*100+day(create_time)) (
    PARTITION p20170411 VALUES LESS THAN (20170412),
    PARTITION s20170412 VALUES LESS THAN (20170413)
);

以上sql語(yǔ)句中,上半部分為普通的建表語(yǔ)句,唯一需要注意的是,需要把分區(qū)字段加入到PRIMARY KEY中。

下半部分sql語(yǔ)句則是創(chuàng)建表的各個(gè)分區(qū),以上語(yǔ)句是按照create_time字段進(jìn)行range類型的分區(qū)。(year(create_time)*100+month(create_time))*100+day(create_time)所得的值為range分區(qū)的VALUES,值類似于"20170411"這樣的int整數(shù)。PARTITION p20170411 VALUES LESS THAN (20170412)則表示創(chuàng)建了name為p20170411的分區(qū),當(dāng)對(duì)此表(partition_table_name)執(zhí)行插入語(yǔ)句時(shí),當(dāng)插入數(shù)據(jù)的create_time < “2017-04-12”時(shí),該條數(shù)據(jù)將被寫(xiě)入到p20170411分區(qū)表中。

向表中插入數(shù)據(jù)時(shí),若數(shù)據(jù)的create_time字段匹配到自己應(yīng)該被放入哪個(gè)分區(qū),則插入會(huì)失敗并報(bào)錯(cuò)。

p20170411這樣的分區(qū)表名可隨意取,但任然建議有一定的名稱代表意義。

向分區(qū)表中增加分區(qū)

ALTER TABLE bd_black_result
 ADD PARTITION (PARTITION s20170413 VALUES LESS THAN (20170414));

增加的分區(qū)必須嚴(yán)格按照遞增的條件才能添加成功。如,不能ADD PARTITION (PARTITION s20170410 VALUES LESS THAN (20170411));只能 ADD PARTITION (PARTITION s20170413 VALUES LESS THAN (20170414));或20170415或20170416……


查看分區(qū)情況

select
  partition_name,  
  partition_expression,  
  partition_description,  
  table_rows
from information_schema.partitions where
table_name='partition_table_name'

查詢結(jié)果將展示該表各個(gè)分區(qū)表的情況,包括各個(gè)分區(qū)表中的數(shù)據(jù)條數(shù)。


刪除分區(qū)表

alter table partition_table_name drop partition p20170412;

刪除partition_table_name表中名稱為p20170412的分區(qū)表。同時(shí),其數(shù)據(jù)也被刪除。


刪除分區(qū)數(shù)據(jù)

delete from partition_table_name PARTITION (p20170412)

刪除partition_table_name中分區(qū)名稱為p20170412的所有數(shù)據(jù)

當(dāng)然,還可以有其他各種操作指定分區(qū)表的方法,如

select * from partition_table_name PARTITION (p20170412);
.
.
.

疑問(wèn)
過(guò)程中,發(fā)現(xiàn)當(dāng)數(shù)據(jù)量大的時(shí)候

select
  partition_name,  
  partition_expression,  
  partition_description,  
  table_rows
from information_schema.partitions where
table_name='partition_table_name'

以上語(yǔ)句統(tǒng)計(jì)出的p20170412分區(qū)的table_rows數(shù)據(jù)和以下語(yǔ)句統(tǒng)計(jì)出的有一定差別

select count(*) from partition_table_name PARTITION (p20170412);

原因暫不知。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容