MySQL - 按分区和索引加载数据

时间:2016-08-01 03:29:00

标签: mysql indexing partitioning

这适用于带有InnoDB的MySQL 5.7。

我有一个分区表,我将按分区进行批量数据加载(大量数据)。即我知道我加载的每批数据都将专属于一个分区。

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

但是我想知道,因为我是通过分区加载的,这仍然是最优化的方式(删除然后重新创建索引),因为看起来我不必要地“触摸”未更新的分区方式。

e.g。

  1. 将数据加载到分区1中。
    1. 删除所有索引 - 没有任何反应,因为还没有数据。
    2. 加载数据 - 全部进入分区1。
    3. 创建索引 - 仅修改分区1。
  2. 将数据加载到分区2中。
    1. 删除所有索引 - 分区1中的所有索引都被删除(不必要!)
    2. 加载数据 - 全部进入分区2。
    3. 创建索引 - 重新创建分区1索引(不必要!)和创建分区2索引。
    4. 因此,加载第二批数据的时间明显长于第一批数据。而且每批次都会变得更糟!
  3. 在这种情况下,我应该预先创建索引并在加载数据时将它们保留在那里吗?

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

    表模式如下:

    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列中没有一列属于任何索引。

1 个答案:

答案 0 :(得分:2)

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

所有PARTITIONs始终具有相同的索引。因此,您无法单独打开/关闭索引。

请提供SHOW CREATE TABLE进一步的批评和建议。我可能PARTITIONing没用;使用PARTITION值得使用的用例非常少。 More info, and use cases