MySQL:RANGE和ORDER BY上的松散索引扫描 - 如何解决?

时间:2012-06-17 14:02:14

标签: mysql database performance indexing

使用index进行范围扫描和ORDER BY

为了简单起见:我将用户的生日存储为birthdate列中的时间戳,并将timestamp_registeredtimestamp_updatedtimestamp_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或任何其他参数),过滤将缩小结果范围,排序再次变快。

然而,有些网站面临同样的问题并且奇妙地解决它......我想知道怎么做?什么可以解决这个问题?

任何提示或想法都将受到高度赞赏!非常感谢你提前!

0 个答案:

没有答案