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