【问题标题】:MySQL - Data Loading by Partitions, and IndexesMySQL - 按分区和索引加载数据
【发布时间】:2016-08-01 03:29:00
【问题描述】:

这适用于带有 InnoDB 的 MySQL 5.7。

我有一个分区表,我将按分区进行批量数据加载(大量数据)。即我知道我加载的每批数据都将完全落入一个分区中。

现在,处理数据加载索引的常用方法(据我所知)是先删除所有索引,进行数据加载,然后重新创建索引。

但我想知道,由于我是按分区加载的,这是否仍然是最佳方式(删除然后重新创建索引),因为我似乎不必要地“触摸”了未更新的分区方式。

例如

  1. 正在将数据加载到分区 1。
    1. 删除所有索引 - 没有任何反应,因为还没有数据。
    2. 加载数据 - 全部进入分区 1。
    3. 创建索引 - 仅修改分区 1。
  2. 正在将数据加载到分区 2。
    1. 删除所有索引 - 删除分区 1 中的所有索引(不必要!)
    2. 加载数据 - 全部进入分区 2。
    3. 创建索引 - 重新创建分区 1 索引(不必要!)并创建分区 2 索引。
    4. 因此,加载第二批数据的时间比第一批要长得多。而且每批都会变得更糟!

在这种情况下,我应该只预先创建索引并在加载数据时将它们保留在那里吗?

(顺便说一句,不用担心查询。数据加载时数据库处于“离线”状态。这里的目的只是为了缩短每批数据加载的时间。)

表架构如下:

CREATE TABLE MYTABLE (
    ID      BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
    YEAR    SMALLINT UNSIGNED NOT NULL,
    MONTH   TINYINT UNSIGNED NOT NULL,
    A       CHAR(4),
    B       VARCHAR(127),
    C       VARCHAR(15),
    D       VARCHAR(511),
    E       TEXT,
    F       TEXT,
    G       VARCHAR(127),
    H       VARCHAR(127),
    I       VARCHAR(127),
    J       VARCHAR(511),
    K       VARCHAR(511),
    L       BIT(1),
    CONSTRAINT PKEY PRIMARY KEY (ID, YEAR, MONTH)
)
PARTITION BY LIST COLUMNS(YEAR, MONTH) (
    PARTITION PART1 VALUES IN ((2007, 1)),
    PARTITION PART2 VALUES IN ((2007, 2)),
    PARTITION PART3 VALUES IN ((2007, 3)),
    ...
);

当然,还有一堆索引(总共 14 个),主要涉及 2 到 4 列。 2 个TEXT 列都不在任何索引中。

【问题讨论】:

  • InnoDB? SELECTs 是什么样的?您将添加哪些索引? utf8?拆分YEARMONTH 而不是使用单列DATE 真的有益吗?选择会超过一个月吗?你总是使用WHERE year=constant AND month=constant吗?

标签: mysql indexing partitioning


【解决方案1】:

如果您使用的是 InnoDB,请不要删除 PRIMARY KEY

所有PARTITIONs 始终具有相同的索引。所以你不能单独打开/关闭索引。

请提供SHOW CREATE TABLE 以获得进一步的批评和建议。我可能PARTITIONing 没用;很少有用例值得使用PARTITIONMore info, and use cases

【讨论】:

  • 对于这个表,我有基于时间的数据。每批是一个月的数据。分区将有助于数据老化(例如,当一些旧数据不再使用时删除整个分区)。了解我不能按单个分区建立索引。因此问题。与其每次加载一批数据时都删除并重新创建索引,不如将索引留在那里,这样每当我加载数据时,其他分区就不需要通过删除和创建不必要的索引来“触及”?
  • 哦,我不会删除 PRIMARY KEY... 只有非 PK 索引。
  • 我理解这个问题,但我没有直接的答案。无论如何,我想查看索引。那一个用例是一个非常好的用例。另一个问题:“批次”中有多少行?
  • 编辑了 OP 以添加表架构。每批大约有 2000 万行。
  • 您最好一次批处理 1000 行 - 然后在每 1000 行之后处理 COMMIT。尝试为 ROLLBACK 保存 20M 行的影响是显着的。 20M 行中的数据是什么类型的??
猜你喜欢
  • 1970-01-01
  • 2016-07-04
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2014-04-20
  • 2016-11-07
  • 2022-08-04
相关资源
最近更新 更多