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

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

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

インデックスの概念

インデックスは、すべてのレコードをチェックせずに必要なレコードをすばやく見つけるのに役立つ、ストレージ テーブルに基づいて定義される補助ストレージ構造です。ディスクに保存される一連のインデックス項目で構成され、各インデックス項目は 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の基本的な使用法の分析

推薦する

Bootstrapはカルーセルの効果を実現します

この記事では、カルーセルマップの効果を実現するためのBootstrapの具体的なコードを参考までに共...

MySQLのファジークエリの要約

1. 一般的な使用法: (1)%で使用する% は 1 つ以上の文字のワイルドカードを表します。たとえ...

ReactとAntdのFormコンポーネントを組み合わせてログイン機能を実装する方法を詳しく説明します

目次1. ReactとAntdを組み合わせてログイン機能を実現2. ReactとAntdを組み合わせ...

docker を使用して Kong クラスター操作を構築する

docker コンテナの下に kong クラスターを構築するのは非常に簡単です。公式サイトの紹介も非...

CSS で 2 列レイアウトを実現する N 通りの方法

1. 2 列レイアウトとは何ですか? 2 列レイアウトには、左側が固定幅で右側が適応幅のレイアウトと...

Python MySQL データベース テーブルの変更とクエリ

Python は MySQL に接続してデータベース テーブルを変更およびクエリします。 pytho...

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...

js はマウスによる画像の切り替えを実装します (タイマーなし)

この記事の例では、マウス切り替え画像を実現するためのjsの具体的なコードを参考までに共有しています。...

Docker チュートリアル: コンテナの使用 (簡単な例)

Docker を初めて使用する場合は、コンテナの管理を始めるために習得する必要がある基本的なコマン...

さまざまなネットワーク画像形式におけるPNGの利点の詳細な説明

BMP は、ハードウェア デバイスに依存せず、広く使用されている画像ファイル形式です。ビットマップ保...

MySQL テーブルスペースのリカバリに対する正しいアプローチについての簡単な説明

目次予備的注釈問題の再現データ削除の原則データの再利用どの操作がデータホールの原因になりますか?表領...

Reactはページング効果を実装する

この記事では、Reactでページング効果を実現するための具体的なコードを参考までに紹介します。具体的...

uni-app WeChatアプレット認証ログイン実装手順

目次1. appIDの申請と設定1. appidの取得方法2. AppIDの設定2. 基本的なユーザ...

Dockerはホスト間のネットワーク通信を実現するためにMacvlanを導入する

基本的な概念: Macvlanの動作原理: Macvlan は、Linux カーネルでサポートされて...

フラットスタイルを使用してウェブサイトをデザインする方法

フラットなウェブサイト構造の本質はシンプルさです。コンテンツの重要なポイントを強調し、ページの装飾効...