首页  >  文章  >  数据库  >  MySQL 的 ORDER BY RAND() 函数实际上使用随机选择算法吗?

MySQL 的 ORDER BY RAND() 函数实际上使用随机选择算法吗?

Patricia Arquette
Patricia Arquette原创
2024-11-03 14:08:30428浏览

Does MySQL's ORDER BY RAND() Function Actually Use a Random Selection Algorithm?

MySQL 的 ORDER BY RAND() 函数是随机选择算法吗?

在数据库操作领域,真正随机地检索数据订单可能是一个难题。 MySQL 的 ORDER BY RAND() 函数长期以来一直是用于此目的的工具,但其表面随机性背后的底层机制仍然有些难以捉摸。

尽管假设 ORDER BY RAND() 添加了一个随机列排序之前的表格,最近的研究表明情况并非如此。相反,MySQL 采用不同的策略来实现其所谓的随机选择。

事实上,Jay 在其博客中提出的查询被证明是获取随机行的最有效方法。此查询将表与子查询连接起来,该子查询在表的最大 ID 范围内生成随机 ID。通过将表行过滤为 ID 大于或等于此随机 ID 的行,查询可以快速检索随机行。

但是,对三个类似查询的执行时间进行了特殊观察:

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

这些不同的执行时间似乎违反直觉,因为所有三个查询都涉及按单个列排序。这种差异可以归因于索引。

在第二个查询中,id 列已建立索引,可以快速访问数据。然而,在第三个查询中包含像 username 这样的附加列需要 MySQL 读取每一行并为这些值分配内存,从而显着增加执行时间。

总之,MySQL 的 ORDER BY RAND() 函数不使用真正的随机选择算法。相反,它采用一种通过将表与生成随机 ID 的子查询连接来模拟随机性的技术。虽然不是最有效的方法,但它提供了一种以看似随机的顺序检索数据的实用方法。

以上是MySQL 的 ORDER BY RAND() 函数实际上使用随机选择算法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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