为什么 MySQL 中 ORDER BY RAND() 的性能如此不可预测?

Susan Sarandon
发布: 2024-11-04 03:58:30
原创
467 人浏览过

Why Does `ORDER BY RAND()` Have Such Unpredictable Performance in MySQL?

深入研究 MySQL 的 ORDER BY RAND() 及其性能惊喜

简介
ORDER BY RAND( ) 是 MySQL 中常用的构造,用于从表中检索随机行。然而,这种看似简单的语法背后隐藏着一个复杂的机制,可能会导致意外的性能变化。本文深入研究了 ORDER BY RAND() 的内部工作原理,并试图解释它的一些神秘行为。

ORDER BY RAND() 的意外结果
出现了违反直觉的性能差异在具有不同数据类型的列上使用 ORDER BY RAND() 时。以下查询演示了这种现象:

  • SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 秒*/
  • SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 秒*/
  • 从表中选择 ID、用户名 ORDER BY RAND() LIMIT 1; /*90 秒*/

尽管在所有三个查询中都对单个列进行排序,但执行时间差异很大。这引发了关于底层机制及其对数据特征的依赖的问题。

Jay 的解决方案:快速随机选择
为了解决性能问题,Jay 提出了一种替代方法:

<code class="sql">SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;</code>
登录后复制

此查询显着优于传统的 ORDER BY RAND() 方法,突出显示了选择随机数据的更有效方法。虽然此方法解决了性能问题,但它带来了复杂性,并且可能并不总是在所有情况下都可行。

了解性能变化
观察到 ORDER BY RAND( 的不同执行时间)查询可以通过MySQL的索引功能来解释。索引列(如本例中的 id)允许更快地访问数据,从而加快执行速度。当检索多列时,例如在 SELECT id, username FROM table ORDER BY RAND() LIMIT 1; 中,MySQL 需要检索两列的值,从而增加了执行时间。

结论
虽然 ORDER BY RAND() 仍然是检索随机行的有用工具,但了解其性能影响至关重要。通过考虑所涉及的数据类型并在必要时利用替代方法,开发人员可以优化其查询并获得更快的结果。

以上是为什么 MySQL 中 ORDER BY RAND() 的性能如此不可预测?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板