これはInnoDBを使用したMySQL 5.7用です。MySQL - パーティション、インデックスによるデータロード
私はパーティション化されたテーブルを持っており、(大量のデータの)バッチデータをパーティションでロードしています。すなわち、私がロードするデータの各バッチが排他的に1つのパーティションに入ることを知っている。
データの読み込みでインデックスを処理する一般的な方法は、すべてのインデックスを先に削除し、データを読み込んでからインデックスを再作成することです。
しかし、私はパーティションで読み込んでいるので、これはまだ最適ではない(インデックスを削除してから再作成する)のですが、私は不必要に更新されていないパーティションに触れているようですこちらです。
パーティション1
- ドロップに
- のデータのロードすべてのインデックス - 何も起こりません、まだデータがないからです。
- データをロード - すべてがパーティション1に入ります。
- インデックスを作成します - パーティション1のみが変更されます。パーティション2
- ドロップへ
- のデータのロードすべてのインデックス - パーティション1内のすべてのインデックスが(不要!)ドロップ
- のデータのロード - すべてのパーティション2
- に入るインデックスを作成します - パーティションを1つのインデックスが再作成され(不要!)、パーティション2のインデックスが作成されました。
- したがって、この第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
列のいずれも含まれていません。
InnoDB? 'SELECTs'とは何ですか?どのインデックスを追加しますか? utf8?単一列の 'DATE'を使用する代わりに' YEAR'と 'MONTH'を分割するのは実際に有益でしょうか?選択肢は1ヶ月以上に渡りますか?あなたは常にWHERE year = constant AND month = constant'を使用しますか? –