インデックスの定義と使用

データ管理 > SQLに関する考慮事項 > 構成とパフォーマンス

応答時間を短縮するには、ほとんどのデータ取得でRDBMSインデックスを使用します。通常、RDBMSがインデックスのうちの1つを使用するのは、SQL文がそのインデックスの1つ以上の最初のセグメントにWHERE句を持っており、要求されたレコードの順序がそのインデックスと一致している場合です。

以下の例は、SQL文が使用するインデックスと、どのような場合にそのインデックスを使用するかを示します。これらの例では、TBL1のフィールドF1、F3、F5にインデックスIN1があり、F3、F4、F5には別のインデックスIN2があるとします。

最初のキーを使用し、FROMとTOに同じ式を使用してF1の範囲を指定し、2つの異なる式を使用してF3の範囲を指定する場合、次の文が発行されます。

例:

SELECT F1, F2, F3, F4, F5
FROM TBL1
WHERE F1= 1
AND F3= 100
AND F3= 200
ORDER BY F1, F3, F5

インデックスIN1は、F1とF3の範囲に使用されます。順序は、インデックスを使用して自動的に決まります。

最初のキーを使用し、FROMとTOに同じ式を使用してF1の範囲を指定し、2つの異なる式を使用してF2の範囲を指定する場合、次の文が発行されます。

例:

SELECT F1, F2, F3, F4, F5
FROM TBL1
WHERE F1= 1
AND F2<= 'x'
AND F2>= 'c'
ORDER BY F1, F3, F5

インデックスIN1は、F1の範囲に使用されます。RDBMSによって、F1= 1の全てのレコードが検索されます。そのうち、F2がc からx のレコードのみが結果テーブルに抽出されます。順序は、インデックスを使用して自動的に決まります。

最初のキーを使用し、FROMとTOに異なる式を使用してF1の範囲を指定し、2つの異なる式を使用してF3の範囲を指定する場合、次の文が発行されます。

例:

SELECT F1, F2, F3, F4, F5
FROM tbl1
WHERE F1>= 1
AND F1 <= 10
AND F3>= 100
AND F3<= 200
ORDER BY F1, F3, F5

インデックスIN1は、F1の範囲に使用されます。RDBMSによって、F1が1から10の全てのレコードが検索され、F3の範囲と比較されます。F3の範囲には、インデックスが使用されません。前のセグメントの範囲が単一の値でないためです。順序は、インデックスを使用して使用して自動的に決まります。

1つの式を使用してF1の範囲を指定し、2つの異なる式を使用してF3の範囲を指定し、2番めのキーを使用する場合、次の文が発行されます。

例:

SELECT F1, F2, F3, F4, F5
FROM TBL1
WHERE F1= 1
AND F3>= 100
AND F3<= 200
ORDER BY F3, F4, F5

インデックスIN1は、F1とF3の範囲に使用されます。RDBMSは、結果テーブルをソートすることでクエリ結果を並べます。2番めのインデックスを使用して、要求された順序を提供することはできません。最初のインデックスが範囲に使用されるからです。ソートを使用すると、結果テーブルのみがソートされるので、比較的高速です。結果テーブルがほとんどの場合、小さいためです。

注意:

インデックスは、データベースのスペースを消費し、データベースでレコードの挿入、更新、削除を行う際に時間がかかります。極端な場合、インデックスによってSELECT文のパフォーマンスが低下することがあります。

例えば、テーブルのデータがディスク容量の1ブロック以下の場合(通常のテーブルには、数千のレコードがあります)、SELECT文は十分に動作しません。インデックスを使用してテーブルにアクセスする場合、RDBMSは、実際には、インデックスの入出力とデータの入出力という2つの入出力を実行します。1つの入出力でメモリに読み込まれた1つのブロックで全テーブルのスキャンを実行すると、速くなります。メモリアクセスは常にディスクの入出力より速いためです。クエリで選択された全てのカラムがインデックス内にある場合、RDBMSはインデックスのみにアクセスし、データにはアクセスしません。これは、カバーインデックスクエリと呼ばれます。
しかし、ほとんどの場合、インデックスによってアプリケーションのスピードは向上します。