【发布时间】:2018-02-08 13:58:42
【问题描述】:
我遇到了一个关于 MySQL 的有趣问题。当我尝试将 RAND() 函数与一些大整数相乘时,我得到的最大随机数非常小。这是我的 MySQL 查询,它应该是一个非常快速的随机查询,但它返回最大 ID 36000,即使有 4600000+ 个 ID。
SET @maxID=(SELECT MAX(id) FROM property); #it's about 4600000
SELECT * FROM property
WHERE
downloaded_at IS NULL
AND id >= FLOOR(1 + RAND() * @maxID) #this returns max +/-36000
LIMIT 100
当我将此代码移动到普通的 SELECT 查询中时,一切都很好
SELECT FLOOR(1 + RAND() * (SELECT MAX(id) FROM property))
谁能解释一下,为什么会出现这个错误?谢谢!
修改
嗯,不知何故,当我删除downloaded_at IS NULL 时,ID 更高,但结果不再那么随机了。
我不能使用 ORDER BY RAND(),因为表太大,查询太慢,整个服务器最终在几分钟内崩溃
版本是 5.7.21-0ubuntu0.16.04.1
【问题讨论】:
-
请注意,由于
(SELECT MAX(id) FROM property)是一个静态子查询,它只会执行一次。所以不需要使用变量。 -
顺便说一句:我希望
RAND()只执行一次。 -
RAND() 每次都会执行,这是我的随机查询所必需的,否则它会返回行的序列,而不是随机的
-
你所做的看起来很聪明但也很冒险,因为你只是不知道 where 子句中发生了什么。我会使用更可靠的方式。