フィールド (id、名前、住所、電話番号、コメント) を持つ TEST という名前のテーブルが DB スキーマにあるとします。さて、そのテーブルに対してさまざまなクエリの大規模なセットを実行することがわかっているので、次の質問は、ID_NAME_INDX (ID と名前のインデックス) のようなインデックスを作成する時期と理由、および作成する方が効率的な時期です。 IDフィールドのインデックスと名前フィールドのインデックスを個別に(どのタイプのクエリを意味するかによって)?
3 に答える
あなたの例が、あなたが求めている実際の質問を説明しているとは思いません。IDと名前の両方にインデックスを付けるのではなく、IDにインデックスを付け、名前にインデックスを付ける必要があるかどうかを言っています。問題は、ID が主キーであるため、ID と名前で検索する可能性は低いと思います。
ただし、2 つの ID を持つテーブルのいずれか、または両方を一緒に検索して 3 つのインデックスを持つテーブルに関しては、ID ごとに 1 つと結合された 1 つが最も高速です。2 つのインデックスがある場合、探しているレコードを見つけるには、両方のインデックスを検索する必要があります。ただし、両方の ID をカバーする 1 つのインデックスがある場合は、そのインデックスのみを検索する必要があります。
ただし、すべてのインデックスと同様に、インデックスを追加すると、データベースのサイズが大きくなり、挿入/更新のパフォーマンスが低下します。常に利益/損失を比較検討する必要があります。
絶対に明白な候補に索引を追加し、必要に応じて「おそらく」候補に索引を追加します。引き続きデータベースのパフォーマンスを監視し、クエリ アナライザーを実行して、時間の経過とともにどこでパフォーマンスが向上するかを確認します。
一般的な目的は、すべての列を「カバー」して、クエリがインデックスのみを使用するようにすることです。
-- An index on Name including ID would be ideal
SELECT
[id]
FROM
TEST
WHERE
[name] = 'bob'
name と indx が必要であるが、別の index があるとします。インデックスから PK へのブックマーク ルックアップで他の列を取得することになります (PK をスキャンするだけではないと仮定します)。
編集、最初のコメントの後:
select * from test where id='id1' and name='Name1'
このクエリでは、SELECT * は任意のインデックスに対して緩和するため、PK が使用されます。あなたが持っていた場合:
select address from test where id='id1' and name='Name1'
次に、ID のインデックス、アドレスを含む名前がそれを「カバー」します。
「OR」を使用すると、どの戦略にも困難が生じます。でも、
select address from test where id='id1' and name='Name1'
「ID、アドレスを含む名前」inexを使用する可能性が最も高いですが、シークではなくスキャンします
こちらをお読みください:実行計画の基本
ほとんどのデータベース ソフトウェアには、クエリをデバッグするための何らかのツールが含まれています。これらは通常、サーバーがどのインデックスを考慮し、最終的にどのインデックスを使用したかを示します。この機能は通常、Explain などと呼ばれます。
通常、where 句または結合で使用される列のインデックスを作成する必要があります。