hash分區的目的是将資料均勻的分布到對應分區中,如果表中有主鍵或唯一索引,分區列必須是主鍵或唯一索引的一部分。
hash分區建立分區是“PARTITION BY HASH(expr)”實作的,expr是整數列或者可以将分區列轉換成整數的表達式。
1.已經存在的表建立分區
CREATE TABLE `test_user_hash` (
`user_id` bigint(19) NOT NULL,
`user_name` varchar(50) NOT NULL,
`ext_int` int(2) NOT NULL,
`ts` bigint(19) NOT NULL,
PRIMARY KEY (`user_id`,`ext_int`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `test_user_hash` PARTITION BY HASH(ext_int) PARTITIONS 3 ;
2.建表時建立分區
CREATE TABLE `test_user_hash` (
`user_id` bigint(19) NOT NULL,
`user_name` varchar(50) NOT NULL,
`ext_int` int(2) NOT NULL,
`ts` bigint(19) NOT NULL,
PRIMARY KEY (`user_id`,`ext_int`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
partition by hash (ext_int) partitions 3;
3.插入測試資料
INSERT INTO test_user_hash(user_id,user_name,ext_int,ts)VALUES
(1,'user_name1',1,UNIX_TIMESTAMP()),
(2,'user_name2',2,UNIX_TIMESTAMP()),
(3,'user_name3',3,UNIX_TIMESTAMP()),
(4,'user_name4',4,UNIX_TIMESTAMP()),
(5,'user_name5',5,UNIX_TIMESTAMP()),
(6,'user_name6',6,UNIX_TIMESTAMP()),
(7,'user_name7',7,UNIX_TIMESTAMP()),
(8,'user_name8',8,UNIX_TIMESTAMP())
;
預期各分區資料量:p0:p1:p2=2:3:3
查詢資料庫:
SELECT
PARTITION_NAME,
TABLE_ROWS
FROM
INFORMATION_SCHEMA. PARTITIONS
WHERE
TABLE_NAME = 'test_user_hash';
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TSU5UeNpnTy0EVNdXVzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnBnauAzMyQTMxETM1ATMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
完全符合預期。
4、hash線性分區
線性分區與hash分區相比,隻是分區語句上加上了linear關鍵字,如:ALTER TABLE `test_user_hash` PARTITION BY LINEAR HASH(ext_int) PARTITIONS 3 ;
LINEAR HASH的優點是在添加、删除、合并、拆分分區的時候,非常有效率,但是缺點是線性hash分區的資料分布不均勻。