天天看點

mysql-表分區-hash分區

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';
           
mysql-表分區-hash分區

完全符合預期。

4、hash線性分區

線性分區與hash分區相比,隻是分區語句上加上了linear關鍵字,如:ALTER TABLE `test_user_hash` PARTITION BY LINEAR HASH(ext_int) PARTITIONS 3 ;

LINEAR HASH的優點是在添加、删除、合并、拆分分區的時候,非常有效率,但是缺點是線性hash分區的資料分布不均勻。

繼續閱讀