2

用于index范围扫描和ORDER BY

为简单起见:我将用户的生日作为时间戳存储在列birthdatetimestamp_registeredtimestamp_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/

但是,这些解决方案(在我的情况下使用INUNION SELECT...不起作用,因为几年的生日范围会导致在INor中出现数百或数千个参数UNION SELECTs

因此,无论在数据库中测试 40.000 或 200 万用户,一个查询 ( LIMIT 20) 都需要几秒钟。如果我index用于快速排序,则过滤速度很慢。如果index用于快速过滤,则排序很慢。当然,一旦应用更多过滤(例如,具有country或任何其他要应用的参数),过滤将缩小结果并且排序再次变得更快。

但是,有些网站也面临同样的问题,并且解决得非常好……我想知道怎么做?有什么办法可以解决这个问题?

任何提示或想法将不胜感激!非常感谢您!

4

0 回答 0