首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为键指定多个列,作为散列子分区的一部分?

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

Stack Overflow用户
提问于 2019-11-13 16:23:10
回答 1查看 959关注 0票数 1

我正在创建一个具有复合分区的表(RANGE,然后是HASH)

我的实际表是巨大的,所以这里有一个简化的虚拟表,它显示了重要的部分:

代码语言:javascript
运行
复制
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);

此表将经常由v1v2作为唯一标识符组合在一起,因此对HASH键使用这两列至关重要。

我的问题是,您可以指定多个列作为HASH键的一部分吗?

或者您可以为HASH密钥指定唯一的密钥本身吗?

例如SUBPARTITION BY HASH(uk_table1) SUBPARTITIONS 32

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-13 17:33:47

您可能需要重新考虑有关分区的方法。MySQL非常挑剔--所以主键和唯一的约束需要包括分区键。

而且,哈希分区采用整数,但允许显式函数的集合非常有限。幸运的是,您可以通过存储生成的列来解决这个问题。

因此,以下内容实现了您的既定目标:

代码语言:javascript
运行
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58841376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档