我正在创建一个具有复合分区的表(RANGE,然后是HASH)
我的实际表是巨大的,所以这里有一个简化的虚拟表,它显示了重要的部分:
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);此表将经常由v1和v2作为唯一标识符组合在一起,因此对HASH键使用这两列至关重要。
我的问题是,您可以指定多个列作为HASH键的一部分吗?
或者您可以为HASH密钥指定唯一的密钥本身吗?
例如SUBPARTITION BY HASH(uk_table1) SUBPARTITIONS 32
发布于 2019-11-13 17:33:47
您可能需要重新考虑有关分区的方法。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);https://stackoverflow.com/questions/58841376
复制相似问题