4

複数列のインデックスでは、どのタイプのクエリがインデックスを使用できるかに関して順序が重要であることを知っています。に記載されてWHEREいる列は、インデックスの左端の列である必要があります。これに関するPostgresの記事があります。

ただし、すべての列が使用されている場合を考えてみましょう。次の 2 つのシナリオで、順序はインデックスを使用するパフォーマンスに影響しますか?

  1. 複数のクエリ=。例:SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND "state" = 'active'
  2. を含むクエリでIN。例:SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND ("state" IN ('active', 'draft'))
4

3 に答える 3

4

複数列のインデックスはツリーとして想像できます。

テーブル
 column1_idx_value0
   column2_idx_value0
   column2_idx_value1
    column3_idx_value0
    column3_idx_value1
    column3_idx_value2
 column1_idx_value1
   column2_idx_value0
   column2_idx_value1
    column3_idx_value0
    column3_idx_value1
    column3_idx_value2

したがって、クエリがcolumn1- インデックスが使用されている場合、列1 AND 2または1 and 2 and 3- インデックスが使用されている場合

ただし、 with column 2only または with 1 and 3or 2 and 3- インデックスが使用されていない場合 (少なくとも一般的な方法では、DBMS は最適化を行うことができます)

したがって、最初の質問 - すべての列が使用されている場合 - インデックスが使用されます

column IN (value)比較される列がインデックスにあり、このインデックスが使用されている場合、それらはステートメントと同じです-valueクエリである場合(constではない場合)、同じルールが適用されます-それらは同じルールが適用されます

更新: SQL クエリの列の順序はパフォーマンスに影響しません。少なくとも最新のすべての DBMS では、インデックス作成ステートメントの順序 - 影響します

于 2013-10-14T19:16:45.633 に答える
1

はい、複数列インデックスの列の順序は重要です。カーディナリティが最も高い列を最初に配置します。あなたの例では user_id だpost typeと思いますが、state値はほとんどないと思います。その場合、それらを単独で使用したり、複数列のインデックスで最初に使用したりすると、インデックスとしてはほとんど役に立ちません。テーブルを直接スキャンしてから、最初にインデックスをスキャンしてからテーブルをスキャンする方が安価だからです。複数列のインデックスで 2 番目と 3 番目のインデックスとして使用する場合、はい、それらは役に立ちます。

インデックスのメンテナンスは無料ではないことに注意してください。そのコストは、テーブルの更新速度とサイズに正比例します。更新時間が長くなりすぎた場合、そのクエリがあまり一般的でない場合は、特別にインデックス内の余分な列を 1 つまたは 2 つカットします。

于 2013-10-14T22:39:18.460 に答える
0

INand条件の場合、順序は重要ではありません (リストが大きすぎない=限り)。IN

それを確認するには - でクエリ プランを調べるだけEXPLAIN ANALYZEです。

于 2013-10-14T19:12:51.920 に答える