2012-03-04 11 views
2

これはばかな質問かもしれません。私は30M以上のレコードを持っています。Mysql-これは最適化されたクエリですか?

Table 1 

Column A(int) - Column B(Boolean) - Column C(int) - Column D(DateTime) 

(A、B、C、D)に複合インデックスがあります。

次のクエリです:

Select * from table1 where A=12 and B!=0 ORDER BY C DESC ,D ASC. 

Order by C DESC and D ASCができませんので。私はレコードを挿入するたびにCに(-1)を掛けて逆ソートしています。

今、私が実行しようとしているクエリは次のようになります。2つのwhere句の基準とorder byを考慮

Select * from table1 where A=12 and B!=0 ORDER BY C ASC ,D ASC. 

、これ以上のクエリはインデックスをフルに活用するのだろうか?それとも他に良い解決策がありますか?

答えて

4

EXPLAINという非常に便利なSQLコマンドがあります。

これは、RDBMSがクエリの計算にどのように近づくかを説明しています。 ORDER BY C DESC, D ASCとクエリがORDER BY C ASC, D ASCに変更し、このインデックスを使用できるようにC欄のネガを保管

http://dev.mysql.com/doc/refman/5.0/en/explain.html

+0

申し訳ありませんが、現時点ではmysqlデータベースにアクセスできませんでした。このテストを行うにはしばらく時間がかかります。あなたがその状況で仕事をしている背景にある理論を私に教えてもらえれば大丈夫ですか?おそらく私は確信している素晴らしい選択肢を提供しています。 – user1248331

+0

かなり正直なところ、セットアップ、カーディナリティのレコードなどです。基本的に、クエリオプティマイザの背後にある科学技術はかなり繊細で、問題に非常に特化しています。 – qdot

0

は良いアイデアです。あなたはOKです他の順序(ASC, ASCまたはDESC, DESCまたはDESC, ASCを必要とする他のクエリを持っていない場合。

しかし、私はまたB = 1B != 0条件を変更することになります。オプティマイザは、同一と5月としてこれらを識別するのは賢いではないかもしれません