index
範囲スキャンに使用し、ORDER BY
簡単にするために、ユーザーの誕生日をタイムスタンプとして列に保存しbirthdate
、timestamp_registered
それを使用したいと考えていtimestamp_updated
ます。timestamp_lastlogin
ORDER BY
私が読んだことは、範囲列がインデックスの最後の部分である場合にのみ、範囲スキャンの場合に mysql が完全なインデックスを使用できるということです。並べ替えにインデックスを使用する場合と同じで、並べ替えの列は最後の列でなければなりません。両方が必要な場合、これは矛盾します。
範囲スキャンには回避策があるようです。たとえばIN (...)
、引数が多すぎない場合は を使用します。UNION SELECT...
リンク:
- http://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/および
- http://www.mysqlperformanceblog.com/2006 /08/14/mysql-followup-on-union-for-query-optimization-query-profiling/
ただし、これらのソリューション ( IN
orを使用すると、私の場合は機能しません。誕生日の範囲が数年になると、 or で数百またはUNION SELECT...
数千の引数が生じるためです。IN
UNION SELECTs
したがって、データベース内の 40,000 人または 200 万人のユーザーでテストしても、1 回のクエリ ( LIMIT 20
) には数秒かかります。index
高速ソートに使用すると、フィルタリングが遅くなります。を高速フィルタリングに使用するindex
と、ソートは遅くなります。確かに、より多くのフィルタリングが適用されるとすぐに (たとえば、country
またはその他の引数を適用する)、フィルタリングによって結果が絞り込まれ、並べ替えが再び高速になります。
しかし、同じ問題に直面しているサイトがあり、それを素晴らしい方法で解決しています...どのようにすればよいでしょうか? これに対する解決策は何ですか?
ヒントやアイデアをいただければ幸いです。さっそくありがとうございます!