2011-02-08 47 views
0

非常に大量の生データが格納されるデータベースをMysqlで設計しています。データを挿入する前にインデックスを定義する必要があることを知りたいのですが、最初にデータを挿入してインデックスを作成する必要がありますか?何か違いはありますか? また、私は知っていると思う私は2列にインデックスを持っている場合は、それを個別にまたは一緒にインデックスを作成する方が良いですか? ありがとうMySqlでのインデックス作成時間

答えて

2

バルクロードを実行している場合、私の意見ではインデックスを前に置かないことです。インデックスページを常に書き込むように負荷を軽減します。つまり、表が移入された後、1つずつではなく、すべての索引を作成するためにSINGLE文を実行します。私はずっと前に難しい方法を学んだ。私は1400万行以上のテーブルを持ち、15以上のインデックスを構築しなければなりませんでした。各指標は最後よりもますます長くなっています。新しいインデックスが登場するたびに、以前のページを再構築する必要がありました。すぐにそれらをすべて行うことは、はるかに優れています。

複数の列インデックスについては、クエリの実行方法によって異なります。多くの照会でWHERE条件の列以上の列を使用する場合は、単一の索引で複数の列を使用します。

+0

3つのインデックスを持つインデックスを1回、別々にインデックスを作成すると、それは悪い高オーバーヘッドですか? – Hossein

+2

これは問題ありません。実際に個別にクエリを実行する必要がない場合は、不必要なオーバーヘッドに過ぎません。 – judda

1

データを先に挿入してください。

2列、いずれかのコンボ検索や個人としてのインデックスは、(通常のCIRCの下)になります場合:

idx_a(FLDA + FLDB) idx_b(FLDB)

に関して、 //トン

1

通常、大量のデータを挿入するときは、後でインデックスを作成する必要があります。つまり、データが挿入されるとインデックスを維持したり再構築したりする必要がないため、挿入プロセスが高速化されます。

インデックス作成の戦略は、データベースのクエリ方法によって異なります。あなたはそれらをセットとしてクエリしていますか(つまり、where句を一緒に持つか)(つまり、where句でどちらか一方を持つ)個人であるかどうかです。

+0

私は仮定しているセットを照会します。 – Hossein

+1

その後、必要に応じて、セットは(両方向)...(フィールド1、フィールド2)および(フィールド2、フィールド1)に索引付けする必要があります。 – judda

2

また、私は、私はしたいが、2列に インデックスを持っている場合は知りたい、それが インデックス別々にまたは一緒に良いですか?

これはクエリによって異なります。インデックス(colA、colB)がある場合、クエリのWHERE条件でcolAを使用しない場合、データベースはこのインデックスを使用できません。クエリがある場合WHERE colB = ?この列で始まるインデックスが必要です。

index (colA, colB); 
WHERE colA = ?; -- can use the index 
WHERE colA = ? AND colB = ?; -- can use the index 

この1つは失敗します。

WHERE colB = ?; 

しかし...あなたは、インデックス内の列の順序を変更する場合:

index (colB, colA); -- different order 
WHERE colb = ?; -- can use the index 
WHERE colA = ? AND colB = ?; -- can use the index 

そして今、この1つは使用することはできませんがインデックス:

WHERE colA = ?; 

クエリを確認するには、を使用してくださいを作成し、実際に必要なインデックスのみを作成します。

+0

WHERE colA =? AND colB =? - インデックス(colB、colA)を使用しないインデックス< - を使用できます。インデックス(colA、colB)が必要です – judda

+1

@judda:WHERE colA =? AND colB =? WHERE colB =とまったく同じですか? AND colA =? MySQLが両方のインデックスを使用できない場合は、オプティマイザに深刻なバグがあります。 EXPLAINが伝えます。 –

+0

私はいくつかのオプティマイザで両方の方法が異なって扱われるので両方の方法を索引付けする必要があることを知っています。 mysqlの場合、私は100%確実ではありません。オプティマイザは必要に応じてそれらをスワップしますが、そうでないかもしれません。 http://explainextended.com/2010/05/19/things-sql-needs-determining-range-cardinality/は、インデックスに関する擬似的な説明であり、それらがmysqlでどのように動作するかを示します。 – judda

関連する問題