您现在的位置是: 首页 > MySQL MySQL
MySQL 随机排序 ORDER BY RAND() 性能优化
冬寂
2022-07-22 10:19:46
【MySQL】
4890人已围观
表记录 1876302,totalScore 创建了索引。
第一种:MySQL 随机排序常规写法:展开目录
SELECT * FROM users WHERE totalScore BETWEEN 5 AND 100 ORDER BY RAND() LIMIT 100;
执行耗时 1.18s
SELECT * FROM users WHERE totalScore BETWEEN 5 AND 100 ORDER BY RAND() LIMIT 100;
执行耗时 1.25s
这样的耗时不能接受。
第二种:stackoverflow 上找了一个黑科技写法:展开目录
SELECT * FROM users WHERE totalScore BETWEEN 5 AND 100 ORDER BY 37*(UNIX_TIMESTAMP() ^ id) & 0xffff LIMIT 100;
执行耗时 150ms
SELECT * FROM users WHERE totalScore BETWEEN 5 AND 100 ORDER BY 37*(UNIX_TIMESTAMP() ^ id) & 0xffff LIMIT 100;
执行耗时 153ms
执行耗时直接缩短至 150ms,已经比上一个写法快很多了,而且 LIMIT 1000 时耗时也是 150ms 左右。
第三种方式:展开目录
SELECT *
FROM users AS u
INNER JOIN (SELECT id FROM users WHERE totalScore BETWEEN 5 AND 100 ORDER BY RAND() LIMIT 100) AS t ON t.id=u.id
WHERE 1
执行耗时 110ms
LIMIT 1000 时耗时也稳定在 110ms 左右。
耗时最少,推荐使用第三种。
相关文章
随机图文
-
PHP password_hash() 函数
password_hash -
Typora全网最全教程
Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如,不像其他编辑器的有编辑栏和显示栏 -
关于Thinkphp6 Route设置,Url访问的一个问题
关于Thinkphp6 Route设置,Url访问的一个问题 -
小王子(二)
在附近的宇宙中,还有 325、326、327、328、329、330等几颗小行星。他就开始访问这几颗星球,想在那里找点事干,并且学习学习。第一颗星球上住着一个国王。国王穿着用紫红色和白底黑花的毛皮做成的大礼服,坐在一个很简单却又十分威严的宝座上。