インデックスデータベースの種類とその原則

我々は我々のプログラムの効率を最適化するために、毎日のお問い合わせの数の上昇を参照するには、同じコードの弓をご覧のように、我々はSQL文の最適化を考慮するだけでなく、信じて開発された猿のためのワードインデックスは、他のインデックスを使用することです。インデックスを使用して、世界でサーバ側のプログラマのテーブルを作成することはありませんが存在しないこと、あなたが知っている、インデックスを作成するためのステートメントを記述してくださいし、文を書くためにテーブルを作成するのと同じくらい簡単です。しかし、それはインデックスは一つのことで、詳細なインデックスの原理の理解がちょうど右のインデックスを使用することができ、完全に異なる極、他の分野で別の問題、(私自身は、このレベルの状態に達していない)で使用されます。インデックスのプログラマの理解の大部分は、コンセプト「クエリの高速化を行うために、インデックス付き」までに制限されています。

ここではいくつかのオンライン記事を参照するには、インデックスとその原理の理解をまとめました。まず、いくつかの質問:

1.なぜ、主キーを使用して、データテーブルのだろうか?

2.なぜ速くなりますクエリ効率の後にインデックスを使うのか?

3.インデックスを使用して遅く、更新、削除、挿入されますか?

4.ときに二つのフィールドにインデックスを追加する必要がありますか?

これらの問題は、彼らが答えを見つけることができない場合があります。私たちは、それが良いものですこれらの質問に対する答えを知っていますか?アプリケーションが使用するデータベーステーブルのみ10000データなので、理解を開発し、本当に理解していない場合は、アプリケーションが何百万ものデータの十億レベルの数百を開発しましたので、インデックスの原則を理解していない場合は、しかし、違いはありませんトラックが車のエンジンを置くためにならば、このトラックが利用できる動きを引き出すことができるように、実行することはできません単にプログラムを書くのか?指数は明らかに、重要なことは言ってB木やB +木であるデータ構造「バランスの取れたツリー」(非バイナリ)の原理を理解したいしなければならない3回:「バランスの取れた木、バランスの取れた木、バランスの取れた木」もちろん、いくつかのデータベースは、データ構造にインデックスのハッシュバケットの効果を使用し、しかし、主流のRDBMSデータテーブルは、デフォルトのインデックスデータ構造としてバランスの取れた木です。

回答:テーブルの通常の建設を建てたときにプライマリキーテーブルを指定しない場合、我々は、いくつかのリレーショナルデータベースでは、テーブルの主キーを追加しますと、データベースはtable文の構築を実行することを拒否します。実際には、テーブルの主キーの追加、及びませんが、「テーブル」と呼ばれます 「テーブル」の私の知識は非常に近いですし、そのデータは、無秩序なディスクストレージ上に置かれ、非常にきれいに配置されたライン毎に主キーテーブルを追加しませんでした。テーブルの主キー場合、テーブルは、ディスク構造体に格納されている構造の配向によって形質転換された他の言葉で、「バランスのとれたツリー」構造上に言われている木、、となった、テーブル全体がなりますインデックス。はい、もう一度、全体のテーブルには、インデックス、いわゆるになって、「クラスタ化インデックス。」これは、主キーの役割は、データ形式を「インデックス(バランス木)」形式の配置の「テーブル」を変換することであるため、表は、1つのプライマリキーは、テーブルには唯一の「クラスタ化インデックス」を持つことができますを持つことができる理由です。

 

 


図は、主キーの構成図でテーブル(クラスタ化インデックス)です。絵は私が楽しみになる、非常に良いではありません。データの(下を除く)、ツリーのすべてのノードがデータのプライマリキーフィールドで構成されており、一般的に私たちの主キーidフィールドを指定されています。データの底部は、実際のテーブルです。

2回答:私たちは、SQL文を実行した場合:
SELECT *表から上記にid = 1256に言及したWHERE。

まず、リーフノードの1256索引指標値に応じて配置され、その後、データラインを取るリーフノードによるID 1256と同じです。ここではリーフノードにバランスの取れたツリーを実行しているの詳細を説明するが、図から分かる、ルートから3つのツリーの合計だけ結果が3の世話を取得できるようにする必要がありません。下記に示すように、

 

 

 

表は億件のデータを持っている、あなたは、従来のロジックに従って、一つ一つがそれと一致するように、データの一部を検索する必要がある場合は、最悪の場合には、大きなO記法で、結果を得るために億回と一致する必要(Oですn)の最悪時間計算、これは受け入れられない、とこれは億個のデータは、ワンタイムを使用するプログラム用メモリに読み込むことができません明らかであるので、この試合キャッシュ最適化なしの場合で百万回は億倍です現在のディスクIO容量やCPUの演算能力にIOオーバヘッドは、結果を得るために数ヶ月かかることがあります。このツリーは、10層を有していると仮定すると、(非常に豊かな、非常にマルチノードツリー)バランスの取れたツリー構造にこのテーブルを変換する場合は、わずか10 IOのオーバーヘッドを必要とする、速度指数必要なデータを見つけることができるようになります大きなO記法とレベルの増加は、結果は、階層ツリーの数であり、O(ログn)は、nは総記録木は、木の枝の数がベースです。換言すれば、分岐ツリーの数に基づいて、ルックアップ数が終わりである、レコードの合計数は、式で表されます。

 

 

 

プログラムはMath.Log(100000000,10)、100000000はレコード数であることを示すために、数10は、ツリー(分岐実環境はるかに10以上の数)の分岐点で、結果は検索数があり、ここ億からの結果であります一桁。したがって、インデックスの使用は素晴らしいデータベースクエリのパフォーマンスを持っています。

3回答:すべてがあり、このバランスの取れたツリー構造は適切な状態、付加および欠失で維持されなければならないので、衰退の書き込みデータレートの両側に、データベースのクエリデータを作成するためのインデックスの上昇の速度が、その理由は、非常に簡単ですデータは、それが正しいことを確認するためにツリー(インデックス)を再ソートするためのデータ変更は、DBMSが持っているたびに、ツリー構造を破壊し、ツリー内の各ノードのバランス指標データ内容を変更し、あろう、これは小さなをもたらすませんインデックスは、副作用の原因以外のクエリ操作をもたらす理由は、パフォーマンス・オーバーヘッド、。

4:完成したクラスタ化インデックスは、その後、しばしば言及される非クラスタ化インデックス、について話して、私たちは通常、定期的なインデックスを使用しています。これは私たちは、インデックス複数フィールドインデックスのクエリに2つのフィールドを追加する前に問題に関連しています。

非クラスタ化インデックスとインデックスとしてバランスのとれたツリーデータ構造と同じクラスタ化インデックス、。インデックスツリー構造の値はテーブルインデックスフィールドから各ノード、テーブル、プラス、インデックスへのユーザ名フィールドは、インデックス値は、データの変更は、DBMSは、インデックス構造を維持するために必要とされている名前のフィールドで構成されている場合正しさ。我々は複数のフィールドのテーブルにインデックスを追加した場合、別のインデックス構造の複数次に、各インデックス(非クラスタ化インデックス)互いに無相関を発生します。下記に示すように、

 

 

 

新しいインデックスを構築するために、すべてのフィールドは、データフィールドには、インデックスを生成するためにそれのコピーとなります。したがって、テーブルにインデックスを追加し、テーブルには、ディスク・ストレージ・スペースを取って、音量が大きくなります。

非クラスタ化インデックスとクラスタ化インデックスの差が必要なデータがクラスタ化インデックスを調べることによって見つけることができるということであり、レコードに対応する主キーの値は、非クラスタ化インデックスによって見つけ、次いで凝集インデックスによって必要なデータを見つけるために、主キーの値を使用することができます以下に示すように

 

 

 

どのような方法ルックアップテーブルでは関係ありませんが、最終的にクラスタ化インデックスによってデータに移動し、メインキーを使用することになります、クラスタ化インデックス(主キー)は、実際のデータが存在する唯一の道です。

しかし、一つの例外は、クラスタ化インデックスは通常、複合インデックスまたは複数フィールドインデックスクエリ言われて、必要なデータ、問い合わせ「インデックスをカバーする」と呼ばれるような非主流のアプローチを、チェックアウトすることができます使用することはできませんがあります。上記の記事は、ときにインデックスフィールドを扱っていますが、一つの指標に二つのフィールドを指定した場合、フィールドの内容は、2つのフィールドがインデックス化されているコンテンツに同期されます、インデックスに同期されます。

次のSQL文を見てください

//インデックス

USER_INFO(誕生日)にインデックスを作成するindex_birthday。

// 1991年11月1日生まれのユーザーの誕生日にユーザー名を問い合わせます

USER_INFOからUSER_NAMEを選択する場所の誕生日=「1991年11月1日」

次のように文のSQL文の実行があります

まず、すべてのレコードを見つけることが等しいindex_birthdayの誕生日には、非クラスタ化インデックスによって、主キーID値を1991-11-1

その後、IDの主キーの値によっての場所に保管の主キーのIDデータ(行)の真の価値を見つけるために、クラスタ化インデックスのルックアップを取得します

最後に、実際の値から得られUSER_NAMEフィールドのデータは、最終的な結果を獲得することである、返されます

私たちは、二重のカバレッジインデックスフィールドに誕生日のフィールドにインデックスを置きます

USER_INFOのインデックスindex_birthday_and_user_name(誕生日、USER_NAME)を作成します。

文のSQL文を実行すると、となります

リーフノードの内容に1991年11月1日等しい非クラスタ化インデックス検索index_birthday_and_user_nameの誕生日の方法により、しかし、リーフノードに加えて、内部フィールドUSER_NAMEの値以外の主キーID値ので、主キーID値をUSER_NAMEここで、実際のデータラインリターンができリーフノードUSER_NAMEの値に直接アクセスして下さい。以下に示すように、このようにカバーインデックス直接参照は、2つのステップバックカバーインデックス検索を使用せずに省略することができ、大幅に、クエリのパフォーマンスを向上させます

 

 

 

大まかには、データベースのインデックスのように動作テキストに記載されているが、詳細はわずかにバイアスしてもよいが、これは説明概念の結果に影響を与えないであろう。

:この記事は参考に再現されhttps://blog.csdn.net/qq_35673617/article/details/80802623

おすすめ

転載: www.cnblogs.com/guangxiang/p/11547039.html