所以在 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/