-2

高速にしたいクエリが1つありますが、まだ理解していないことがあります。

3 つのクエリを使用して単純なテストを行います。

私のテーブルには列があり 13通常のキーを持つ int (それぞれに独自のインデックスがあります) 15と 35 はフルテキスト キーを持つ文字列 (それぞれに独自のインデックスがあります) です。

初め

select `1` from el where ( `15`='Bump' or `35`='Bump' and `3`='1' ) limit 1;

時間: 250ms

2番

select `1` from el where ( `35`='Bump' and `3`='1' ) limit 1;

時間: 0.024ms

三番

select `1` from el where ( `15`='Bump' and `3`='1' ) limit 1;

時間: 0.007ms

私の質問は次のとおりです。また、それを修正する方法は?

前もって感謝します!

編集: これは mysql の制限であり、実際には修正できないようです。そのため、1 つではなく 2 つのクエリを実行することにしました。0.031ms が得られ、0.270ms よりも優れています。

4

1 に答える 1

1

直接修正することはできません。クエリを実行するために 1 つのインデックスからしか読み取ることができないのは MySQL の制限ですが、3 つの条件すべてを処理できる単一のインデックスはありませんOR

つまり、一致する行を探すためにそれぞれを個別にチェックする必要がありますが、行を確実に除外できる単一のインデックスはないため、インデックスをまったく使用できません。

1ANDつを選択し、一致する行を見つけて、(インデックスを使用せずに) さらにフィルター処理して、残りの条件に一致することを確認できます。

それで、どのように修正するのですか?次を使用しUNIONます。

SELECT `1` FROM el WHERE `15`='Bump'
UNION
SELECT `1` FROM el WHERE `35`='Bump'
UNION
SELECT `1` FROM el WHERE `3`='1'

これにより、チェックが個別に実行されてから、それらが結合されます。

PS。はい、MySQL はこれを自動的に行う必要がありますが、そうではありません。PostreSQL を調べてみてください。よくわかりませんが、このタイプのクエリを処理できると思います。

于 2012-08-13T05:03:54.750 に答える