我已经阅读了有关 ORDER BY RAND() 及其性能问题的信息——这些是否仅适用于返回大型数据集的查询?例如,如果我有一个包含 100,000 行的表,并使用 WHERE 子句返回一个包含 10 条记录的数据集,然后使用 ORDER BY RAND() LIMIT 1,这个 ORDER BY RAND() 是否会在我的表被过滤到记录与 WHERE 子句匹配,因此性能问题可以忽略不计?
最佳答案
没错,它会在使用 WHERE、GROUP BY 和 HAVING 减少行数后应用 ORDER BY。但它会在 LIMIT 之前应用 ORDER BY。
因此,如果您充分过滤行数,那么是的,ORDER BY RAND() 可能会实现您想要的结果,而不会对性能产生太大影响。简单易读的代码具有合法的好处。
当您认为您的查询应该将行减少到一些小的时候,问题就来了,但随着时间的推移,随着数据的增长,需要排序的行数再次变大。由于您的查询随后对排序结果执行 LIMIT 10,因此隐藏了您正在对 500k 行执行 ORDER BY RAND() 的事实。您只会看到性能神秘地变差。
我在我的书 SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming 中写过关于选择随机行的替代方法,或在 Stack Overflow 上的其他答案中:
关于mysql - MySQL ORDER BY RAND() 函数什么时候排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6910613/