【问题标题】:mysql partitioning by datemysql 按日期分区
【发布时间】:2016-07-07 12:24:03
【问题描述】:

我正在尝试在 mysql 中在日期列 MV_DATE 的类型为 DATE 上创建一个分区

这是查询 -

ALTER TABLE table_name PARTITION BY RANGE (TO_DAYS(MV_DATE))(PARTITION p0 VALUES LESS THAN (TO_DAYS('2015-08-31')));

我收到错误A PRIMARY KEY must include all columns in the table's partitioning function

MV_DATE 不是我表的主键。

我也尝试了ALTER TABLE JOB_VOL_SWH PARTITION BY RANGE ((MV_DATE))(PARTITION p0 VALUES LESS THAN (TO_DAYS('2015-08-31')));,它抛出了错误ERROR 1659 (HY000): Field 'JB_DATE' is of a not allowed type for this type of partitioning

我现在尝试了几个选项,但似乎没有一个有效。

有没有一种特殊的方法可以按日期范围创建分区? MYSQL 表有近十亿行数据,这几乎意味着我的查询根本不返回(实际上)。因此,希望对表进行分区。

【问题讨论】:

    标签: mysql partitioning database-partitioning partition


    【解决方案1】:

    19.6.1 分区键、主键和唯一键

    本节讨论分区键与 主键和唯一键。管理这种关系的规则可以 表示如下:分区中使用的所有列 分区表的表达式必须是每个唯一键的一部分 表可能有。

    换句话说,表上的每个唯一键都必须使用表中的每一列 表的分区表达式。 (这也包括表的 主键,因为根据定义它是唯一键。这个特别 本节稍后将讨论这种情况。)例如,每个 以下建表语句无效:

    参考:

    https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-partitioning-keys-unique-keys.html

    【讨论】:

    • 谢谢迪伦。在我的情况下,MV_DATE 列不能是唯一的。除了作为自动增量整数的虚拟主键之外,表中的所有列都不能是唯一的。我猜这个分区没有意义,因为我的任何查询都不使用它。那么有没有其他方法可以对表进行分区呢?
    • 错了。 AUTO_INCREMENT not 必须单独存在。 PRIMARY KEY(id, mv_date) 很好。 AI 只需在您第一次打开表格时找到MAX(id);而那个PK就足够了。但是,您确实会丢失对 INSERTing 的检查重复的 id。但从来没有人这样做过。 More on partitioning, especially BY RANGE(TO_DAYS(..)).
    • 瑞克是对的。非唯一的 mv_date 可以作为复合主键添加到主键中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2019-03-05
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2011-10-07
    • 2016-08-12
    相关资源
    最近更新 更多