0

次のようなクエリがあるとします。

select ID, REGION, START, END from COORD_SYSTEM 
where REGION=? and TYPE=? and START >= ? and END <= ?;

このテーブルに約 50,000 行あるとします。REGION 列には 500 個の個別の値があり、TYPE 列には 50 個の個別の値があります。ID 列は主キーです。

テーブルにインデックスを付ける最良の方法は何ですか? >= および <= 記号が原因でカバリング インデックスを達成できるかどうかはよくわかりません。以下にいくつかのオプションを示します。

  1. COORD_SYSTEM (REGION, TYPE) にインデックスを作成する
  2. COORD_SYSTEM (REGION、TYPE、START) にインデックスを作成する
  3. COORD_SYSTEM (REGION、TYPE、START、END) にインデックスを作成する

更新 - 説明文は次のとおりです。

          id: 1
  select_type: SIMPLE
        table: COORD_SYSTEM
         type: range
possible_keys: indx_A
          key: indx_A
      key_len: 50
          ref: NULL
         rows: 590
        Extra: Using where
1 row in set (0.00 sec)
4

3 に答える 3

1

範囲演算子でカバリング インデックスを使用できない理由はありません。課題 (非カバー インデックスの場合) は、範囲が大きい場合にフル スキャンによってページの読み取りが少なくなる可能性があり、一部のクエリでインデックスが使用されない可能性があるとオプティマイザーが判断する可能性があることです。同様に、一部のパラメーター値では、カバリング インデックスが一部のパラメーター セットのスキャンよりも優れていない場合、オプティマイザーはフル スキャンを実行することを選択する場合があります。

したがって、質問の説明を考えると、すべてのケースに最適なソリューションを提供することは実際には不可能です。

私がそのようなことをする傾向があるのは:

  • データベースのコピーを作成する
  • どのインデックスが機能するかを推測し、そのインデックスを作成します。
  • EXPLAIN異なるサイズの範囲を持つ複数のクエリ (クエリをカバーしていない場合、範囲が増えると、テーブル データに戻るためにより多くの I/O が必要になるため、一般的な範囲のサイズと外れ値を試す必要があります)
  • インデックスを削除して別のインデックスを試してください。おそらく、列の順序が異なる別のカバリング インデックスを使用します。

INSERTこのクエリを対応するやよりもかなり多く実行UPDATEし、インデックスのサイズがディスク容量の使用の要因にならないことを前提として、フィールドの順序が異なる 2 つ以上のカバリング インデックスを作成することもできます。

于 2013-08-12T08:17:17.323 に答える
0

あなたが探しているのはBETWEENコマンドです。これには START と END は必要ありません.1 つのテーブル行だけで間に合うことができます。

SELECT ID, REGION, START, END from COORD_SYSTEM WHERE REGION=? and TYPE=? BETWEEN 100 and 200;
于 2013-08-12T08:21:43.453 に答える