一:概述 通过把表分成多几区间,每个区间存储符合特定表达式的数据(即在我们创建分区表时指定每个分区存储的条件例如: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 分区:
三:分区查询
语法:
1SELECT 2 select_expr [, select_expr ...] 3 FROM table_references 4 [PARTITION partition_list] //指定分局eg:select * from rc1 PARTITION(p0) ; //在标的引用后面加上PARTITION(p,...)函数,参数为表的分区名
备注:如果我们查询没有添加分区条件,默认是查询所有分区
四:RANGE分区

1CREATE TABLE `tb_range` ( 2 -> `id` int(11) NOT NULL, 3 -> `fname` varchar(30) DEFAULT NULL, 4 -> `lname` varchar(30) DEFAULT NULL 5 -> ) 6 -> PARTITION BY RANGE (id) 7 -> (PARTITION p0 VALUES LESS THAN (6), 8 -> PARTITION p1 VALUES LESS THAN (11), 9 -> PARTITION p2 VALUES LESS THAN MAXVALUE ) ; 10Query OK, 0 rows affected (0.64 sec) 11 12mysql> insert into tb_range(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20'); 13Query OK, 4 rows affected (0.02 sec) 14Records: 4 Duplicates: 0 Warnings: 0
View Code
查询:
1mysql> select * from tb_range partition(p0); //查询p0区的数据 2+----+-------+-------+ 3| id | fname | lname | 4+----+-------+-------+ 5| 1 | a1 | b1 | 6+----+-------+-------+ 71 row in set (0.00 sec) 8 9mysql> select * from tb_range partition(p2);//查询p2区的数据 10+----+-------+-------+ 11| id | fname | lname | 12+----+-------+-------+ 13| 20 | a20 | b20 | 14+----+-------+-------+ 151 row in set (0.00 sec) 16 17mysql> select * from tb_range partition(p1);//查询p1区的数据 18+----+-------+-------+ 19| id | fname | lname | 20+----+-------+-------+ 21| 6 | a6 | b6 | 22| 10 | a10 | b10 | 23+----+-------+-------+ 242 rows in set (0.00 sec)
五:LIST 分区

1mysql> CREATE TABLE `tb_list` ( 2 -> `id` int(11) NOT NULL, 3 -> `fname` varchar(30) DEFAULT NULL, 4 -> `lname` varchar(30) DEFAULT NULL, 5 -> `class_id` int(11) NOT NULL 6 -> ) 7 -> PARTITION BY LIST(class_id) ( 8 -> PARTITION pNorth VALUES IN (1,3), 9 -> PARTITION pEast VALUES IN (2,4) 10 -> ); 11Query OK, 0 rows affected (0.47 sec) 12 13mysql> 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); 14Query OK, 4 rows affected (0.02 sec)
View Code
查询:
1mysql> select * from tb_list partition(pEast); 2+----+-------+-------+----------+ 3| id | fname | lname | class_id | 4+----+-------+-------+----------+ 5| 6 | a6 | b6 | 2 | 6| 20 | a20 | b20 | 4 | 7+----+-------+-------+----------+ 82 rows in set (0.00 sec) 9 10mysql> select * from tb_list partition(pNorth); 11+----+-------+-------+----------+ 12| id | fname | lname | class_id | 13+----+-------+-------+----------+ 14| 1 | a1 | b1 | 1 | 15| 10 | a10 | b10 | 3 | 16+----+-------+-------+----------+ 172 rows in set (0.00 sec)
备注:list方式分区in()参数可以无需
如果插入不存在的分区,数据库会报错
六:HASH 分区
6.1hash散列算法

1mysql> CREATE TABLE tb_hash ( 2 -> id INT NOT NULL, 3 -> fname VARCHAR(30), 4 -> lname VARCHAR(30) 5 -> ) 6 -> PARTITION BY HASH(id) 7 -> PARTITIONS 3; 8Query OK, 0 rows affected (0.56 sec) 9 10mysql> insert into tb_hash(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20'); 11Query OK, 4 rows affected (0.03 sec) 12Records: 4 Duplicates: 0 Warnings: 0
View Code
查询:默认分区为p0,p1....
1mysql> select * from tb_hash partition(p0); 2+----+-------+-------+ 3| id | fname | lname | 4+----+-------+-------+ 5| 6 | a6 | b6 | 6+----+-------+-------+ 71 row in set (0.00 sec) 8 9mysql> select * from tb_hash partition(p1); 10+----+-------+-------+ 11| id | fname | lname | 12+----+-------+-------+ 13| 1 | a1 | b1 | 14| 10 | a10 | b10 | 15+----+-------+-------+ 162 rows in set (0.00 sec) 17 18mysql> select * from tb_hash partition(p2); 19+----+-------+-------+ 20| id | fname | lname | 21+----+-------+-------+ 22| 20 | a20 | b20 | 23+----+-------+-------+ 241 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线性算法

1mysql> CREATE TABLE tb_hash_linear ( 2 -> id INT NOT NULL, 3 -> fname VARCHAR(30), 4 -> lname VARCHAR(30) 5 -> ) 6 -> PARTITION BY LINEAR HASH(id) 7 -> PARTITIONS 3; 8Query OK, 0 rows affected (0.58 sec)
View Code
七:KEY 分区
1mysql> CREATE TABLE tb_key ( 2 -> id INT NOT NULL PRIMARY KEY, 3 -> name VARCHAR(20) 4 -> ) 5 -> PARTITION BY KEY() 6 -> PARTITIONS 2; 7Query OK, 0 rows affected (0.44 sec)
注意:我们数据库目录存放着我们所有数据库的信息,包括数据库中表的信息和表中数据。其中每个数据库会在该目录下创建一个以数据库名命名文件夹,该文件夹下主要包含.frm和.idb结尾的文件,其中.idb(一个表对应一个)文件存放着每个表的数据。如果我们的表是分区表则一个表对用多个.idb文件。分析下图箭头

有图可知:
数据库目录 : /var/lib/mysql
我查看的数据库为:test3
普通表一个.frm和一个.idb 而分区表一个.frm和多个.idb文件