index
进行范围扫描和ORDER BY
为了简单起见:我将用户的生日存储为birthdate
列中的时间戳,并将timestamp_registered
,timestamp_updated
和timestamp_lastlogin
用于{{{ 1}}。
我读过的是,只有当范围列是索引的最后一部分时,mysql才能在范围扫描的情况下使用完整索引。使用索引进行排序时,排序列必须是最后一列。如果你需要两者,这是一个矛盾。
范围扫描似乎有变通方法,例如使用ORDER BY
,如果没有使用太多参数,或IN (...)
链接:
- 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/
但是,这些解决方案(使用UNION SELECT...
或IN
在我的情况下不起作用,因为几年的生日范围会导致UNION SELECT...
中的数百或数千个参数或IN
。
因此,无论在数据库中使用40,000或200万用户进行测试,一个查询(UNION SELECTs
)都需要几秒钟。如果我使用LIMIT 20
进行快速排序,则过滤速度很慢。如果index
用于快速过滤,则排序很慢。当然,只要应用更多过滤(例如,应用index
或任何其他参数),过滤将缩小结果范围,排序再次变快。
然而,有些网站面临同样的问题并且奇妙地解决它......我想知道怎么做?什么可以解决这个问题?
任何提示或想法都将受到高度赞赏!非常感谢你提前!