mysql之数据分区

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

查询:

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)
View Code

查询:

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
View Code

查询:默认分区为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)
View Code

七: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文件

 

posted @ 2019-02-14 15:39  爱我-中华  阅读(1527)  评论(0编辑  收藏  举报