2012-02-21 2 views
2

私は、プロダクションサーバでなぜそれが遅いのかを知るためにクエリを簡素化しようとしています。その考え方は、ページネーションのX個の最新のエントリを取得することです。問題は、MySQLのオプティマイザは、主キー(ID)の代わりにfilesortを使いたいと思われることです。必要に応じて、すべての余分なものを、次のような作品を剥ぎ取るインデックス(プライマリ)を使用して:SELECTフィールドに複数のフィールドが存在する場合、ORDER BYがインデックスを使用していません。

EXPLAIN SELECT ID FROM table ORDER BY ID DESC 

しかし、これらの変動は、filesortレコードに頼る:

EXPLAIN SELECT ID, field2 FROM table ORDER BY ID DESC 
EXPLAIN SELECT * FROM table ORDER BY ID DESC 

私はいくつかのフィールドを返す必要があり、そう

EXPLAIN SELECT * FROM table FORCE INDEX (Primary) ORDER BY ID DESC 

が、私は、テーブルを結合して大きなクエリにそれを操作する方法を考え出したていない:それは私が簡略化されたクエリに問題を回避することができます...動作しません。私は何かが本当にシンプルに欠けていますか

+0

強制的にインデックスを使用してクエリを高速化しますか?テーブルのすべてのレコードを読み込む必要がある場合は、インデックスを使用することは意味がありません。 "アイデアはページネーションのX個の最新のエントリを取得することです"。それでLIMIT句がどこかにあるはずです。さもなければDBはあなたがそれらすべてを望んでいると考えます。 – Thilo

+0

申し訳ありませんが、これはLIMIT節について言及していませんでした。 LIMITを有効にしても効果はないようですが、毎回filesortが使用されます。私は、プロダクションサーバー上のFORCE INDEXでスピードテストを実行させませんでした。 EXPLAINを介してのみテストされました。 – overflowing

答えて

0

ページあたり

select * from table order by id desc limit (pageNO-1) * noEntries , noEntries 

例えば1ページのための10のエントリ

select * from table order by id desc limit 0, 10 

ページあたり2ページ目と10エントリ

select * from table order by id desc limit 10, 10 
+0

上記のThiloへの私の反応を見てください。 LIMIT句に追加すると、まだfilesortが使用されます。それは私が最初に困惑していた部分で、何が起きているのかをよりよく理解できるようになるまで私はすべての部分を取り除いてくれる。 – overflowing

+0

はIDフィールドが一意である –

+0

はい、それはテーブルのプライマリキーなので、ユニークです。 – overflowing

0

解決される問題について例えばこのクエリをお試しください!私は、多くの改訂を経て、鍵となったためにどの1誓うことはできませんが、私は、主なものは次のクリーンアップ効果だったOPTIMIZE表、実行していたと思います。そのことを

Type  Usage 
Data  241.2 KiB -> 239.4 
Index  31,744 B -> 26,624 
Overhead 136 B  -> 0 
Effective 272.0 KiB 
Total  272.2 KiB -> 265.4 

を、私は実行することができました"EXPLAIN SELECT ID、field2 FROMテーブルORDER BY ID DESC LIMIT 0,10"ファイルを使用せずに、それは良いスタートでした。そこから、私は再びメインクエリを構築し始め、DISTINCT(ID)の問題にぶち当たってプライマリキーをインデックスとして使用しないようにしました。ただし、IDフィールドが結合するテーブルの1つに各IDの複数のエントリがあるため、そこに存在する必要がありました。しかし、DISTINCT(ID)をGROUP BY IDに置き換えると、このトリックが実行されました。以前はうまくいきませんでしたので、OPTIMIZE TABLEとは何か関係があるのでしょうか?とにかく、私はそれに接続している間に試行された助けをありがとう!

+0

これは暗黙のことですが、filesortの代わりにインデックスを使用するようにクエリを実行すると、パフォーマンスに大きな影響があったことに言及する必要があります。以前は、一見無限にぶら下がっていましたが、今はほとんど瞬時です。 – overflowing

関連する問題