一:概述 通过把表分成多几区间,每个区间存储符合特定表达式的数据(即在我们创建分区表时指定每个分区存储的条件例如: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文件