作为散列子分区的一部分,如何为键指定多个列?
How do you specify multiple columns for the key, as part of a hash subpartition?
我正在创建具有复合分区的 table(RANGE
,然后是 HASH
)
我的实际 table 很大,所以这里有一个精简的虚拟模型 table 显示了重要部分:
CREATE TABLE table1(
id INT NOT NULL AUTO_INCREMENT,
dtvalue DATETIME NOT NULL, -- Used for RANGE partitions
v1 INT NOT NULL, -- Used for HASH partitions
v2 INT NOT NULL,
CONSTRAINT pk_table1 PRIMARY KEY(id),
CONSTRAINT uk_table1 UNIQUE(v1,v2) -- Unique key for v1 and v2
)
ROW_FORMAT=COMPRESSED
PARTITION BY RANGE(dtvalue)
SUBPARTITION BY HASH(v1,v2) SUBPARTITIONS 32 -- Does this HASH subpartition work?
(PARTITION p20191101 VALUES LESS THAN('2019-11-01'),
PARTITION p20191102 VALUES LESS THAN('2019-11-02'),
PARTITION pMax VALUES LESS THAN MAXVALUE);
此 table 将经常与 v1
和 v2
结合作为唯一标识符,因此将这两列都用于 HASH
键至关重要。
我的问题是,您可以指定多个列作为 HASH
键的一部分吗?
或者您可以为 HASH
键指定唯一键本身吗?
例如SUBPARTITION BY HASH(uk_table1) SUBPARTITIONS 32
我不确定具体 MYSQL,但在 SQL 服务器中我使用了 concat。
select hashbytes('md5', lower(concat(field1, field2, field3))) from tableX
您可能需要重新考虑有关分区的方法。 MySQL 非常挑剔——因此主键和唯一约束需要包括分区键。
而且,散列分区采用整数,但允许的显式函数非常有限。令人高兴的是,您可以使用存储的生成列来解决这个问题。
因此,以下内容可实现您的既定目标:
CREATE TABLE table1 (
id INT NOT NULL AUTO_INCREMENT,
dtvalue datetime NOT NULL, -- Used for RANGE partitions
v1 INT NOT NULL, -- Used for HASH partitions
v2 INT NOT NULL,
CONSTRAINT pk_table1 PRIMARY KEY(id, dtvalue, v1_v2),
v1_v2 int generated always as (cast(conv(left(md5(concat_ws(':', v1, v2)), 8), 16, 10) as unsigned)) stored
)
ROW_FORMAT=COMPRESSED
PARTITION BY RANGE COLUMNS (dtvalue)
SUBPARTITION BY HASH (v1_v2) SUBPARTITIONS 32 -- Does this HASH subpartition work?
(PARTITION p20191101 VALUES LESS THAN ('2019-11-01'),
PARTITION p20191102 VALUES LESS THAN ('2019-11-02'),
PARTITION pMax VALUES LESS THAN MAXVALUE);
我正在创建具有复合分区的 table(RANGE
,然后是 HASH
)
我的实际 table 很大,所以这里有一个精简的虚拟模型 table 显示了重要部分:
CREATE TABLE table1(
id INT NOT NULL AUTO_INCREMENT,
dtvalue DATETIME NOT NULL, -- Used for RANGE partitions
v1 INT NOT NULL, -- Used for HASH partitions
v2 INT NOT NULL,
CONSTRAINT pk_table1 PRIMARY KEY(id),
CONSTRAINT uk_table1 UNIQUE(v1,v2) -- Unique key for v1 and v2
)
ROW_FORMAT=COMPRESSED
PARTITION BY RANGE(dtvalue)
SUBPARTITION BY HASH(v1,v2) SUBPARTITIONS 32 -- Does this HASH subpartition work?
(PARTITION p20191101 VALUES LESS THAN('2019-11-01'),
PARTITION p20191102 VALUES LESS THAN('2019-11-02'),
PARTITION pMax VALUES LESS THAN MAXVALUE);
此 table 将经常与 v1
和 v2
结合作为唯一标识符,因此将这两列都用于 HASH
键至关重要。
我的问题是,您可以指定多个列作为 HASH
键的一部分吗?
或者您可以为 HASH
键指定唯一键本身吗?
例如SUBPARTITION BY HASH(uk_table1) SUBPARTITIONS 32
我不确定具体 MYSQL,但在 SQL 服务器中我使用了 concat。
select hashbytes('md5', lower(concat(field1, field2, field3))) from tableX
您可能需要重新考虑有关分区的方法。 MySQL 非常挑剔——因此主键和唯一约束需要包括分区键。
而且,散列分区采用整数,但允许的显式函数非常有限。令人高兴的是,您可以使用存储的生成列来解决这个问题。
因此,以下内容可实现您的既定目标:
CREATE TABLE table1 (
id INT NOT NULL AUTO_INCREMENT,
dtvalue datetime NOT NULL, -- Used for RANGE partitions
v1 INT NOT NULL, -- Used for HASH partitions
v2 INT NOT NULL,
CONSTRAINT pk_table1 PRIMARY KEY(id, dtvalue, v1_v2),
v1_v2 int generated always as (cast(conv(left(md5(concat_ws(':', v1, v2)), 8), 16, 10) as unsigned)) stored
)
ROW_FORMAT=COMPRESSED
PARTITION BY RANGE COLUMNS (dtvalue)
SUBPARTITION BY HASH (v1_v2) SUBPARTITIONS 32 -- Does this HASH subpartition work?
(PARTITION p20191101 VALUES LESS THAN ('2019-11-01'),
PARTITION p20191102 VALUES LESS THAN ('2019-11-02'),
PARTITION pMax VALUES LESS THAN MAXVALUE);