0

次の種類の SQL クエリがあります。

SELECT * FROM data_table WHERE col2 >= x AND col2 < x+y

data_table には index_1(col1, col2, col3) が存在しますが、列 1 から 3 はゼロより大きい整数値を保持しますが、null 値は許可されません。MySQL のインデックスのすべての左側のプレフィックスもインデックスであるため、私の最初のアプローチは、MySQL が index_1 を使用してクエリが高速化されることを期待して、クエリを変更することでした。変更されたクエリは次のようになります。

SELECT * FROM data_table WHERE col2 >= x AND col2 < x+y OR col1 >0

私の考えは、常に真であるが結果を変更しないものを追加したときでした。

index_1 が使用されるようにクエリを変更する方法を知っている人はいますか? それとも不可能なだけですか?

参考までに: data_table は非常に大きく、作成時間が長いため、col2 で新しいインデックスを作成することは適切なオプションではありません。

4

2 に答える 2

1

ごめんなさい

私は非常に遅く答えています私はこれについて一年前に読んでいましたが、今私はこれをカバーする本を見つけました、そしてその本から、あなたは使用しないでください * あなたのインデックスはそれをカバーしていないので、あなたは SELECT col1,col2 のように列を正確に定義するべきです、col3など...またはクエリを次のように書き換えます: SELECT * FROM data_table JOIN (SELECT col1 FROM data_table WHERE col2>=x AND col2<x+y) AS table ON (table.col1=data_table.col1)、ここではサブクエリでインデックスが使用されるため、クエリよりも高速になります...

于 2012-05-23T21:07:15.037 に答える
0

col1 > 0意味がありません。「すべての行」を意味します。オプティマイザーによって使用される統計はこれを示すため、インデックスは無視されるか、非効率的に使用されます(スキャンされ、シークされません)

アイデア:

  • それがあなたが使用するものであるならば、なぜcol2にインデックスを作成しませんか?
  • インデックスを(col2、col1、col3)に変更します

また、現在のインデックスが必要かどうかも調べてください。他のクエリに使用されていない限り、より便利なものに置き換えてください

于 2012-05-22T11:57:08.450 に答える