因此,在 MySQL 中,我读到,对于包含大量行的大型表,使用 ORDER BY RAND() 是一个坏主意(即使有大约 500 行表)。缓慢且低效。大量的行扫描。
这(下)看起来如何作为替代方案?
SELECT * FROM (...通常返回少于 20 行的集合的子查询...) ORDER BY RAND() LIMIT 8
我不会对大量数据使用 RAND(),而是选择一个小子集,然后才对这些返回的行应用 RAND()。在 99.9% 的情况下,上面看到的子查询应选择少于 20 行(事实上,通常少于 8 行)。
很想听听人们的想法。
(仅供参考,我正在使用 PHP 执行 MySQL 操作。)
Thanks!
实际上......我最终进行了测试,我可能已经回答了我自己的问题。我想我应该在这里发布此信息,以防对其他人有用。 (如果我在这里做错了什么,请告诉我!)
这有点令人惊讶...
与我读到的所有内容相反,我创建了一个名为 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 行“number”值为 41 的行。)
备用子查询方法返回结果的平均时间约为 0.0080 秒,比非子查询方法慢。
子查询方法:SELECT * FROM (SELECT * FROM TestData WHERE number = 41) as t ORDER BY RAND() LIMIT 8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)