1

データベース テーブルに対して 2 つのクエリがあるとします。

クエリは、クエリで使用されるフィールドに関して定義されます。

Query1: f1、f2、および f3 に依存

クエリ 2: f1、f2、f3、および f4 に依存

SQL クエリ エンジン (この場合は mySQL) がインデックスの左端のフィールドから開始してインデックス ツリーを解析することをどこかで読んだことを覚えています。

それが正しければ、次のようにテーブルに 2 つのインデックスを定義する代わりに、次のように仮定します。

Index 1 (for Query1) : CREATE INDEX idx_1 {f1, f2, f3}
Index 2 (for Query2) : CREATE INDEX idx_2 {f1, f2, f3, f4}

両方のクエリで使用されるキーの結合を含む 1 つのインデックスを定義するだけです。

このインデックスを定義するだけです。

(for BOTH Query1) : CREATE INDEX the_idx {f1, f2, f3, f4}

2 つの質問があります。

  1. 私の仮定は正しいですか?つまり、前の 2 つのインデックスの代わりに 1 つのインデックス (the_idx) を定義できますか?

  2. このインデックスの動作は PostgreSQL クエリ エンジンにも当てはまりますか?

4

3 に答える 3

1

私の仮定は正しいですか?つまり、前の 2 つのインデックスの代わりに 1 つのインデックス (the_idx) を定義できますか?

はい。
これはカバリング インデックスと呼ばれ、クエリで使用される可能性が最も高いものに基づいて列を並べ替える必要があります。IE: f2 が最も一般的な列である場合は、次を使用します。

CREATE INDEX the_idx {f2, f1, f3, f4}

このインデックスの動作は PostgreSQL クエリ エンジンにも当てはまりますか?

いいえ、Postgres はカバリング インデックスをサポートしていません

インデックスは ANSI 標準ではありません。用語がベンダー間でこれほど一貫しているのは奇跡です。

于 2010-06-26T14:51:19.170 に答える
0

一般に、より多くのデータを含むインデックスが使用可能になります。ただし、そのインデックスに追加するほど、より多くのオーバーヘッドが必要になります。

最善の方法は、それを試して、実行計画を調べて、期待どおりに使用されているかどうかを確認することです。

結果セットで返される実際の列によっては、短いインデックスを使用する方が有益な場合があります。

于 2010-06-26T14:38:39.563 に答える
0

MySQLのマニュアルでは、はい、キーの「プレフィックス」はハッシュ以外のインデックス (ほとんどのインデックス) で検索できることが合理的に明確になっています。

PostgreSQL に関する同等のドキュメントは見つかりませんでしたが、いつでもテーブルを作成してから EXPLAIN を実行できます (とにかく悪い考えではありません)。

于 2010-06-26T14:42:42.500 に答える