すべてのプロダクト
Search
ドキュメントセンター

PolarDB:B-treeインデックス

最終更新日:May 24, 2024

B-treeインデックスは、最も頻繁に使用されるインデックスです。 これらは、等価クエリ、範囲クエリ、インデックスソート、マルチカラム条件、および条件式に適しています。

演算子

演算子
<select * from test (id <1)
<=select * from test (id <=1)
=select * from test (id =1)
>=select * from test (id >=1)
>select * fromテスト (id >1)
との間idが1から10のテストから * を選択します
inselect * from test where id in (1,2,3)
のようにselect * from test id like 'abc %'

複数列インデックス

マルチ列インデックスは、テーブルの複数の列のインデックスを示します。 最大32列のインデックスを作成できます。

  • 次のスキーマを持つテーブルを作成します。
    テーブルテストの作成 (id int,name varchar(10))
  • データの照会
    select * from test where id=1 and name='a1';
  • マルチカラムインデックスを作成します。
    作成インデックスONテスト (id、name);
  • 実行計画を表示します。
    postgres=# explain select * from test where id=1 and name='a1';
                                       クエリ計画
    --------------------------------------------------------------------------------
     インデックスのみテスト時にa_id_name_idxを使用したスキャン (コスト=0.42 .. 8.44行=1幅=10)
       Index Cond :( (id = 1) AND (name = 'a1'::text))
    (2行) 

次のサンプルコードでは、条件にIDが含まれていない場合、データのクエリにインデックスは使用されません。

postgres=# explain select * from test where name='a1';
                       クエリ計画
--------------------------------------------------------
 テスト時のSeqスキャン (コスト=0.00 .. 1791.00行=1幅=10)
   フィルター :( (名前)::text = 'a1'::text)
(2行) 

式のインデックス

式のインデックスの場合、インデックス列は物理テーブルの列である必要はありませんが、テーブルの1つ以上の列から計算される関数または式であることができます。

  • 次のスキーマを持つテーブルを作成します。
    テーブルテストの作成 (id int,name varchar(10))
  • データの照会
    select * from test where lower(name)='a1';
  • 式にインデックスを作成します。
    作成インデックスONテスト (下 (名前));
  • 実行計画を表示します。
    postgres=# explain select * from test where lower(name)='a1';
                                       クエリ計画
    --------------------------------------------------------------------------------
     ビットマップヒープテスト時のスキャン (コスト=12.17 .. 571.91行=500幅=10)
       Recheck Cond :( lower((name)::text) = 'a1'::text)
       -> test_lower_idxのビットマップインデックススキャン (コスト=0.00 .. 12.04行=500幅=0)
             Index Cond :( lower((name)::text) = 'a1'::text)
    (4行) 

データの行が挿入または更新されるたびに新しい式を計算する必要があるため、式のインデックスを維持するコストが高くなります。

部分インデックス

部分インデックスは、テーブルのサブセットに基づいて作成されるインデックスです。 サブセットは、条件式によって定義される。 インデックスには、述語を満たすテーブル行のみのエントリが含まれます。

  • 次のスキーマを持つテーブルを作成します。
    テーブルテストの作成 (id int,name varchar(10))
  • データの照会
    select * from test where name='a1';
    select * from test where name='a2'; 
  • 部分インデックスを作成します。
    作成インデックスONテスト (名前) name='a1';
  • 実行計画を表示します。
    postgres=# explain select * from test where name='a1';
                                    クエリ計画
    ---------------------------------------------------------------------------
     テスト時にtest_name_idxを使用したインデックススキャン (コスト=0.12 .. 8.14行=1幅=10)
    (1行)
    
    postgres=# explain select * from test where name='a2';
                           クエリ計画
    --------------------------------------------------------
     テスト時のSeqスキャン (コスト=0.00 .. 1791.00行=1幅=10)
       フィルター :( (名前)::text = 'a2'::text)
    (2行) 

インデックスの並べ替え

インデックスは、クエリによって返される行を見つけ、特定のソートされた順序で行を返すことができます。 このプロセスは、別個の仕分けステップを必要としない。

  • 次のスキーマを持つテーブルを作成します。
    テーブルテストの作成 (id int,name varchar(10))
  • データの照会
    select * fromテストオーダーで名前desc;
  • インデックスを作成する前に実行プランを表示します。
    postgres=# explain select * from test order by name desc;
                                クエリ計画
    -------------------------------------------------------------------
     並べ替え (コスト=9845.82 .. 10095.82行=100000幅=10)
       ソートキー: 名前DESC
       -> Seqテストでスキャン (コスト=0.00 .. 1541.00行=100000幅=10)
    (3行) 
  • インデックスを作成します。
    作成インデックスONテスト (名前desc);
  • 実行計画を表示します。
    postgres=# explain select * from test order by name desc;
                                        クエリ計画
    -----------------------------------------------------------------------------------
     テスト時にtest_name_idxを使用したインデックススキャン (コスト=0.29 .. 3666.46行=100000幅=10)
    (1行) 

デフォルトでは、Bツリーインデックスはエントリを昇順に格納し、末尾にnull値を配置します。 Bツリーインデックスを作成するときは、ASC、DESC、NULLS FIRST、およびNULLS LASTオプションを使用して並べ替え順序を変更できます。

インデックスのみのスキャンとカバーインデックス

インデックス関連のフィールドのみをクエリする場合、インデックスのみのスキャンはインデックスのみから結果を返すことができますが、特定のデータファイルにアクセスする必要はありません。

  • 例 1
    • 次のスキーマを持つテーブルを作成します。
      テーブルテストの作成 (id int,name varchar(10))
    • データの照会
      select name from test where name='a1';
    • インデックスを作成する前に実行プランを表示します。
      postgres=# name='a1' のテストから選択名を説明します。
                            クエリ計画
      -------------------------------------------------------
       テスト時のSeqスキャン (コスト=0.00 .. 1791.00行=1幅=6)
         フィルター :( (名前)::text = 'a1'::text)
      (3行) 
    • インデックスを作成します。
      作成インデックスONテスト (名前);
    • インデックスの作成後に実行計画を表示します。
      postgres=# name='a1' のテストから選択名を説明します。
                                        クエリ計画
      -------------------------------------------------------------------------------
       インデックスのみテスト時にtest_name_idxを使用してスキャン (コスト=0.29 .. 8.31行=1幅=6)
         Index Cond :( name = 'a1'::text)
      (2行) 
  • 例 2
    • 例1で作成したテーブルと同じスキーマを持つテーブルを作成します。
      Create table test(id int,name varchar(10));
    • データの照会
      select * from test where name='a1';
    • インデックスを作成する前に実行プランを表示します。
      postgres=# explain select * from test where name='a1';
                             クエリ計画
      --------------------------------------------------------
       テスト時のSeqスキャン (コスト=0.00 .. 1791.00行=1幅=10)
         フィルター :( (名前)::text = 'a1'::text)
      (2行) 
    • カバーインデックスを作成します。
      create index ON test (name) include(id);
    • インデックスの作成後に実行計画を表示します。
      postgres=# explain select * from test where name='a1';
                                          クエリ計画
      -----------------------------------------------------------------------------------
       インデックスのみテスト時にtest_name_id_idxを使用してスキャン (コスト=0.42 .. 8.44行=1幅=10)
         Index Cond :( name = 'a1'::text)
      (2行) 

カバーインデックスを使用できるのは、クエリステートメントがインデックスに格納されている列のみを参照する場合のみです。 カバーインデックスを使用した後、システムはインデックスのみをスキャンし、結果を返すためにテーブル内のデータをスキャンする必要はありません。

インデックスページのタイプ

インデックスページでは、インデックスの内部アーキテクチャについて簡単に説明します。 前述のインデックス機能は、内部アーキテクチャに基づいて実装されます。 PolarDBのBツリーインデックスページは、次のタイプに分類されます。

  • メタページ
  • ルートページ
  • ブランチページ
  • 葉のページ

メタページとルートページの種類が必要です。 メタページは、1つのページに格納され、ルートページのページIDに向けられる。 レコードが増加するにつれて、ルートページではすべてのヒープアイテムを格納するには不十分な場合があります。 したがって、リーフページ、ブランチページ、または多層ブランチページが必要です。

B-tree indexes