データベースインデックスの知識ポイントの概要

データベースインデックスの知識ポイントの概要

ファーストルックインデックス

インデックスの概念

インデックスは、すべてのレコードをチェックせずに必要なレコードをすばやく見つけるのに役立つ、ストレージ テーブルに基づいて定義される補助ストレージ構造です。ディスクに保存される一連のインデックス項目で構成され、各インデックス項目は 2 つの部分で構成されます。つまり、インデックス フィールドと行ポインタです。

インデックスフィールド

これは、テーブルのいくつかの列(通常は 1 つの列)の値を連結することによって形成されます。インデックスは通常、インデックス付きフィールドのすべての値を格納します。

行ポインタ

インデックス付きフィールド値を含むテーブル内のレコードが格納されているディスク上の場所を指します。

インデックス項目を格納するファイルはインデックス ファイルと呼ばれ、格納テーブルはメイン ファイルと呼ばれます。

インデックスファイルの構成

(対照的に、主なファイル構成には、ヒープ ファイル、ソートされたファイル、ハッシュ ファイル、クラスター ファイルなどが含まれます。)

ソートされたインデックスファイル: インデックスフィールドの値に従って特定の順序で整理して保存します。

ハッシュ インデックス ファイル: インデックス フィールドの値に基づいてハッシュ関数を使用して、ハッシュ バケットにデータを格納します。

インデックスの役割

テーブル内の異なる属性または属性の組み合わせごとに、異なるインデックス ファイルが作成されます。インデックス フィールドの値は、テーブル内の任意の属性の値または属性値の組み合わせにすることができます。

インデックス ファイルはメイン ファイルよりもはるかに小さくなります。小さなインデックス ファイル (メモリに完全にロード可能) を検索することで、非常に大きなメイン ファイル内の関連レコードをすばやく見つけ、対象を絞って読み取ることができます。

インデックスがある場合、更新操作ではインデックス ファイルとメイン ファイルの両方を同時に更新する必要があります。データの一貫性を維持します。

SQL言語でのインデックス作成とメンテナンス

基礎

テーブルを定義した後、主キーが定義されている場合、システムは自動的に主インデックスを生成します。

インデックスはユーザーが定義または取り消すことができます。

インデックスが作成されると、それがプライマリ インデックスであるかユーザー定義インデックスであるかに関係なく、DBMS はすべてのインデックスを自動的に管理します。

テーブルを削除すると、テーブルに定義されているすべてのインデックスが自動的に削除されます。

インデックスの作成と削除

Student(Sname)にidxSnameインデックスを作成します。
インデックス idxSname を削除します。

密なインデックスと疎なインデックス

高密度インデックス

マスター ファイル内の各レコード (形成された各インデックス フィールド値) には、それに対応するインデックス エントリがあり、レコードの場所を示します。このようなインデックスは、密なインデックスと呼ばれます。 (密なインデックス)

スパースインデックス

メイン ファイル内の一部のレコード (インデックス フィールド値を形成) には、対応するインデックス項目があります。このようなインデックスは、非密インデックスまたはスパース インデックスと呼ばれます。

スパースインデックスがレコードを検索する方法

インデックスフィールド値がKであるレコードを見つけるには、

まず、K より小さい最大のインデックス フィールド値に対応するインデックス項目を見つけ、そのインデックス項目に対応するレコードからテーブルを順番に検索します。

スパース インデックスを使用するための要件: メイン ファイルは、対応するインデックス フィールド属性の順序で保存する必要があります。

高密度インデックスと比較すると、占有スペースが少なく、メンテナンスも少なくて済みますが、速度は遅くなります。

バランス: インデックスエントリはレコードポインタを指すのではなく、レコードが配置されているストレージブロックを指します。つまり、レコードごとに1つのインデックスエントリがあるのではなく、ストレージブロックごとに1つのインデックスエントリがあります - プライマリインデックス

高密度インデックスがレコードを検索する方法

1. 候補キー属性の密なインデックスを1つずつ照合できる

2. 候補キー属性以外の高密度インデックスの場合、メイン ファイルはインデックス フィールド値でソートされ、繰り返されない最初のインデックス フィールド値ごとにインデックス項目が作成されます。同じインデックス フィールド値が近くで検索されます。

3. 候補キー属性以外の密なインデックスの場合、プライマリ ファイルはインデックス フィールド値でソートされません。インデックス項目内のインデックス フィールドは一意である必要はなく、プライマリ ファイル内の対応するインデックス フィールド値を指すために繰り返し出現できます。

4. 候補キー属性以外の密なインデックスの場合、メイン ファイルはインデックス フィールド値に従ってソートされません。インデックス内のインデックス フィールドが一意である必要がある場合は、中間層であるポインタ バケットを導入できます。ポインタ バケットは 3 番目のケースです。

プライマリインデックス

プライマリインデックスの概念

通常、各ストレージ ブロックにはインデックス エントリがあります。インデックス エントリの合計数は、ストレージ テーブルが占めるストレージ ブロックの数と同じです。ストレージ テーブル内の各ストレージ ブロックの最初のレコードは、アンカー レコード、または略してブロック アンカーとも呼ばれます。

プライマリ インデックスのインデックス フィールド値はブロック アンカーのインデックス フィールド値であり、ポインターはそれが配置されているストレージ ブロックを指します。

プライマリ インデックスは、インデックス フィールド値によってソートされた順序付きファイルです。通常、順序付きメイン ファイルのプライマリ キー ベースのソート フィールドに基づいて確立されます。つまり、プライマリ インデックスのインデックス フィールドは、メイン ファイルのソート コード (プライマリ キー) に対応します。

プライマリ インデックスはスパース インデックスです。

補助索引

補助インデックスの定義

プライマリ ファイルの 1 つ以上の非ソート フィールドで定義された補助ストレージ構造。通常、非ソート フィールドの異なる値にはインデックス エントリがあり、インデックス フィールドはフィールドの異なる値であり、ポインターはレコードを含むブロックまたはレコード自体を指します。

ソートされていないフィールドがインデックス フィールドである場合、フィールド値が一意でない場合は、リンク リストに似た構造を使用して、フィールド値のすべてのレコードの位置を保存します。

補助インデックスは高密度のインデックスであり、検索速度がかなり速い場合がある

主索引と補助索引の違いと関係

プライマリ ファイルにはプライマリ インデックスが 1 つしかありませんが、セカンダリ インデックスは複数持つことができます。

プライマリ インデックスは通常、プライマリ キーまたはソート コードに基づいて構築され、セカンダリ インデックスは非ソート フィールドに基づいて構築されます。

プライマリ インデックスはプライマリ ファイル データの再編成に使用できますが、セカンダリ インデックスはプライマリ ファイル データを変更できません。

プライマリ インデックスはスパース インデックスであり、セカンダリ インデックスは密なインデックスです。

クラスター化インデックスと非クラスター化インデックス

クラスター化インデックス

これは、インデックス内の隣接するレコードがメイン ファイルにも隣接して保存されることを意味します。

非クラスター化インデックス

つまり、インデックス内の隣接するレコードは、必ずしもメイン ファイルに隣接して格納されるわけではありません。

知らせ:

プライマリ ファイル内のソート フィールドがプライマリ キーでない場合、このフィールド内の各レコードの値は一意ではありません。この場合、フィールドはクラスター化フィールドと呼ばれます。クラスター化インデックスは通常、クラスター化フィールドに定義されます。クラスター化インデックスには通常、クラスター化フィールド内の異なる値ごとにインデックス項目があります (インデックス項目の合計数は、プライマリ ファイル内のクラスター化フィールド内の異なる値の数と同じです)。インデックス フィールドは、クラスター化フィールドの異なる値です。同じクラスター化フィールド値を持つレコードは複数のブロックに格納される場合があるため、インデックス項目のポインターは最初のブロックを指します。プライマリ ファイルにはクラスター化インデックス ファイルを 1 つだけ含めることができますが、非クラスター化インデックス ファイルは複数含めることができます。プライマリ インデックスは通常、クラスター化インデックスです (ただし、インデックス エントリの合計数は、プライマリ ファイルのクラスター化フィールドの個別値の数と必ずしも同じではなく、プライマリ ファイルのストレージ ブロックの数と同じです)。セカンダリ インデックスは通常、非クラスター化インデックスです。プライマリ インデックス/クラスター化インデックスは、レコードが格納される場所を決定するインデックスですが、非クラスター化インデックスは、レコードが格納される場所を示すクエリにのみ使用できます。

逆インデックス

転置インデックスは、「単語-文書マトリックス」を実装した特定のストレージ形式です。転置インデックスを使用すると、単語に基づいて、単語を含む文書のリストをすばやく取得できます。転置インデックスは、主に「単語辞書」と「転置ファイル」の 2 つの部分で構成されます。

辞書: 検索エンジンの通常のインデックス単位は単語です。辞書は、ドキュメント コレクションに出現したすべての単語で構成される文字列のセットです。辞書内の各インデックス エントリには、単語自体に関する情報と「逆リスト」へのポインタが記録されます。

投稿リスト: 投稿リストには、特定の単語が出現するすべての文書の文書リストと、文書内での単語の位置情報を記録します。各レコードは投稿項目と呼ばれます。逆リストによれば、どの文書に特定の単語が含まれているかがわかります。

転置ファイル: すべての単語の転置リストは、多くの場合、ディスク上のファイルに順番に格納されます。このファイルは転置ファイルと呼ばれます。転置ファイルは、転置インデックスを格納する物理ファイルです。

マルチレベルインデックス

インデックス項目が多数ある場合は、インデックス上に別のインデックスを作成できます。これをマルチレベル インデックスと呼びます。

一般的なマルチレベルインデックス: Bツリー/B+ツリーインデックス

複数属性インデックス

インデックスフィールドは、テーブルの複数の属性値を組み合わせて形成されるインデックスです。

ハッシュインデックス

ハッシュ技術を使用して編成されたインデックス

グリッドインデックス

クロスジョイントの位置決めと検索に複数のインデックスフィールドを使用する

B+ツリーインデックス

意味

インデックス項目をツリーデータ構造に整理するマルチレベルインデックス

ストレージ ブロックには複数のインデックス項目を格納できるため、各インデックス項目はポインターとインデックス フィールドの 2 つの部分で構成されます。 Ki はインデックス フィールド値を表し、Pi はインデックス ブロック、データ ブロック、またはデータ ブロック内のレコードを指すポインターを表します。

ブロックには通常、n-1 個のインデックス項目と 1 個のポインターを格納できます。

B+ ツリー機能

  • メインファイルのサイズに合わせてツリー階層を自動的に維持します
  • 各インデックス ブロックのポインタ使用率は 50% ~ 100% です。

Ki-1<=x<Ki の場合、インデックス フィールド値 x は Pi によってポイントされ、Ki<=x<Ki+1 の場合、インデックス フィールド値 x は Pi+1 によってポイントされます。

リーフ ノードとリーフ ノード ポインターはそれぞれ何を指しているのでしょうか?

非リーフ ノード ポインターはインデックス ブロックを指し、リーフ ノード ポインターはメイン ファイルのデータ ブロックまたはデータ レコードを指します。

リーフノードの最後のポインタは次のデータブロックを指す

インデックスブロックで実際に使用されるインデックスポインタの数はdであり、これは(ルートノードを除く)を満たす。

n/2<=d<=n

ルートノードの少なくとも2つのポインタが使用される

B+ツリーのストレージ規約

インデックスフィールドの値がリーフノードと非リーフノードに繰り返し出現する

メインファイルへのポインタはリーフノードにのみ表示されます

すべてのリーフノードはすべてのキー値のインデックスをカバーできます

インデックスフィールドの値はリーフノードに順番に並べられる

リーフ ノードのセットのみがメイン ファイルの完全なインデックスになります。

データベースインデックスの知識ポイントのまとめはこれで終わりです。データベースインデックスに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • データベースのインデックス作成に関する知識ポイントのまとめ。必要な情報はすべてここにあります。
  • Oracleデータベースでのインデックスの作成と使用の詳細な紹介
  • MySQL データベースの最適化: インデックスの実装原則と使用状況の分析
  • Mysql データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用
  • Django モデルがデータベース インデックスを作成する順序をカスタマイズする方法

<<:  フロントエンドJavaScriptのクラス

>>:  ulとliの基本的な使用法の分析

推薦する

Docker Compose のインストールと使用手順

目次1. Docker Compose とは何ですか? 2. Docker Composeのインスト...

ウェブデザインの詳細分析に関する詳細な議論

設計業務では、設計者がレビューに参加したり、リーダーの一部が設計案の詳細が足りないと言っているのをよ...

Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

序文比較的複雑な大規模システムでは、複雑なロジックで処理する必要があるオブジェクトまたはデータ フロ...

CSS と Bootstrap アイコンを使用して、上下にジャンプするインジケーター矢印のアニメーション効果を作成します。

ページが非常に長い場合は、下にさらにコンテンツがあることをユーザーに知らせるために矢印が必要になるこ...

MySQL 8.0 のインストール中に発生した 3 つの小さなエラーの概要

序文これまで当社ではMySQLの5.7シリーズを使用していましたが、バージョン8.0のリリースに合わ...

border-radius 値の設定に関する質問

問題記録今日はプログレスバーに似た小さなコンポーネントを完成させるつもりでした。プロトタイプは次のよ...

メタ情報に基づいて時間指定のページ更新またはリダイレクトを実装する

メタを使用して、ページの時間指定更新またはジャンプを実装します。 XML/HTML コードコンテンツ...

ブラウザの自動フォーム入力によるウェブページのスタイル損失の原因の分析と解決

バックエンドからフロントエンドまで、なんと悲劇なのでしょう。他の人の CSS を自分の jsp We...

Windows10でのMySQL 5.7.21のインストールと設定のチュートリアル

この記事では、MySQL 5.7.21 のインストールと設定方法を記録し、皆様と共有します。 1. ...

プロジェクトを素早く構築するためのvite+vue3.0+ts+element-plusの実装

目次バイト機能使用環境プロジェクトを構築する構成vite.config.ts tsconfig.js...

MySQL 集計関数のソート

目次MySQL 結果のソート - 集計関数環境クエリ結果の並べ替えクエリのグループ化と集約生徒の平均...

CSS3でハートを描く

成果を達成する要件/機能: CSS + HTML を使用してハートを描く方法。分析:正方形と 2 つ...

Docker が占有するディスク領域をクリーンアップする方法

Docker は多くのスペースを占有します。コンテナを実行したり、イメージを取得したり、アプリケー...

AngularとIonicのライフサイクルとフック関数を素早く理解するための記事

目次角度成し遂げる呼び出し順序知らせイオニックionic はページのライフサイクルをどのように処理し...