約 18 か月前にテクノロジー業界で働き始めてから、彼らの話を聞いていました。それらがパフォーマンスを向上させる可能性があることを知っており、列固有のようです-(「date_of_birth列でユーザーテーブルにインデックスを付けます」)。
それらが正確に何であるか、それらが何に使用され、どのように機能するかについての簡単な概要を探しているだけです。
私はそれについて完全な本を書きました!Web でも無料で入手できます: http://use-the-index-luke.com/
私はあなたの質問に手短に答えようとしていますが、これは私の得意分野ではありません。最後に試したときは、本を書いてしまいました...
テーブルと同様に、インデックスは行と列で構成されますが、検索パフォーマンスを向上させるために論理的に並べ替えられた方法でデータを格納します。電話帳(印刷されたもの)のようなものだと考えてください。それらは通常ソートされlast_name
、場合によってはfirst_name
他の基準 (郵便番号など) でソートされます。この並べ替えにより、特定の姓のすべてのエントリをすばやく見つけることができます。ファースト ネームもわかっている場合は、ラスト ネームとファースト ネームの組み合わせのエントリをすばやく見つけることもできます。
ただし、ファーストネームを知っているだけでは、電話帳はあまり役に立ちません。複数列のデータベース インデックスの場合もまったく同じです。そうです、インデックスによって検索パフォーマンスが向上する可能性があります。質問のインデックスが間違っている場合 (名前で検索する場合の電話帳など)、それらは役に立たない可能性があります。
同じテーブルに複数のインデックスを設定できますが、列は異なります。したがって、 のインデックスはlast_name
、のみfirst_name
のインデックスとは異なりfirst_name
ます (ファースト ネームで検索を最適化する必要があります)。
インデックスは冗長データを保持します (例:クラスター化されたインデックス= 電話帳)。これらは、テーブルに格納されているものと同じ情報 (例:関数ベースのインデックス) を持っていますが、ソートされています。この冗長性は、実行する書き込み操作 (挿入/更新/削除)ごとにデータベースによって自動的に維持されます。その結果、インデックス付きは書き込みパフォーマンスを低下させます。
データをすばやく見つけるだけでなく、インデックスを使用して並べ替え操作を最適化したり( order by
)、関連するデータを物理的に密接に配置したり (クラスタリング) することもできます。
より良いアイデアを得るには、私の本の完全な目次を見てください: http://use-the-index-luke.com/sql/table-of-contents
テーブルの目次と考えてください。そこにある場合、データベースはより具体的に見える場所を認識しています。そこにない場合、データベースはそれを見つけるためにすべてのデータを検索する必要があります。
より詳細な説明は、このウィキペディアの記事にあります。
インデックスは、テーブルまたはテーブルクラスタに関連付けられたオプションの構造であり、データアクセスを高速化できる場合があります。テーブルの1つ以上の列にインデックスを作成することにより、場合によっては、テーブルからランダムに分散された行の小さなセットを取得できるようになります。インデックスは、ディスクI/Oを削減する多くの手段の1つです。
ヒープ構成テーブルにインデックスがない場合、データベースは値を見つけるために全表スキャンを実行する必要があります。たとえば、インデックスがない場合、hr.departmentsテーブルの場所2700のクエリでは、データベースがすべてのテーブルブロックのすべての行でこの値を検索する必要があります。このアプローチは、データ量が増えるにつれて拡張性が高くありません。
http://docs.oracle.com/cd/E11882_01/server.112/e10713/indexiot.htm
ここで実行されている非常によく似たスレッドがあります。チェック、役に立ちます。
パフォーマンスが向上する可能性があることを知っています
はい、それは本当だ。ただし、インデックス作成がパフォーマンスの低下の原因になる場合があることを覚えておいてください。例: データベースのすべての列にインデックスを付けると、パフォーマンスに悪影響を与えることは間違いありません。