一 分區和分表的概念
分區 根據指定的規則,將資料表中的行拆分為更小的資料集,隨後分佈於多個目錄和磁碟中,MySQL從5.1.3開始支援Partition
分表 通過人為的手動去建立三張表,每張表的檔案都是相對獨立的。
分區和分表的對比:
| 分表 |
分區 |
| 多張資料表 |
一張資料表 |
| 重複資料的風險 |
沒有資料重複的風險 |
| 寫入多張表 |
寫入一張表 |
| 沒有統一的約束限制 |
強制的約束限制 |
二 MySQL的分區類型介紹
定界分割(RANGE):
每一個分區中都包含能對應到一組特定值(範圍)的一些行,適用的情景包括常用查詢直接以對錶進行分區的列為條件,或者需要通過刪除表來快速刪除舊資料時。
列示分區:
列示分區與定界分割類似。主要區別在於,列示分區模式允許根據 DBA 預先定義的值列表(而不是一系列連續值構成的範圍)來對資料進行劃分。
列分區:
列分區支援在分區鍵中使用多個列。這些列將用於決定在分區中放置那些行並在分區修剪操作中決定在哪那些行要清掉。列分區是對定界分割和列表分區的擴充。
散列分區(Hash Partition):
散列分區主要用於確保在預先設定數量的多個分區上平均分配資料。在定界分割和列表分區中,您必須明確指定特定列值儲存在哪個分區中。而在散列分區中,MySQL 將自動為您做這個工作,您只需根據執行散列的列值和分區表所劃分成的分區數量來指定列值或運算式即可。
線性散列分區是列表分區的一個變體,它使用一種更複雜的資料分區演算法,可在處理 TB 級表時大幅提高添加、刪除、合并和拆分分區的速度。
鍵分區:
鍵分區與散列分區類似,MySQL 通過一個系統產生的散列鍵來確保資料的平均分布,而不是使用使用者定義的運算式做散列分區。鍵分區支援在分區中使用各種類型的列資料。
子分區:
子分區支援對分區表中各個分區進行進一步劃分,專用於處理超大型表,可將資料和索引分布在許多伺服器和磁碟上。
分區修剪:
通過在查詢中適時使用“WHERE”或“ON”子句,可確保 MySQL 最佳化器僅訪問合格分區。這樣一來,查詢執行速度將比未分區的表提高一個數量級。
三、常用分區類型的使用
RANGE分區使用:
CREATE TABLE `virus_daily` (
`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
`day` date NOT NULL DEFAULT '0000-00-00',
`event_count` INT (11) NULL DEFAULT 0 COMMENT '事件數目',
`ip_count` INT(11) NULL DEFAULT 0 COMMENT 'IP地址數',
PRIMARY KEY (`id`, `day`) --注意day這裡必須定義為一個索引欄位
)ENGINE = MyISAM DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci PARTITION BY RANGE (to_days(`day`))(
PARTITION p1 VALUES LESS THAN (to_days('2013-12-03')),
PARTITION p2 VALUES LESS THAN (to_days('2013-12-04')),
PARTITION p3 VALUES LESS THAN (to_days('2013-12-05')),
PARTITION p4 VALUES LESS THAN (to_days('2013-12-06')),
PARTITION p5 VALUES LESS THAN (to_days('2013-12-07')),
PARTITION p6 VALUES LESS THAN (to_days('2013-12-08')),
PARTITION p7 VALUES LESS THAN (to_days('2013-12-09')),
PARTITION p8 VALUES LESS THAN (to_days('2013-12-10'))
);
基於這種資料分割配置,將每天的資料存放到一個分區當中,例如當:插入時間為2013-12-04的資料,該資料將被儲存到p1這塊分區當中。