データベース インデックス作成は、バックエンド開発者がデータベース クエリを最適化するために使用する最も一般的な方法です。この記事では、データベースのインデックス作成について詳しく説明します。
データベース インデックスを使用すると、クエリで効率的にデータベースからデータを取得できます。簡単に言えば、インデックス作成は、レコードを検索するときに効率を最大化する順序で、順序付けされていないテーブルを取得する方法です。
インデックスは特定のテーブルに関連付けることができ、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
のみが含まれ、 unit
やunit_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 ツリーに含まれるデータは簡単に並べ替えることができます。
ハッシュ インデックスは、ハッシュ テーブルを使用するインデックスを記述するために一般的に使用されます。ハッシュ テーブルはデータの検索に特に効率的であるため、完全一致を検索するクエリは迅速に処理される可能性があります。ハッシュ インデックスのキーは列の値であり、ハッシュ テーブルの値はテーブルの行データへの参照です。
一方、ハッシュ テーブルは順序付けられたデータ構造ではありません。したがって、他のタイプの検索では効率が悪い場合があります。
R ツリーは空間データベースで頻繁に使用され、通常は地理座標、四角形、多角形などの多次元情報をインデックス化するために使用されます。「現在地から 2 マイル以内にあるすべてのコーヒー ショップを検索する」などの検索に役立ちます。
ビットマップ インデックスは、そのような値の出現回数が多い列、つまり選択性の低い列に役立ちます。たとえば、ブール値を持つ列を考えてみましょう。
インデックスは、データベースのパフォーマンスを向上させるように設計されています。したがって、データベースのパフォーマンスを大幅に改善する必要がある場合はいつでも、インデックス作成を使用できます。データベースが拡大すればするほど、インデックス作成が役立つ可能性が高くなります。
ただし、最初に覚えておくべきことは、インデックスが余分なスペースを占有することです。したがって、テーブルが大きいほど、インデックスも大きくなります。追加、削除、または更新操作を実行するたびに、インデックスに対しても同じ操作を実行する必要があります。
データがデータベースに書き込まれると、元のテーブルが最初に更新され、次にそのテーブルに基づく他のインデックスが更新されます。データベースへの書き込みが完了すると、インデックスは更新されるまで操作できなくなります。データベースが継続的に書き込みを取得している場合、インデックスは機能しません。
これが、常に新しい書き込みを受け取る可能性がある本番データベースではなく、計画的に (オフピーク時に) 新しいデータを取得するデータ ウェアハウス内のデータベースにインデックスが適用されることが多い理由です。
次のコード スニペットは、SQL データベースの単一の列にインデックスを作成する方法を示しています。
CREATE INDEX name_index ON Employee (Employee_Name);
複数の列にインデックスを作成する場合、SQL コマンドは次のようになります。
CREATE INDEX name_index ON Employee (Employee_Name, Employee_Age);
一般に、索引付けされた列のデータが頻繁にアクセスされる場合にのみ、表に索引を作成する必要があります。
そのため、この記事ではデータベースのインデックス作成について詳しく説明し、データベースのインデックス作成を実装するために使用されるデータ構造と、インデックスなどを使用することが推奨される場合についても学びました。
すべてを要約すると、ここに簡単な要約があります。
これがこの記事のすべてです。データベースのインデックス作成は広大で少し複雑なトピックです。この記事が概念の基本を理解するのに役立つことを願っています。
読み続けます!