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都用不上。這種分割槽方法也不能很好地利用分割槽裁剪特性