私は、プロダクションサーバでなぜそれが遅いのかを知るためにクエリを簡素化しようとしています。その考え方は、ページネーションの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
が、私は、テーブルを結合して大きなクエリにそれを操作する方法を考え出したていない:それは私が簡略化されたクエリに問題を回避することができます...動作しません。私は何かが本当にシンプルに欠けていますか
強制的にインデックスを使用してクエリを高速化しますか?テーブルのすべてのレコードを読み込む必要がある場合は、インデックスを使用することは意味がありません。 "アイデアはページネーションのX個の最新のエントリを取得することです"。それでLIMIT句がどこかにあるはずです。さもなければDBはあなたがそれらすべてを望んでいると考えます。 – Thilo
申し訳ありませんが、これはLIMIT節について言及していませんでした。 LIMITを有効にしても効果はないようですが、毎回filesortが使用されます。私は、プロダクションサーバー上のFORCE INDEXでスピードテストを実行させませんでした。 EXPLAINを介してのみテストされました。 – overflowing