web-dev-qa-db-ja.com

INDEXを使用する理由と場所-長所と短所

私はデータベースプログラミングにまったく慣れていませんが、インデックスの悪影響は何でしょうか?私が理解している限り、インデックスは特定の値(たとえばSELECT)をデータベースで検索する必要がある操作を高速化します。

この例を考えてみましょう。

user_nameにインデックスがあるテーブルExampleの場合、次の操作が行われます。

SELECT TestField FROM Example WHERE user_name=XXXX

インデックスの結果としてより速くなります。

私の質問は:インデックスを使用することの短所は何ですか?インデックスが私たちに長所(パフォーマンスの向上)を与えるだけの場合、なぜそれらはデフォルトとして設定されないのですか?

12
Jhon Zunda

インデックスに関する本を埋めることはできますが、インデックスを作成する際に考慮すべきことがいくつかあります。

データベースエンジンはデータだけでなくインデックスも書き込む必要があるため、(ほとんどの場合)選択は高速化されますが、挿入、更新、削除は低速化されます。インデックスには、RAM内のハードディスク(およびさらに重要な)上のスペースが必要です。 RAMに保持できないインデックスは、まったく役に立ちません。異なる値がいくつかある列のインデックスは、多くの行を並べ替えることができないため、選択を高速化しません(たとえば、列「性別」。通常、男性と女性の2つの異なる値しかありません。

たとえばMySQLを使用している場合は、選択の前に「explain」を追加することで、エンジンがインデックスを使用しているかどうかを確認できます-上記の例ではEXPLAIN SELECT TestField FROM Example WHERE username=XXXX

27
Stefan P

インデックスとは何ですか、データベースには何がありますか?

列にインデックスがないuser_nameシステムは、一致するすべてのエントリを見つけるために、行ごとにExampleテーブル全体をスキャンする必要があります。特定のテーブルのデータ分布が数行しかないことを示している場合、これは明らかにそれらの行を取得する非効率的な方法です。

ただし、インデックスを使用する場合は、検索機能を別のツリー構造にリダイレクトします。これにより、検索が高速になり、深さが非常に小さくなります。

インデックスは純粋な冗長性であることに注意してください。データベースインデックスは、電話帳や本の中の他のインデックスと同じです(おそらく、探しているものをすばやく見つけるための一部です)。

本の章に興味がある場合は、インデックスを使用すると比較的すばやく見つけることができるため、多くのページをざっと読んで取得する必要はありません。

デフォルトでインデックスが作成されないのはなぜですか?

インデックスは、テーブルと一緒に作成され、テーブルが変更されるたびにそれ自体を維持するデータ構造です。それが存在するという事実は、データストレージの使用を意味します。

大きなテーブルのすべての列にインデックスを付ける場合、インデックスを保持するために必要なストレージは、テーブル自体のサイズをはるかに超えます。

インデックス構造の自己保守は、UPDATE, INSERT, DELETEが発生すると、インデックスを更新する必要があります(自動的に実行され、アクションは必要ありません)が、時間のかかるこれは、これらの操作の実行速度が遅いことを意味します。

テーブルの大部分(たとえば、行の90%が出力に含まれる)またはテーブル全体を取得する必要がある場合があります。この場合、テーブル全体のシーケンススキャン(インデックスなしの動作)はより多くなります。ツリートラバーサルとリーフノードチェーン(インデックスツリー構造をナビゲートするための動作)を実行するよりも効率的です。

11

デフォルトとしてインデックスを使用しない主な理由は、メンテナンスの問題です。つまり、テーブルでインデックスが作成されている特定の列を一般的に更新(挿入、削除、または更新)する場合、インデックスは動的に更新する必要があり、これは少し時間のかかるプロセスです。さらに、このインデックスを維持することはオーバーヘッドになります。