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

2024-01-13

因此,在 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(使用前将#替换为@)

好主意/坏主意?在一小部分子查询结果之外使用 MySQL RAND()? 的相关文章