我读过有关 ORDER BY RAND() 及其性能问题的内容 - 这些是否仅适用于返回大型数据集的查询?例如,如果我有一个包含 100,000 行的表,并使用 WHERE 子句返回包含 10 条记录的数据集,然后使用 ORDER BY RAND() LIMIT 1,则在我的表被过滤到记录与 WHERE 子句匹配,因此性能问题可以忽略不计?
你是对的,它会在使用 WHERE、GROUP BY 和 HAVING 减少行数后应用 ORDER BY。但它会在 LIMIT 之前应用 ORDER BY。
因此,如果您充分过滤行数,那么是的,ORDER BY RAND() 可以实现您想要的效果,而不会产生很大的性能影响。简单且易于阅读的代码有一个合理的好处。
当你遇到麻烦的时候think您的查询应该将行数减少到很小,但随着时间的推移,随着数据的增长,需要排序的行数会再次变大。由于您的查询对排序结果执行 LIMIT 10,因此隐藏了您正在对 500k 行执行 ORDER BY RAND() 的事实。你只会看到性能神秘地变差。
我在书中写了有关选择随机行的替代方法SQL 反模式第 1 卷:避免数据库编程的陷阱,或者在 Stack Overflow 上的其他答案中:
- 使用 MySQL 选择随机行
- 随机化大数据集
- 从mysql的大表中快速选择随机行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)