ORDER BY兰德()会导致引擎为所有行生成随机值,因此,如果要从大型表中选择几行,则性能会非常差. 例如,您可以在php中生成30个随机值,取值范围为[1,maximum row-id],并选择row-id大于或等于随机值LIMIT 1的第一行。 您可以在How can i optimize MySQL's ORDER BY RAND() function?中找到处理此问题的仅SQL方法(但有些方法也不简单)。
SELECT relationship, id
FROM FR_user_friends fr1
JOIN (
SELECT CEIL(RAND() * ( SELECT MAX(id) FROM FR_user_friends )) AS id ) AS fr2
ON fr1.id >= fr2.id
LIMIT 0,30
3条答案
按热度按时间hsvhsicv1#
ORDER BY兰德()会导致引擎为所有行生成随机值,因此,如果要从大型表中选择几行,则性能会非常差.
例如,您可以在php中生成30个随机值,取值范围为[1,maximum row-id],并选择row-id大于或等于随机值
LIMIT 1
的第一行。您可以在How can i optimize MySQL's ORDER BY RAND() function?中找到处理此问题的仅SQL方法(但有些方法也不简单)。
c6ubokkw2#
RAND()
函数太慢了,占用了太多的CPU。它为每一行生成一个随机数,并选择最小的一个,这就是为什么它这么慢。为了加快速度,可以在PHP中生成一个随机数,并在
LIMIT
子句中使用,如下所示:这样的话,速度会更快。
eit6fx6z3#
此查询应该比您的
我也建议在这里多读一些:什么更快?