web-dev-qa-db-ja.com

データベースインデックスとは

約18か月前にテクノロジーの仕事を始めてから、彼らが話しているのを聞いたことがあります。パフォーマンスが向上する可能性があり、列固有のようです(「date_of_birth列のUserテーブルにインデックスを付ける」)。

それらが何であるか、何のために使用されているのか、どのように機能するのかについての簡単な概要を探しているだけです。

51
Clay Wardell

私はそれについて完全な本を書きました!ウェブ上でも無料で利用できます: http://use-the-index-luke.com/

私はあなたの質問にすぐに答えようとします。これは私が得意なことではありません。私が最後に試したとき、私は本を書くことになりました...

テーブルと同様に、インデックスは行と列で構成されますが、検索パフォーマンスを向上させるために論理的にソートされた方法でデータを格納します。電話帳(印刷されたもの)のように考えてください。それらは通常、last_namefirst_name、および潜在的に他の基準(郵便番号など)でソートされます。このソートにより、特定の姓のすべてのエントリをすばやく見つけることができます。名も知っている場合は、姓と名の組み合わせのエントリを非常にすばやく見つけることもできます。

ただし、名前だけを知っている場合、電話帳は実際には役立ちません。複数列のデータベースインデックスについてもまったく同じことが言えます。そのため、はい、インデックスは潜在的に検索パフォーマンスを改善できます。質問のインデックスが間違っている場合(名で検索するときの電話帳など)、役に立たない可能性があります。

同じテーブルに異なる列に多くのインデックスを設定できます。したがって、last_namefirst_nameのインデックスは、first_nameのみのインデックスとは異なります(名で検索を最適化する必要があります)。

インデックスは冗長データを保持します(例: クラスター化インデックス =電話帳)。テーブルに保存されている情報と同じ情報(例: 関数ベースのインデックス )を持っていますが、ソートされた方法です。この冗長性は、実行する書き込み操作ごとにデータベースによって自動的に維持されます( 挿入/更新/削除 )。その結果、インデックス付きdecrease書き込みパフォーマンス。

データを迅速に見つけることに加えて、インデックスを使用して sort操作order by)を最適化し、関連するデータを物理的に密接に配置することもできます( clustering )。

より良いアイデアを得るために、私の本の目次を見てください: http://use-the-index-luke.com/sql/table-of-contents

74
Markus Winand

テーブルの目次と考えてください。存在する場合、データベースはどこをより詳細に見るべきかを知っています。存在しない場合、データベースはすべてのデータを検索して検索する必要があります。

より詳細な説明は、こちらにあります このウィキペディアの記事

11
Bjoern

インデックスは、テーブルまたはテーブルクラスターに関連付けられたオプションの構造であり、データアクセスを高速化できる場合があります。テーブルの1つ以上の列にインデックスを作成すると、場合によっては、テーブルからランダムに分散された行の小さなセットを取得することができます。インデックスは、ディスクI/Oを削減する多くの手段の1つです。

ヒープ構成表に索引がない場合、データベースは値を見つけるために全表スキャンを実行する必要があります。たとえば、インデックスがない場合、hr.departmentsテーブルのロケーション2700のクエリでは、データベースがすべてのテーブルブロックのすべての行でこの値を検索する必要があります。このアプローチは、データ量が増えるとうまくスケーリングしません。

http://docs.Oracle.com/cd/E11882_01/server.112/e10713/indexiot.htm

6
Pamma

非常によく似たスレッドを実行しています here 確認してください、それは役に立ちます。

パフォーマンスが向上する可能性があることを知っています

はい、それは本当だ。ただし、POOR Performanceの理由として、インデックス付けが原因になる場合もあることに留意してください。例:データベースのすべての列にインデックスを付けると、間違いなくパフォーマンスに悪影響を及ぼします。

5
Mayukh Roy