1. 程式人生 > >Mysql --分割槽表(7)Key分割槽

Mysql --分割槽表(7)Key分割槽

Key分割槽

按照Key進行分割槽非常類似於按照Hash進行分割槽,只不過Hash分割槽允許使用使用者自定義的表示式,而Key分割槽不允許使用使用者自定義的表示式,需要使用MySQL伺服器提供的HASH函式;同時Hash分割槽只支援整數分割槽,而Key分割槽支援使用BLOB或Text型別外其他型別的列作為分割槽鍵
我們同樣可以使用Partition by key(expr)子句來建立一個key分割槽表,expr是零個或者多個欄位名的列表。下面語句建立了一個機遇job欄位進行分割槽的表,表被分成了4個分割槽

    CREATE TABLE employees (
    id INT
NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job VARCHAR(30) NOT NULL, store_id INT ) PARTITION BY KEY(job) PARTITIONS 4;

與HASH分割槽不同,建立Key分割槽表的時候,可以不指定分割槽鍵,預設會首先選擇使用主鍵作為分割槽鍵

CREATE TABLE
k1 ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20) ) PARTITION BY KEY() PARTITIONS 2;

在沒有主鍵的情況,會使用非空唯一鍵作為分割槽鍵

CREATE TABLE k1 (
    id INT NOT NULL,
    name VARCHAR(20),
    UNIQUE KEY (id)
)
PARTITION BY KEY()
PARTITIONS 2;

如果作為分割槽鍵的唯一鍵不是非空的(沒有指定NOT NULL子句),依然會報錯

CREATE TABLE k1 (
    id INT ,
    name VARCHAR(20
), UNIQUE KEY (id) ) PARTITION BY KEY() PARTITIONS 2; ERROR 1488 (HY000): Field in list of fields for partition function not found in table

如果即沒喲主鍵,也沒有唯一鍵,就必須要指定分割槽鍵了

例子

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY KEY(joined)
PARTITIONS 6;


delimiter $$
drop procedure if exists pr_insertdate$$
create procedure pr_insertdate(in begindate date,in enddate date)
begin
    while begindate<enddate
    do
        insert into members values('fan','boshi','duyalan',null,begindate);
        set begindate = date_add(begindate,interval 1 day);
    end while;
end$$

delimiter ;

mysql> call pr_insertdate('2015-01-01','2016-08-08');
Query OK, 1 row affected (0.06 sec)

mysql> select count(*) from  members;
+----------+
| count(*) |
+----------+
|      585 |
+----------+
1 row in set (0.00 sec)

select 
  partition_name part,  
  partition_expression expr,  
  partition_description descr,  
  table_rows  
from information_schema.partitions  where 
  table_schema = schema()  
  and table_name='members';

+------+----------+-------+------------+
| part | expr     | descr | table_rows |
+------+----------+-------+------------+
| p0   | `joined` | NULL  |        177 |
| p1   | `joined` | NULL  |          0 |
| p2   | `joined` | NULL  |        208 |
| p3   | `joined` | NULL  |          0 |
| p4   | `joined` | NULL  |        200 |
| p5   | `joined` | NULL  |          0 |
+------+----------+-------+------------+
6 rows in set (0.00 sec)
然而根據我的實驗這種分割槽貌似沒什麼卵子用,p1 p3 p5都用不上。這種分割槽方法也不能很好地利用分割槽裁剪特性