0

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

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,但是手册告诉我不允许:

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

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

4

3 回答 3

3

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

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

于 2009-12-09T01:13:55.423 回答
0

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

于 2009-12-03T04:04:53.483 回答
0

不,不是现在的形式。

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

于 2009-12-03T03:53:48.713 回答