2016-08-01 9 views
0

これはInnoDBを使用したMySQL 5.7用です。MySQL - パーティション、インデックスによるデータロード

私はパーティション化されたテーブルを持っており、(大量のデータの)バッチデータをパーティションでロードしています。すなわち、私がロードするデータの各バッチが排他的に1つのパーティションに入ることを知っている。

データの読み込みでインデックスを処理する一般的な方法は、すべてのインデックスを先に削除し、データを読み込んでからインデックスを再作成することです。

しかし、私はパーティションで読み込んでいるので、これはまだ最適ではない(インデックスを削除してから再作成する)のですが、私は不必要に更新されていないパーティションに触れているようですこちらです。

パーティション1

  1. ドロップに

    1. のデータのロードすべてのインデックス - 何も起こりません、まだデータがないからです。
    2. データをロード - すべてがパーティション1に入ります。
    3. インデックスを作成します - パーティション1のみが変更されます。パーティション2
      1. ドロップへ
    4. のデータのロードすべてのインデックス - パーティション1内のすべてのインデックスが(不要!)ドロップ
    5. のデータのロード - すべてのパーティション2
    6. に入るインデックスを作成します - パーティションを1つのインデックスが再作成され(不要!)、パーティション2のインデックスが作成されました。
    7. したがって、この第2バッチのデータのロードには、第1バッチよりもかなり時間がかかります。そしてそれは各バッチのために悪化するでしょう!その場合

、私はインデックスを事前に作成し、データをロードするときにそれらをそこに残す必要がありますか?

(ところで、クエリを心配しないでください。データの読み込みが行われたときに、データベースが「オフライン」である。ここでの目的は、データのみのロードの各バッチのための時間を短縮することである。)

テーブルスキーマ

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列のいずれも含まれていません。

+0

InnoDB? 'SELECTs'とは何ですか?どのインデックスを追加しますか? utf8?単一列の 'DATE'を使用する代わりに' YEAR'と 'MONTH'を分割するのは実際に有益でしょうか?選択肢は1ヶ月以上に渡りますか?あなたは常にWHERE year = constant AND month = constant'を使用しますか? –

答えて

2

InnoDBを使用している場合は、PRIMARY KEYを削除しないでください。

すべてPARTITIONsは常に同じインデックスを持ちます。したがって、インデックスを個別にオン/オフすることはできません。

SHOW CREATE TABLEにさらなる批評とアドバイスを提供してください。 I PARTITIONingは役に立たないと言います。 PARTITIONを使用する価値があるユースケースはほとんどありません。 More info, and use cases

+0

この表には、時間ベースのデータがあります。各バッチは1ヶ月分のデータです。パーティション化は、データエージング(例えば、いくつかの古いデータがもはや使用されていないときに、パーティション全体を落とす)に役立つ。 私は個々のパーティションでインデックスを持つことができないことを理解しています。したがって、疑問。データをロードするたびに索引を削除して再作成する代わりに、索引を残しておけば、データをロードするたびに不要な索引を削除して作成する必要はありません。 –

+0

ああ、PRIMARY KEYを削除していません...非PKインデックスのみです。 –

+0

私はこの質問を理解していますが、私は直接答えはありません。とにかくインデックスを見たいと思います。その1つのユースケースは非常に良いものです。別の質問:「バッチ」の行数 –

関連する問題