【问题标题】:How to partition MySQL table by column that is not in the unique index如何按不在唯一索引中的列对 MySQL 表进行分区
【发布时间】:2012-08-01 15:52:43
【问题描述】:

让我们有一个简单的产品表。每个产品都有其唯一的 ID 和类别。用户经常按类别搜索,所以我想按类别划分产品。一个分区中的每个类别,例如

我该怎么做?因为当然我的 ID 列上有一个主键并且需要我的 ID 是唯一的。在每个类别中都不是唯一的。

但是 partitiong 有这个限制,即“表上的每个唯一键都必须使用表的分区表达式中的每一列”。

嗯,这不是让分区有点没用吗?还是我错过了什么?我该怎么办?

http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

【问题讨论】:

    标签: mysql partitioning unique-index


    【解决方案1】:

    诀窍是将字段category 添加到您当前的主键中。 (您的主键将保持为主键)
    然后您可以按类别对表进行分区。

    这里是你可以使用的代码:

    ALTER TABLE `products` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id` , `category` );
    ALTER TABLE `products` PARTITION BY KEY(category) PARTITIONS 6;
    

    如果您希望它真正唯一,请在id中添加auto_increment选项,并且在向表中插入数据时不要指定id值。 id 将在插入时由数据库服务器确定。

    如有必要,更改字段名称和键名称。

    文档:
    Partitioning types
    KEY Partioning

    【讨论】:

    • 当然,但是 id 将不是唯一的,而只是在类别中是唯一的,这是我不想要的。 Replace Into 将停止工作。如果产品类别发生变化,产品将被重复。但无论如何,谢谢你的回答。
    • 没有。正如我在回答中所写的那样,将字段添加到主键不能使其成为 non_unique。你为什么不试着看看它是否有效?我已经在一个大日志表(2 到 500 万条记录之间)上使用该分区来按天进行分区:它允许非常快的 SELECT 一天,并且非常快速地删除特定日期的所有记录(只需删除一个分区)。
    • 哦不,我知道 PRIMARY KEY 仍然是唯一的。但是现在仅作为键一部分的 ID 将不再是唯一的,因为类别列中的不同值可以使键唯一,尽管 ID 将相同。但看起来 MySQL 就是这样工作的(尽管它没有多大意义),我将不得不忍受它。无论如何,感谢您的努力。
    • 在做出错误假设之前尝试一下!制作表格和数据的完整副本,然后在我的答案中运行 2 个查询。你会看到一切正常。向主键添加字段永远不会使其不唯一(是的,永远不会!)。向主键添加字段不会阻止 ID 的唯一性,它已经是唯一的并且将保持唯一。只要尝试一下,您就会发现我写的所有内容都是真实的,并且按说明工作。如果您愿意,可以创建表和数据的副本,并在此副本上测试分区。
    • 我在上面的答案中添加了文档链接。
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2018-10-19
    • 2021-04-30
    相关资源
    最近更新 更多