2

いくつかのクエリを含むパフォーマンスの低い手順が 1 つあります。

一時テーブルをスキャンするいくつかの一時テーブル クエリを特定しました。テーブルのスキャンを避けるために、一時テーブルにインデックスを追加することにしました。where句で使用されている一時テーブルの列が複数あることに気付きました。ただし、最大のパフォーマンスを得るために、すべての列を単一のインデックス (複合インデックス) に含めるか、インデックスごとに 1 つの列を持つ複数のインデックスに含めるかはわかりません。

データベースは DB2

4

2 に答える 2

1

MySQL の場合、インデックス内のすべての列をテストするクエリ、または最初の列のみ、最初の 2 つの列、最初の 3 つの列などをテストするクエリに複数列のインデックスを使用できます。

インデックス定義で列を正しい順序で指定すると、単一の複合インデックスで同じテーブルに対する複数の種類のクエリを高速化できます。

INDEX nameIdx (last_name,first_name)テーブルテストで作成したとしましょう

したがって、nameIdxインデックスは、次のクエリでのルックアップに使用されます。

SELECT * FROM test WHERE last_name='Widenius';

SELECT * FROM test
  WHERE last_name='Widenius' AND first_name='Michael';

SELECT * FROM test
  WHERE last_name='Widenius'
  AND (first_name='Michael' OR first_name='Monty');

nameIdxという名前は、次のクエリのルックアップには使用されません。

SELECT * FROM test WHERE first_name='Michael';

SELECT * FROM test
  WHERE last_name='Widenius' OR first_name='Michael';

詳しくはURL参照

これの要約は、インデックス順(左から右)で述べたようにwhere句で列を使用している場合、単一列インデックスよりも優れています

于 2014-04-16T07:12:06.780 に答える
1

これはすべて、クエリとテーブルのデータに大きく依存します。経験則として、結果行を大幅に削減する列のみを含める必要があります。

たとえば、最初の制限列の where 句がすでに行の 90% を削除し、次の行で数百行しか削減されない場合、インデックスにリソースを含める価値はありません。データベース エンジンは最初に複合インデックスの最初の列を処理してから、次の列に進むことに常に注意してください。クエリの列の順序が異なる場合、インデックスが開始され、クエリの速度が低下する可能性さえあります。

また、大量のデータがあり、いくつかのインデックス付きの列を使用する価値があると思われる場合は、場合によっては個別のインデックスを作成して並列処理を実行したい場合があります。サーバーに余裕がある場合は、複数の CPU を使用して並列インデックス ルックアップを実行すると、パフォーマンスが向上する可能性があります。

于 2011-09-17T21:00:05.653 に答える