2011-07-15 20 views
1

私は次のクエリを有する:MySQLのクエリ最適化

SELECT * 
    FROM posts USE INDEX(abc) 
WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 
LIMIT 10; 

INDEX(ABC)は、列A、B、Cの指標です。

データベースが大きくなった最近まで、クエリは正常に機能しました。現在、約10百万行があります。

私はそれを大いに成功させることなく最適化するための選択肢を見つけることを試みてきました。私は誰かが私に手がかりを与えることを願っています。ありがとう。

私のテーブルエンジンはinnodbです。

+0

これらの条件がどのように生成されるかについていくつかの洞察をいただけますか? –

+0

@ダン:列cの問合せが絶対ではないため、フルスキャンを実行する必要があるため、索引にdとeを追加すると無駄になります。 – Vern

+0

@Sam:このクエリは、category = 3、group = 123、domain> 4012、articleID> 5212300、writer!= 661のような関連記事を生成するためのクエリです。 – Vern

答えて

1

あなたが使用しているのインデックスヒントを削除して最適化を開始します。クエリオプティマイザは、クエリの最適な実行計画を推測する上で非常にうまく機能し、長期的にインデックスヒントを提供することは、通常、クエリのパフォーマンスに悪影響を与えます。

SELECT * 
    FROM posts 
WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 
LIMIT 10; 

私はまた、列abcde上の独立したインデックスは、クエリプランナは、クエリを解決するために、インデックスを組み合わせることができるようになるので、役立つかもしれないと思います。 (MySQLについてはわかりませんが、PostgreSQLがそれらを結合して助けてくれればクエリを解決することができます)。

+0

独立したインデックスが役立つとは思いません。この記事をチェックしてください:http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge/ – Vern

+0

私はちょうどインデックスヒントを削除しようとしました。これは悪いです。すべてのクエリが突然プロセスリストを詰まらせます。 :( – Vern

+0

@ヴァーン:とても面白いリンク本当にありがとう! –