在我们的业务需求当中,经常有需要取得随机结果的需求,比如随机会员,随机文章列表,随机文章跳转等等,我们大家都知道MYSQL的ORDER BY RAND()有性能问题,本文翻译自国外的一篇博文,大家来学习一下作者是如何解决这个问题的,这个解决方案具有在生产环境中实施的可行性。
译文开始:
作为第一个例子,我们假设数据的ID从1开始,并且在1和最大值之间是连续的。
把事情交给应用层(PHP, JSP, Python, Ruby …)
第一个思路:我们可以简化整个工作,如果我们可以预先在应用层计算出随机ID
SELECT MAX(id) FROM random; ## 在应用层生成随机ID <random-id> SELECT name FROM random WHERE id = <random-id>
因为MAX(id) == COUNT(id), 我们仅仅是在1和最大值之间生成了随机数,然后传给数据库取出随机记录。
第一个SELECT是已经被优化好的,不需要任何计算。第二个是eq_ref(参见MYSQL EXPLAN语句)是一个常量,所以也非常快。
把事情交给数据库
在应用层做这件事真的是必要的么?我们不能在数据库中做么?
Continue reading “MYSQL获取随机结果集的解决方案” »