paint-brush
初心者のためのデータベース インデックス作成の概要@pragativerma
5,320 測定値
5,320 測定値

初心者のためのデータベース インデックス作成の概要

Pragati Verma7m2022/09/09
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

データベース インデックスを使用すると、クエリで効率的にデータベースからデータを取得できます。索引付けは、レコードを検索する際の効率を最大化する順序に、順序付けされていないテーブルを取得する方法です。インデックスは特定のテーブルに関連付けることができ、1 つ以上のキーで構成されます。テーブルには、そこから構築された複数のインデックスを含めることができます。データベースは、'company_id' の潜在的なすべてのインスタンスを 18 として探すために、一度に 1 つずつ、テーブルに表示される順序で 17 のレコードすべてを検索する必要があります。これは理想的ではなく、膨大な量のデータを含むデータベース テーブル内を調べるときに問題になります。
featured image - 初心者のためのデータベース インデックス作成の概要
Pragati Verma HackerNoon profile picture
0-item


データベース インデックス作成は、バックエンド開発者がデータベース クエリを最適化するために使用する最も一般的な方法です。この記事では、データベースのインデックス作成について詳しく説明します。


データベースのインデックスとは何ですか?

データベース インデックスを使用すると、クエリで効率的にデータベースからデータを取得できます。簡単に言えば、インデックス作成は、レコードを検索するときに効率を最大化する順序で、順序付けされていないテーブルを取得する方法です。


インデックスは特定のテーブルに関連付けることができ、1 つ以上のキーで構成されます。また、1 つのテーブルに複数のインデックスを作成することもできます。


データベース テーブルがインデックス化されていない場合、行の明確な順序はありません。したがって、クエリを実行するには、行を直線的に検索する必要があります。つまり、クエリは各行を検索して検索する必要があります。条件が一致する行。ご想像のとおり、これは理想的ではなく、膨大な量のデータを含むデータベース テーブル内を調べるときに問題になる可能性があります。


たとえば、次のようなテーブルがあります。

COMPANY_ID

単位

単価

10

12

1.15

12

12

1.05

14

18

1.31

18

18

1.34

11

24

1.15

16

12

1.31

10

12

1.15

12

24

1.3

18

6

1.34

18

12

1.35

14

12

1.95

21

18

1.36

12

12

1.05

20

6

1.31

18

18

1.34

11

24

1.15

14

24

1.05


そして、次のようにクエリを実行します。


 SELECT company_id, units, unit_cost FROM index_test WHERE company_id = 18


この特定のケースでは、データベースは、 company_idの潜在的なすべてのインスタンスを 18 として探すために、テーブルに表示される順序で 17 レコードすべてを一度に 1 つずつ検索する必要があります。


これは、テーブルのサイズが大きくなるにつれて、ますます時間がかかるようになります。ここでインデックス作成がどのように役立つでしょうか?インデックスを作成すると、クエリのパフォーマンスを最適化するために、並べ替えられた方法で検索条件 (この場合はcompany_id ) を使用して列を設定するのに役立ちます。


company_id列にインデックスがある場合、テーブルは次のようになります。


COMPANY_ID

単位

単価

10

12

1.15

10

12

1.15

11

24

1.15

11

24

1.15

12

12

1.05

12

24

1.3

12

12

1.05

14

18

1.31

14

12

1.95

14

24

1.05

16

12

1.31

18

18

1.34

18

6

1.34

18

12

1.35

18

18

1.34

20

6

1.31

21

18

1.36


これで、データベースは 18 に等しいcompany_idを検索し、その行で要求されたすべての列を返し、次の行に移動することができます。次の行にもcompany_idが 18 の場合、この行のリクエスト列も返されますが、次の行のcompany_idが 18 の場合、データベースはここで検索を停止できることを認識し、応答を終了します。 .


これは、データベース インデックスとは何か、および何ができるかについてのかなり簡単な説明でしたが、その過程ではさらに多くのことが進行中です。インデックス作成の仕組みを詳しく見てみましょう。


データベースのインデックス作成はどのように機能しますか?

実際には、データベースのパフォーマンスを最適化するために、クエリ条件が変更されるたびにデータベース テーブルが自動的に並べ替えられるわけではありませんが、実際には、インデックスによって、データベースが簡単に並べ替えることができる別のデータ構造が作成されます。


データベースの列にインデックスが作成されると、その特定の列にデータ構造が作成され、このデータ構造には他の列が格納されないことに注意することが重要です。たとえば、上記の例では、データ構造にはcompany_idのみが含まれ、 unitunit_costなどの他の列は含まれません。


しかし、ここで正当な疑問が生じます。データベースは、クエリに対して返されるテーブル内の他のフィールドをどのように知るのでしょうか。方法を理解しようとしましょう。


データベース インデックスの構造


データベース インデックスには、メモリ内の追加情報の場所を示す参照情報へのポインタが格納されます。つまり、インデックスはcompany_idとその特定の行のアドレスをメモリに保持します。この例では、データベース インデックスは次のようになります。


COMPANY_ID

ポインター

10

_123

10

_129

11

_127

11

_138

12

_124

12

_130

12

_135

14

_125

14

_131

14

_133

16

_128

18

_126

18

_131

18

_132

18

_137

20

_136

21

_134


このインデックスを使用すると、クエリは、値として 18 を持つcompany_id列の行を確認し、ポインターを使用して、そのレコードの関連情報を見つけることができます。


索引付けにはどのようなデータ構造が使用されますか?

インデックスに期待されることを理解したので、データベースのインデックス作成に使用できる一般的なデータ構造を見てみましょう。


Bツリー

B ツリーは、検索、削除、および挿入が高速であるため、最もよく使用されるインデックス データ構造です。これらの操作はすべて対数時間で実行でき、B ツリーに含まれるデータは簡単に並べ替えることができます。


ハッシュ テーブル

ハッシュ インデックスは、ハッシュ テーブルを使用するインデックスを記述するために一般的に使用されます。ハッシュ テーブルはデータの検索に特に効率的であるため、完全一致を検索するクエリは迅速に処理される可能性があります。ハッシュ インデックスのキーは列の値であり、ハッシュ テーブルの値はテーブルの行データへの参照です。


一方、ハッシュ テーブルは順序付けられたデータ構造ではありません。したがって、他のタイプの検索では効率が悪い場合があります。


Rツリー

R ツリーは空間データベースで頻繁に使用され、通常は地理座標、四角形、多角形などの多次元情報をインデックス化するために使用されます。「現在地から 2 マイル以内にあるすべてのコーヒー ショップを検索する」などの検索に役立ちます。


ビットマップ インデックス

ビットマップ インデックスは、そのような値の出現回数が多い列、つまり選択性の低い列に役立ちます。たとえば、ブール値を持つ列を考えてみましょう。


いつインデックスを使用するか

インデックスは、データベースのパフォーマンスを向上させるように設計されています。したがって、データベースのパフォーマンスを大幅に改善する必要がある場合はいつでも、インデックス作成を使用できます。データベースが拡大すればするほど、インデックス作成が役立つ可能性が高くなります。


ただし、最初に覚えておくべきことは、インデックスが余分なスペースを占有することです。したがって、テーブルが大きいほど、インデックスも大きくなります。追加、削除、または更新操作を実行するたびに、インデックスに対しても同じ操作を実行する必要があります。


インデックスを使用しない場合

データがデータベースに書き込まれると、元のテーブルが最初に更新され、次にそのテーブルに基づく他のインデックスが更新されます。データベースへの書き込みが完了すると、インデックスは更新されるまで操作できなくなります。データベースが継続的に書き込みを取得している場合、インデックスは機能しません。


これが、常に新しい書き込みを受け取る可能性がある本番データベースではなく、計画的に (オフピーク時に) 新しいデータを取得するデータ ウェアハウス内のデータベースにインデックスが適用されることが多い理由です。


インデックスを作成するには?

次のコード スニペットは、SQL データベースの単一の列にインデックスを作成する方法を示しています。


 CREATE INDEX name_index ON Employee (Employee_Name);


複数の列にインデックスを作成する場合、SQL コマンドは次のようになります。


 CREATE INDEX name_index ON Employee (Employee_Name, Employee_Age);


一般に、索引付けされた列のデータが頻繁にアクセスされる場合にのみ、表に索引を作成する必要があります。


結論

そのため、この記事ではデータベースのインデックス作成について詳しく説明し、データベースのインデックス作成を実装するために使用されるデータ構造と、インデックスなどを使用することが推奨される場合についても学びました。


すべてを要約すると、ここに簡単な要約があります。

  • データベースのインデックス作成は、クエリの時間を大幅に短縮するのに役立ちます。
  • 索引付けには、検索基準用の列とポインタを含むデータ構造が含まれます。
  • ポインターは、残りの情報を含む行のメモリ ディスク上のアドレスです。
  • クエリのパフォーマンスを向上させるために、インデックス データ構造 (B ツリー、R ツリー、ハッシュ テーブル、またはビットマップ) が並べ替えられます。
  • クエリは、指定された行のインデックスを検索します。インデックスは、残りの情報を発見するポインターを参照します。


これがこの記事のすべてです。データベースのインデックス作成は広大で少し複雑なトピックです。この記事が概念の基本を理解するのに役立つことを願っています。


読み続けます!