【问题标题】:partiotion mysql table by hour basis按小时对mysql表进行分区
【发布时间】:2021-11-17 08:13:21
【问题描述】:

我的示例表如下所示

CREATE TABLE TEST_1 (
  id int(11) NOT NULL AUTO_INCREMENT,
  createdAt datetime NOT NULL,
  name varchar(45) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

我希望每小时创建一个分区,因为每小时将保存大约 400 万条记录,我想在一些处理后删除该分区。一次最多可以使用 5 个分区。

首先尝试创建分区

alter table TEST_1 partition by range(createdAt)(
    PARTITION pmin values less than ('2021-11-17 08:00:00'),
    PARTITION p2020111709 values less than ('2020-11-17 09:00:00'),
    PARTITION p2020111710 values less than ('2020-11-17 10:00:00'),
    PARTITION p2020111711 values less than ('2020-11-17 11:00:00'),
    PARTITION pmax VALUES LESS THAN (MAXVALUE)
)

但它会抛出错误提示

错误代码:1697。分区“pmin”的 VALUES 值必须为 INT 类型

使用范围列会引发错误

错误代码:1493。每个分区的 VALUES LESS THAN 值必须严格递增

我不知道如何前进????

【问题讨论】:

  • 您必须:(1) 将 createdAt 的数据类型从 DATETIME 更改为 TIMESTAMP (2) 创建包含此列的主键 (3) 使用 UNIX_TIMESTAMP(createdAt) 作为分区表达式。

标签: mysql partitioning database-indexes


【解决方案1】:

注意:不到 2 年,id INT 将溢出。

表中还有其他内容吗?如果是这样,为什么还要有id

你如何处理 2000 万个“名字”的列表?并且可以有重复。

还有其他语法选项:

⚈  PARTITION BY RANGE COLUMNS(DATETIME) (5.5.0)
⚈  PARTITION BY RANGE(TIMESTAMP) (version 5.5.15 / 5.6.3)
⚈  PARTITION BY RANGE(TO_SECONDS()) (5.6.0)

其中第一个可能最接近您所拥有的。只需插入 COLUMNS

PARTITIONing 上的更多 cmets(包括上面的语法):http://mysql.rjweb.org/doc.php/partitionmaint

【讨论】:

  • 例如上表是共享的,实际id是uid字符串,
  • 我已经为每一行添加了分区键(额外的列)来解决问题。类似于 2021111903(YYYYMMDDHH) 格式
  • @santhosh - 一个 36 字符的 UUID?那很笨重;它有什么用途?
  • 而且 YYYYMMDDHH 很笨重; DATETIME(或TIMESTAMP)会更好。
  • 但这并没有为我们提供每小时创建分区的选项
猜你喜欢
  • 2018-10-19
  • 2016-10-15
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多