2

index範囲スキャンに使用し、ORDER BY

簡単にするために、ユーザーの誕生日をタイムスタンプとして列に保存しbirthdatetimestamp_registeredそれを使用したいと考えていtimestamp_updatedます。timestamp_lastloginORDER 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/

ただし、これらのソリューション ( INorを使用すると、私の場合は機能しません。誕生日の範囲が数年になると、 or で数百またはUNION SELECT...数千の引数が生じるためです。INUNION SELECTs

したがって、データベース内の 40,000 人または 200 万人のユーザーでテストしても、1 回のクエリ ( LIMIT 20) には数秒かかります。index高速ソートに使用すると、フィルタリングが遅くなります。を高速フィルタリングに使用するindexと、ソートは遅くなります。確かに、より多くのフィルタリングが適用されるとすぐに (たとえば、countryまたはその他の引数を適用する)、フィルタリングによって結果が絞り込まれ、並べ替えが再び高速になります。

しかし、同じ問題に直面しているサイトがあり、それを素晴らしい方法で解決しています...どのようにすればよいでしょうか? これに対する解決策は何ですか?

ヒントやアイデアをいただければ幸いです。さっそくありがとうございます!

4

0 に答える 0