首页  >  文章  >  数据库  >  ORDER BY RAND() 在 MySQL 中如何工作,为什么这么慢?

ORDER BY RAND() 在 MySQL 中如何工作,为什么这么慢?

Barbara Streisand
Barbara Streisand原创
2024-11-04 06:07:01558浏览

How Does ORDER BY RAND() Work in MySQL, and Why Is It So Slow?

理解 MySQL 中的 ORDER BY RAND()

虽然 ORDER BY RAND() 语法看起来很简单,但其内部工作原理可能很神秘。本文深入探讨了此操作背后的机制,并解决了一些意外的性能差异。

ORDER BY RAND() 函数如何

最初,人们认为 ORDER BY RAND () 将一列随机值添加到表中并根据该值进行排序。然而,后续研究表明 Jay 提出的方法明显更快:

SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;

此方法会在现有 ID 范围内生成随机 ID,并检索第一个匹配行。

性能变化

有趣的是,ORDER BY RAND() 的性能根据结果中包含的列而变化:

SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 seconds*/
SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 seconds*/
SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 seconds*/

这种差异可以归因于索引。 id 列已建立索引,因此检索速度更快。将用户名添加到结果中需要从每一行读取它,从而减慢操作速度。在 * 的情况下,所有列(包括可变长度的列)都需要加载到内存中,这会进一步影响性能。

快速随机选择的替代方案

对于有效的随机行选择,请考虑以下替代方案:

  • 德国博主的存档中描述的过程(web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql- order-by-rand-a-case-study-of-alternatives/)。
  • 使用 Jay 的方法,尽管其复杂性增加,以获得最佳速度。
  • 采用以下两个查询方法为简单起见:
SELECT id FROM table ORDER BY RAND() LIMIT 1;
SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;

以上是ORDER BY RAND() 在 MySQL 中如何工作,为什么这么慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn