一:概述 通過把表分成多幾區間,每個區間存儲符合特定表達式的數據(即在我們創建分區表時指定每個分區存儲的條件例如:PARTITION p0 VALUES LESS THAN (100) 即p0區間存儲小於100的數據)。
二:分區類型
即根據每個區間存儲值的表達式不同,可分為如下幾個類型,一般都是對數字類型或時間類型的數據進行分區。
2.1 RANGE分區 :即通過表達式 PARTITION p0 VALUES LESS THAN (100) 。即 less小於指定的值存儲區間。
2.2 LIST 分區 :即通過表達式 PARTITION pNorth VALUES IN (3,5,6,9,17) 。即值在in括號里面的值存儲區間。
2.3 HASH 分區 :即通過特定算法(hash)把指定的值放入不同區間。PARTITION BY HASH(id) PARTITIONS 4。
2.4 KEY 分區: 和hash分區類似,但指定的列值必須是唯一值(即主鍵或 UNIQUE KEY),PARTITION BY KEY() PARTITIONS 2;
2.5 COLUMNS 分區:
三:分區查詢
語法:
SELECT select_expr [, select_expr ...] FROM table_references [PARTITION partition_list] //指定分局
eg:select * from rc1 PARTITION(p0) ; //在標的引用后面加上PARTITION(p,...)函數,參數為表的分區名
備注:如果我們查詢沒有添加分區條件,默認是查詢所有分區
四:RANGE分區

CREATE TABLE `tb_range` ( -> `id` int(11) NOT NULL, -> `fname` varchar(30) DEFAULT NULL, -> `lname` varchar(30) DEFAULT NULL -> ) -> PARTITION BY RANGE (id) -> (PARTITION p0 VALUES LESS THAN (6), -> PARTITION p1 VALUES LESS THAN (11), -> PARTITION p2 VALUES LESS THAN MAXVALUE ) ; Query OK, 0 rows affected (0.64 sec) mysql> insert into tb_range(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20'); Query OK, 4 rows affected (0.02 sec) Records: 4 Duplicates: 0 Warnings: 0
查詢:
mysql> select * from tb_range partition(p0); //查詢p0區的數據 +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 1 | a1 | b1 | +----+-------+-------+ 1 row in set (0.00 sec) mysql> select * from tb_range partition(p2);//查詢p2區的數據 +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 20 | a20 | b20 | +----+-------+-------+ 1 row in set (0.00 sec) mysql> select * from tb_range partition(p1);//查詢p1區的數據 +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 6 | a6 | b6 | | 10 | a10 | b10 | +----+-------+-------+ 2 rows in set (0.00 sec)
五:LIST 分區

mysql> CREATE TABLE `tb_list` ( -> `id` int(11) NOT NULL, -> `fname` varchar(30) DEFAULT NULL, -> `lname` varchar(30) DEFAULT NULL, -> `class_id` int(11) NOT NULL -> ) -> PARTITION BY LIST(class_id) ( -> PARTITION pNorth VALUES IN (1,3), -> PARTITION pEast VALUES IN (2,4) -> ); Query OK, 0 rows affected (0.47 sec) mysql> insert into tb_list(id,fname,lname,class_id)values(1,'a1','b1',1),(6,'a6','b6',2),(10,'a10','b10',3),(20,'a20','b20',4); Query OK, 4 rows affected (0.02 sec)
查詢:
mysql> select * from tb_list partition(pEast); +----+-------+-------+----------+ | id | fname | lname | class_id | +----+-------+-------+----------+ | 6 | a6 | b6 | 2 | | 20 | a20 | b20 | 4 | +----+-------+-------+----------+ 2 rows in set (0.00 sec) mysql> select * from tb_list partition(pNorth); +----+-------+-------+----------+ | id | fname | lname | class_id | +----+-------+-------+----------+ | 1 | a1 | b1 | 1 | | 10 | a10 | b10 | 3 | +----+-------+-------+----------+ 2 rows in set (0.00 sec)
備注:list方式分區in()參數可以無需
如果插入不存在的分區,數據庫會報錯
六:HASH 分區
6.1hash散列算法

mysql> CREATE TABLE tb_hash ( -> id INT NOT NULL, -> fname VARCHAR(30), -> lname VARCHAR(30) -> ) -> PARTITION BY HASH(id) -> PARTITIONS 3; Query OK, 0 rows affected (0.56 sec) mysql> insert into tb_hash(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20'); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0
查詢:默認分區為p0,p1....
mysql> select * from tb_hash partition(p0); +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 6 | a6 | b6 | +----+-------+-------+ 1 row in set (0.00 sec) mysql> select * from tb_hash partition(p1); +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 1 | a1 | b1 | | 10 | a10 | b10 | +----+-------+-------+ 2 rows in set (0.00 sec) mysql> select * from tb_hash partition(p2); +----+-------+-------+ | id | fname | lname | +----+-------+-------+ | 20 | a20 | b20 | +----+-------+-------+ 1 row in set (0.01 sec)
mysql> select * from tb_hash partition(p3);
ERROR 1735 (HY000): Unknown partition 'p3' in table 'tb_hash'
6.2 hash線性算法

mysql> CREATE TABLE tb_hash_linear ( -> id INT NOT NULL, -> fname VARCHAR(30), -> lname VARCHAR(30) -> ) -> PARTITION BY LINEAR HASH(id) -> PARTITIONS 3; Query OK, 0 rows affected (0.58 sec)
七:KEY 分區
mysql> CREATE TABLE tb_key ( -> id INT NOT NULL PRIMARY KEY, -> name VARCHAR(20) -> ) -> PARTITION BY KEY() -> PARTITIONS 2; Query OK, 0 rows affected (0.44 sec)
注意:我們數據庫目錄存放着我們所有數據庫的信息,包括數據庫中表的信息和表中數據。其中每個數據庫會在該目錄下創建一個以數據庫名命名文件夾,該文件夾下主要包含.frm和.idb結尾的文件,其中.idb(一個表對應一個)文件存放着每個表的數據。如果我們的表是分區表則一個表對用多個.idb文件。分析下圖箭頭
有圖可知:
數據庫目錄 : /var/lib/mysql
我查看的數據庫為:test3
普通表一個.frm和一個.idb 而分區表一個.frm和多個.idb文件