私はINTのカラムを持つ200kエントリのテーブルを持っています。クエリをより速くするためのインデックスを作成したい。これは私が実行したいクエリです:SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43)
。私は次のインデックスを作成しました:B
、ACD
、C
、ABC
。MySQL。 "OR"クエリのインデックスを作成する
EXPLAIN
コマンドでは、MySQLがインデックスACD
を選択したことがわかりました。だから私はテーブルをより多くの値で埋めることを続けました、そして、私は上記のインデックス間でMySQLが切り替えていることに気付きました(常に同じではない)。
さまざまなインデックスを持つため、パフォーマンス上の問題が発生し、このテーブルには、すべてのインデックスが意味のある別の列を必要とする他のクエリによってアクセスされることが想定されます。
私はUSE INDEX()
を知っていますが、正しいインデックスを選択するためにMySQLを信頼する必要があるかどうかを理解したいと思います。
「このテーブルは、すべてのINDEXが意味を持つ異なる列を必要とする他のクエリによってアクセスされると考えることができます」とはどういう意味ですか?あなたはそのような質問のいくつかの例を挙げることができますか?また、 'SHOW INDEXES FROM table'クエリの出力を教えてください。 A、AB、ACの索引は確かに冗長です。これらはすでにACD/ABC、ABC、ACDの索引でそれぞれカバーされています。 MySQLがマルチカラムインデックスを扱う方法については、http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – Daan
でご覧になれます。クエリの例: 'BテーブルからBテーブルを取得するB = 12'。 さて、A、AB、AC(除外)は除外できます。しかし、それでもACDを使用する理由は説明されていません。 'D 'が' WHERE'ステートメントでさえもないとき。 –
はい、それはちょっと不思議です: 'SHOW INDEXES FROM table'クエリの出力はなぜ起こっているのかを知るのに役立ちます:) – Daan