回答:
良い質問、
通常、DBエンジンは、構築するクエリ実行プランに基づいて、使用するインデックスを自動的に選択する必要があります。ただし、DBに特定のインデックスを強制的に使用させたい場合は、かなりまれなケースがあります。
特定の質問に答えられるようにするには、使用しているDBを指定する必要があります。
MySQLの場合、これを行う方法に関するインデックスヒント構文のドキュメントを読みたい
selectステートメントでインデックスを使用する方法
こちらです:
SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);
明示的に指定する必要がありますか?
一般的なインデックスを使用し、次いでおそらくはさらにブックマークルックアップを実行する必要の想定コストは単にテーブル全体をスキャンするコストよりも低い場合、インデックスが使用されます。
クエリが次の形式の場合:
SELECT Name from Table where Name = 'Boris'
そして、1000行のうち1行はBorisという名前で、ほぼ間違いなく使用されます。全員の名前がBorisである場合、インデックスがデータにアクセスするためのより効率的な戦略になる可能性は低いため、おそらくテーブルスキャンに頼ることになります。
幅の広いテーブル(たくさんの列)で、次のようにした場合:
SELECT * from Table where Name = 'Boris'
その後、名前を検索するよりもテーブルから他の列を取得するのに時間がかかることが合理的な前提である場合、または、とにかく行がたくさん。
一般に、テーブルにインデックスを作成すると、データベースはそのテーブルのデータを検索するときにそのインデックスを自動的に使用します。あなたはそれについて何もする必要はありません。
ただし、MSSQLではindex hint
、特定のインデックスを使用してこのクエリを実行することを指定できるを指定できます。この詳細については、こちらをご覧ください。
Index hint
MySQLでも利用できるようです。Tudor Constantineに感謝します。
インデックスヒントは、Microsoft Dynamicsデータベースサーバーでのみ使用できます。従来のSQL Serverの場合、「Where」句で定義するフィルターは、関連するインデックスを使用するようにエンジンを説得する必要があります...エンジンの実行プランが情報の読み取り方法(全テーブルスキャンかインデックススキャンか)を効率的に識別できる場合)-組み込みのパフォーマンスオプティマイザーの一部として、適切なステートメントを実行する前に2つを比較する必要があります。
ただし、次のような方法でオプティマイザにスキャンを強制することができます。
Select *
From [yourtable] With (Index(0))
Where ...
または、次のようなものを使用して特定のインデックスを探すには
Select *
From [yourtable] With (Index(1))
Where ...
選択はあなた次第です。オブジェクトパネルでテーブルのインデックスプロパティを確認して、使用するインデックスを確認します。フィルターに一致する必要があります。
最良の結果を得るには、最も少ない結果を最初に返すフィルターをリストします。私が言っているのが正しいかどうかはわかりませんが、クエリフィルターは順次のようです。シーケンスが正しい場合、オプティマイザはすべての組み合わせを比較することでそれを行う必要はありません。少なくとも、より高価なクエリとの比較を開始しないでください。