さまざまなORMのドキュメントでは、インデックスなどを作成する方法を常に提供しています。効率を上げるために適切なインデックスを作成するように常に言及しています。 ORM。インデックス(PK以外)についての私の理解は基本的に次のとおりです。LIKE
列の内容に基づいてクエリ(つまり検索)を実行する場合は、その列に全文インデックスを使用する必要があります。インデックス(主に効率に関する)に関して他に何を知っておくべきですか?玄関先に知識の世界があるような気がしますが、その下に巨大な折り畳まれたマウスパッドが詰まっているので、通り抜けることができません(なぜそう言う必要があると感じたのかわかりませんが、ソファを提供してくれてありがとう)。
2 に答える
本の裏にある索引と非常に大まかに似た索引を考えてください。これは本の内容とは完全に別の領域であり、特定の値を探している場合は、インデックスに移動して検索できます(インデックスは順序付けられているため、本のすべてのページをスキャンするよりもはるかに高速に検索できます。 )。
インデックスエントリにはページ番号が付いているので、トピックを探しているページにすばやく移動できます。データベースインデックスは非常に似ています。これは、データベース内の関連情報(インデックスに含まれるフィールド)の順序付きリストであり、データベースが一致するレコードを見つけるための情報が含まれています。
つまり...頻繁に検索する必要のある情報がある場合は、インデックスを作成します。通常のインデックスは、LIKEクエリのような「部分的な」シークには役立ちませんが、フィールドXに特定の値がある結果のセットを取得する必要があるときはいつでも、DBMSがテーブル全体を「スキャン」する必要がなくなります。 、一致する値を探します。
また、列を並べ替える必要がある場合にも役立ちます。
覚えておくべきもう一つのこと。DBMSで複数のフィールドを持つ単一のインデックスを作成できる場合は、DBMSに固有のその影響を必ず調査してください。複数のフィールドを含むインデックスは、それらすべてのフィールドがクエリで使用されている場合にのみ、完全に(またはまったく)役立つ可能性があります。逆に、1つのテーブルに複数のインデックスがあり、インデックスごとに1つのフィールドがある場合、複数のフィールドでフィルタリング/並べ替えるクエリにはあまり役立ちません(またはまったく役に立ちません)。
フルテキストインデックスとPK(主キー)について言及されました。これらは通常のインデックスとは異なりますが、多くの場合、同様の目的を果たします。
まず、主キーは通常インデックス(MSSQLでは「クラスター化インデックス」)ですが、特にそうである必要はありません。例として、MSSQLPKはデフォルトでクラスター化インデックスです。クラスター化インデックスは、他の場所に格納されている個別のデータではないという点で特別ですが、データ自体はクラスター化インデックスの順にテーブルに配置されます。これが、人気のあるPKが、int
連続して増加する値で自動生成される値である理由です。したがって、クラスター化インデックスは、テーブル内のデータをフィールドの値で具体的に並べ替えます。これを従来の辞書と比較してください。エントリ自体は、定義されている単語である「キー」によって順序付けられます。
ただし、MSSQL(詳細についてはDBMSのドキュメントを確認してください)では、必要に応じて、クラスター化インデックスを別のフィールドに変更できます。これは、ベースのフィールドに基づいて行われる場合がありdatetime
ます。
フルテキストインデックスは、まったく異なる種類の獣です。彼らは同じ原則のいくつかを使用していますが、彼らがしていることは、私が説明している通常のインデックスとまったく同じではありません。また、一部のDBMSでは、LIKE
クエリはフルテキストインデックスを使用しません。特別なクエリ演算子が必要です。
これらのインデックスは、列の値全体(数値、日付、文字データの短いビット)を検索/並べ替えることではなく、テキストフィールド内の個々の単語/フレーズを検索することを目的としているため、異なります。インデックスが作成されます。
また、類似した単語、異なる時制、一般的なスペルミスなどの検索を可能にし、通常はノイズのある単語を無視することもできます。それらが機能するさまざまな方法は、それらを使用するためにさまざまな演算子が必要になる場合がある理由です。(繰り返しになりますが、DBMSのローカルドキュメントを確認してください!)
この回答はOracle固有のものですが、回答の要点はほとんどのリレーショナルデータベースシステムに当てはまります。