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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM