【问题标题】:How can I use MySQL table partitioning on this table?如何在此表上使用 MySQL 表分区?
【发布时间】:2009-12-03 03:25:05
【问题描述】:

我有一个基本上看起来像这样的表:

CREATE TABLE myTable (
    id INT auto_increment,
    field1 TINYINT,
    field2 CHAR(2),
    field3 INT,
    theDate DATE,
    otherStuff VARCHAR(20)
    PRIMARY KEY (id)
    UNIQUE KEY (field1, field2, field3)
)

我想根据theDate 的月份和年份对表进行分区,但是the manual 告诉我不允许:

分区表的分区表达式中使用的所有列必须是该表可能具有的每个唯一键的一部分。换句话说,表上的每个唯一键都必须使用表的分区表达式中的每一列

我在这里有什么选择?我还能对表进行分区吗?

【问题讨论】:

    标签: mysql partitioning


    【解决方案1】:

    我在这里Scaling Rails with MySQL table partitioning 写了一篇关于这个问题的博客文章(rails 使用整数 PK)。同样的技术应该适用于您的情况,但不幸的是,您必须删除 [field1, field2, field3] 唯一键。

    删除唯一密钥也是我处理过的一个问题(尽管帖子中没有提到)。我通过在创建记录之前实施存在检查来解决它,意识到由于竞争条件我们仍然会偶尔受到欺骗。在实践中,这并没有成为问题。然而,增加的查询吞吐量需要扩大 innodb 缓冲区的大小,因为我们的 i/o 是残酷的。

    【讨论】:

      【解决方案2】:

      不,不是现在的形式。

      您可以删除主键,而只是将“id”设为普通索引。二级唯一索引仍然是一个问题,您需要删除它或更改分区方案以涉及 Date 列。

      【讨论】:

        【解决方案3】:

        如果您基于日期时间列的年和月进行分区,您是否考虑过为每个年月组合创建一个表,然后使用merge table?我知道这并不能直接回答您的问题,但认为它可能会有所帮助...

        【讨论】:

        • 嗨,Lytol,我曾考虑过这一点,但我听说他们实际上比只有一张大桌子要慢。你有什么见解吗?
        猜你喜欢
        • 1970-01-01
        • 2021-07-01
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        • 2015-08-01
        • 2017-12-11
        • 1970-01-01
        • 2020-08-02
        相关资源
        最近更新 更多