14

INT の列を持つ 200k エントリのテーブルがあります。クエリを高速化するためにインデックスを作成したいと考えています。これは実行したいクエリです: SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43). 次のインデックスを作成しました: BACD、。CABC

コマンドを使用するEXPLAINと、MySQL が index を選択することがわかりましたACD。そのため、テーブルにさらに多くの値を入力し続けたところ、MySQL が上記のインデックスを切り替えていることに気付きました (常に同じであるとは限りません)。

多くの挿入があるため、さまざまなインデックスを持つとパフォーマンスの問題が発生し、このテーブルは、すべてのインデックスが意味を持つ異なる列を必要とする他のクエリによってアクセスされると想定できます。

については承知してUSE INDEX()いますが、MySQL を信頼して正しいインデックスを選択する必要があるかどうかを理解したいと思います。

4

2 に答える 2

9

ORSQLステートメントにが含まれているため、MySQLは単にを含む最初のインデックスを取得しています。Aこれは。ですACD

INDEXを使用してこの問題を解決する方法は、2つの別々のクエリを作成することであるという結論に達しました。SELECT A,B,C,D,E FROM table WHERE A=23 AND B=45を使用しINDEX ABC、次にSELECT A,B,C,D,E FROM table WHERE A=23 AND C=43を使用しますINDEX ACD。これはすべて、を使用して1つのステップで実行できます。これは(...) UNION (...)、より高速で、INDEXのみを使用することがわかります。

于 2012-03-23T09:43:51.380 に答える
0

Mysql は、複合インデックスの「左端」の部分のみを使用できます。つまり、where句が次のようになっている場合

WHERE A=1 AND B=2

Aその場合、MySQL はまたはABでインデックスを使用できますが、これABが最適です。ACBインデックスが別の列で分割されているため、使用できませんでした

指定された WHERE 句では、MySQL クエリ エンジンが複数のインデックスを利用できるとは思いません。AND を作成し、ABFORCE ACINDEX を使用して、どちらが高速かを確認します。

この場合、A と他の 1 つの列を参照しているため、3 列の複合キーは役に立ちません。この種のキーは、クエリがANDの代わりに使用している場合に役立ちますOR。のインデックスABCは次の場合に役立ちます

WHERE A=1 AND B=2 AND C=3
于 2012-03-22T21:27:23.543 に答える