理解 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 列已建立索引,因此检索速度更快。将用户名添加到结果中需要从每一行读取它,从而减慢操作速度。在 * 的情况下,所有列(包括可变长度的列)都需要加载到内存中,这会进一步影响性能。
快速随机选择的替代方案
对于有效的随机行选择,请考虑以下替代方案:
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中文网其他相关文章!