php - 好主意/坏主意?在一小组子查询结果之外使用 MySQL RAND()?

标签 php mysql random

所以在 MySQL 中,我已经读到对于有很多行的大表,使用 ORDER BY RAND() 是一个坏主意(即使有大约 500 行表,据说)。缓慢且低效。大量行扫描。

这个(下图)看起来如何作为替代方案?

SELECT * FROM(...通常返回少于 20 行的集合的子查询...)ORDER BY RAND() LIMIT 8

我不会对大量数据使用 RAND(),而是选择一个小的子集,然后才对那些返回的行应用 RAND()。在 99.9% 的情况下,上面看到的子查询应该选择少于 20 行(事实上,通常少于 8 行)。

很想听听人们的想法。

(仅供引用,我正在用 PHP 处理 MySQL。)

谢谢!

最佳答案

实际上...我最终运行了一个测试,我可能已经回答了我自己的问题。我想我会在这里发布这些信息,以防它对其他人有用。 (如果我在这里做错了什么,请告诉我!)

这有点令人惊讶......

与我读过的所有内容相反,我创建了一个名为 TestData 的表,其中包含 100 万行并运行了以下查询:

SELECT * FROM TestData WHERE number = 41 ORDER BY RAND() LIMIT 8

...它返回行的平均时间为 0.0070 秒。我真的不明白为什么 RAND() 的名声这么差。它对我来说似乎很有用,至少在这种特殊情况下是这样。

我的表中有三列:

id [BIGINT(20)] |文本字段 [tinytext] |数字 [BIGINT(20)]

id 上的主键,number 上的索引。

我想 MySQL 足够聪明,知道它应该只将 RAND() 应用于“WHERE number = 41”返回的 20 行? (我特意只添加了 20 行,“数字”的值为 41。)

备用子查询方法返回结果的平均时间约为 0.0080 秒,比非子查询方法慢。

子查询方法:SELECT * FROM (SELECT * FROM TestData WHERE number = 41) as t ORDER BY RAND() LIMIT 8

关于php - 好主意/坏主意?在一小组子查询结果之外使用 MySQL RAND()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4710048/

相关文章:

php - Laravel - 查询最后两个等于的位置

javascript - Angularjs $http post请求数据和未定义错误的响应

mysql - 错误 : #1054 - Unknown column 'NOPL' in 'where clause' ?

mysql - ODBC 连接

php - 获取错误 : "Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in"

Java将int值链接到随机生成的代码

php - Woocommerce 如何从终止的订单列表中获取订单 ID

php - fetch_array() 不保留查询中的 ORDER BY

c++ - 随机字符串生成

javascript - 随机大小的 JavaScript Canvas 矩形