我正在使用复合分区(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
您可能需要重新考虑有关分区的方法。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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句