作为散列子分区的一部分,如何为键指定多个列?

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 将经常与 v1v2 结合作为唯一标识符,因此将这两列都用于 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);