Description:
Used PARTITION BY KEY to create partition table, when the KEY columns
PARTITIONS is even number and table CHARSET=utf8mb4 and
COLLATE=utf8mb4_unicode_ci or utf8mb4_general_ci, data distribute unbalance, when PARTITIONS is
odd number ,data uniform distribution.
How to repeat:
First, create two partition tables.
mysql>CREATE TABLE `tp1` (
`s1` char(32) NOT NULL,
PRIMARY KEY (`s1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
PARTITION BY KEY (s1)
PARTITIONS 10;
mysql>CREATE TABLE `tp2` (
`s1` char(32) NOT NULL,
PRIMARY KEY (`s1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
PARTITION BY KEY (s1)
PARTITIONS 11 ;
Then, load data:
mysql>insert into tp1(s1)
SELECT
@counter := @counter+1 AS counter
FROM
(
SELECT
NULL
FROM
INFORMATION_SCHEMA.COLUMNS
LIMIT 600
) AS select1,
(
SELECT
NULL
FROM
INFORMATION_SCHEMA.COLUMNS
LIMIT 600
) AS select2,
(
SELECT
@counter := -1
FROM
DUAL
) AS select_counter
;
mysql>insert into tp2(s1)
SELECT
@counter := @counter+1 AS counter
FROM
(
SELECT
NULL
FROM
INFORMATION_SCHEMA.COLUMNS
LIMIT 600
) AS select1,
(
SELECT
NULL
FROM
INFORMATION_SCHEMA.COLUMNS
LIMIT 600
) AS select2,
(
SELECT
@counter := -1
FROM
DUAL
) AS select_counter
;
mysql>insert into tp2(s1)
SELECT
@counter := @counter+1 AS counter
FROM
(
SELECT
NULL
FROM
INFORMATION_SCHEMA.COLUMNS
LIMIT 600
) AS select1,
(
SELECT
NULL
FROM
INFORMATION_SCHEMA.COLUMNS
LIMIT 600
) AS select2,
(
SELECT
@counter := -1
FROM
DUAL
) AS select_counter
;
Then, check data distribute.
mysql> select
-> partition_name,data_length from information_schema.partitions where
-> table_schema='test' and table_name='tp1';
+----------------+-------------+
| partition_name | data_length |
+----------------+-------------+
| p0 | 8962048 |
| p1 | 98304 |
| p2 | 8962048 |
| p3 | 131072 |
| p4 | 8962048 |
| p5 | 98304 |
| p6 | 8962048 |
| p7 | 114688 |
| p8 | 8962048 |
| p9 | 114688 |
+----------------+-------------+
10 rows in set (0.00 sec)
mysql> select partition_name,data_length from information_schema.partitions where table_schema='test' and table_name='tp2';
+----------------+-------------+
| partition_name | data_length |
+----------------+-------------+
| p0 | 16384 |
| p1 | 16384 |
| p2 | 16384 |
| p3 | 16384 |
| p4 | 16384 |
| p5 | 16384 |
| p6 | 16384 |
| p7 | 16384 |
| p8 | 16384 |
| p9 | 16384 |
| p10 | 16384 |
+----------------+-------------+
11 rows in set (0.00 sec)
Description: Used PARTITION BY KEY to create partition table, when the KEY columns PARTITIONS is even number and table CHARSET=utf8mb4 and COLLATE=utf8mb4_unicode_ci or utf8mb4_general_ci, data distribute unbalance, when PARTITIONS is odd number ,data uniform distribution. How to repeat: First, create two partition tables. mysql>CREATE TABLE `tp1` ( `s1` char(32) NOT NULL, PRIMARY KEY (`s1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci PARTITION BY KEY (s1) PARTITIONS 10; mysql>CREATE TABLE `tp2` ( `s1` char(32) NOT NULL, PRIMARY KEY (`s1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci PARTITION BY KEY (s1) PARTITIONS 11 ; Then, load data: mysql>insert into tp1(s1) SELECT @counter := @counter+1 AS counter FROM ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS LIMIT 600 ) AS select1, ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS LIMIT 600 ) AS select2, ( SELECT @counter := -1 FROM DUAL ) AS select_counter ; mysql>insert into tp2(s1) SELECT @counter := @counter+1 AS counter FROM ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS LIMIT 600 ) AS select1, ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS LIMIT 600 ) AS select2, ( SELECT @counter := -1 FROM DUAL ) AS select_counter ; mysql>insert into tp2(s1) SELECT @counter := @counter+1 AS counter FROM ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS LIMIT 600 ) AS select1, ( SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS LIMIT 600 ) AS select2, ( SELECT @counter := -1 FROM DUAL ) AS select_counter ; Then, check data distribute. mysql> select -> partition_name,data_length from information_schema.partitions where -> table_schema='test' and table_name='tp1'; +----------------+-------------+ | partition_name | data_length | +----------------+-------------+ | p0 | 8962048 | | p1 | 98304 | | p2 | 8962048 | | p3 | 131072 | | p4 | 8962048 | | p5 | 98304 | | p6 | 8962048 | | p7 | 114688 | | p8 | 8962048 | | p9 | 114688 | +----------------+-------------+ 10 rows in set (0.00 sec) mysql> select partition_name,data_length from information_schema.partitions where table_schema='test' and table_name='tp2'; +----------------+-------------+ | partition_name | data_length | +----------------+-------------+ | p0 | 16384 | | p1 | 16384 | | p2 | 16384 | | p3 | 16384 | | p4 | 16384 | | p5 | 16384 | | p6 | 16384 | | p7 | 16384 | | p8 | 16384 | | p9 | 16384 | | p10 | 16384 | +----------------+-------------+ 11 rows in set (0.00 sec)