用于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
或UNION SELECT...
不起作用,因为几年的生日范围会导致在IN
or中出现数百或数千个参数UNION SELECTs
。
因此,无论在数据库中测试 40.000 或 200 万用户,一个查询 ( LIMIT 20
) 都需要几秒钟。如果我index
用于快速排序,则过滤速度很慢。如果index
用于快速过滤,则排序很慢。当然,一旦应用更多过滤(例如,具有country
或任何其他要应用的参数),过滤将缩小结果并且排序再次变得更快。
但是,有些网站也面临同样的问题,并且解决得非常好……我想知道怎么做?有什么办法可以解决这个问题?
任何提示或想法将不胜感激!非常感谢您!