MySQL ORDER BY RAND()函数何时命令?

key*_*arz 2 mysql random performance

我已经阅读了ORDER BY RAND()及其性能问题 - 这些仅适用于返回大型数据集的查询吗?例如,如果我有一个包含100,000行的表并使用WHERE子句返回包含10条记录的数据集,然后使用ORDER BY RAND()LIMIT 1,那么在我的表被过滤到表后,将应用此ORDER BY RAND()记录匹配WHERE子句,因此性能问题可以忽略不计?

Bil*_*win 9

你没错,它会在减少WHERE,GROUP BY和HAVING的行数后应用ORDER BY.但它会在LIMIT之前应用ORDER BY.

因此,如果您充分过滤行数,那么是的,ORDER BY RAND()可以达到您想要的效果而不会对性能产生很大影响.对于简单易读的代码,有一个合理的好处.

当你认为你的查询应该将行减少到一些小的时候会出现问题,但随着数据的增长,随着时间的推移,它需要排序的行数会再次变大.由于您的查询然后对排序结果执行了LIMIT 10,因此隐藏了您在500k行上执行ORDER BY RAND()的事实.你只是看到性能神秘地变得更糟.

我已经写过关于在我的书SQL Antipatterns:避免数据库编程的陷阱中选择随机行的替代方法,或者在Stack Overflow的其他答案中: