mysql - MySQL ORDER BY RAND() 函数什么时候排序?

标签 mysql performance random

我已经阅读了有关 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/

相关文章:

PHP - 文件获取内容和正确的编码

performance - 处理 "all combinations"项目的最佳方法是什么?

C# if/return 或 if/return/else 更好?

performance - 比较 druid 和 pipelinedb

javascript - 从 Javascript 嵌套数组/数据结构中选择随机项

mysql - 如何使 MySQL 触发器仅在至少一个 OLD 字段与 NEW 字段不同时运行?

mysql - JOIN 查询的 ORDER BY

mysql - MySQL中多列索引的效率

java - 检索二进制矩阵中未占用点的最有效方法

java - 如何在没有数组的情况下使用 Java 中的 txt 文件阅读器来生成随机短语生成器