0

これらのフィールドを持つテーブルがあります: userid、logintime、birthdate
生年月日 X と Y の間のすべてのユーザーを取得する必要があります。

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

birtdate だけでインデックスを定義した場合、mysql は filesort を使用して、回避したい結果を並べ替えます (テーブルが大きくなり、クエリが一般的になります)。
ログイン時間はWHERE句にも含まれていないため、インデックス(ログイン時間、生年月日)を定義しても意味がありません(生年月日で結果セットを制限しているだけです)

mysqlのエレガントなソリューションはありますか?

4

3 に答える 3

1

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

于 2011-07-09T18:22:06.073 に答える
0

私の知る限り、列にインデックスを付けてもソートの効果はなく、検索のみに影響します-order by句ではなくwhere句に役立ちます。

編集:@Darhazerのリンクに従ってください-基本的には「ORDER BYはインデックスで満たすことができる」と言われています

于 2011-07-09T19:35:25.890 に答える
0

インデックスはbirtdate、longtimeでなければなりません(最初にWHERE句を満たし、次に順序を満たす必要があります)が、条件間のソートにインデックスを使用できるかどうかはわかりません。並べ替えるにはいくつのレコードが必要ですか? クエリは一般的であるため、memcache または別のキャッシュ メカニズムを使用して、データベースにアクセスすることなく結果を提供できます。

于 2011-07-09T17:44:48.120 に答える