2011-07-09 14 views
0

私はこれらのフィールドを持つテーブルがあります:userid、logintime、birthdate
誕生日XとYの間のすべてのユーザーを、最近ログインした順に並べる必要があります。私はちょうどbirtdateにインデックスを定義した場合mysqlクエリの結果の注文の問題

SELECT * 
FROM table 
WHERE birtdate BETWEEN x AND Y 
ORDER BY logintime DESC 

、mysqlは私は避けたいの結果を注文するfilesortレコード使用します(表が大きされ、クエリが人気です)。
logintimeもWHERE句(私は誕生日で、結果セットを制限しています)

mysqlの中の任意のエレガントな解決策ではないので、インデックス(logintime、誕生日は)私には意味がないの定義?

答えて

0

索引はbirtdateでなければならず、長い間(最初にWHERE句、次に順序を満たさなければなりません)、条件間でソートするために索引を使用できるかどうかはわかりません。ソートに必要なレコード数クエリが普及しているので、memcacheや別のキャッシュメカニズムを使用してデータベースにアクセスすることなく結果を提供することができます

+0

「ORDER BYがインデックスによって満たすことができる」と言う指数は誕生日であるが、filesortレコードはデータベースダウン湿原を開始しています。 BETWEENには索引が使用されているため、問題はありません。私はそこにはアドオン(memcache)などを必要としないmysqlの解決策があることを望んでいた – Rado

+0

birtdate、logintime(上で述べたように、インデックス、logintimeのインデックス、birtdateはクエリを満たすことができない) –

1

birthdate,logintimeにインデックスを追加するとクエリが改善されるはずですが、私はlogintime(その名前が示すように)頻繁に変更するので、dbエンジンはインデックスの断片化を引き起こす基になるインデックスを更新する必要があります。
クエリが選択的で、インデックスがbirthdateの場合は、filesortに大きな問題はありません。
また、ストアドプロシージャの本体にクエリを入れてみることもできます。この場合、mysqlはアドホッククエリと比較してより効果的にキャッシュを使用します。私の知る限り

0

、列に索引を有する探索のみに、ソートの影響を及ぼさない - それは場合句はなく、句によって順序を助けます。

EDITは:Darhazerのリンク@従ってください - 本質的であることは現時点では

+0

インデックスは、結果の検索、並べ替え、グループ化に役立ちます。 – Rado

+1

@ボヘミアン語[ORDER BY最適化](http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html) –

+0

@Darhazerはリンクに感謝します。私は再び学ぶ! – Bohemian