为什么在MySQL中ORDER BY RAND()会导致服务器CPU飙升

秋丽同学_1086

秋丽同学_1086

2026-09-09

750人浏览

原创

order by rand() 会让 mysql cpu 打满,因为其需为每一行调用 rand() 并全量排序,触发全表扫描、内存排序及临时表落盘,导致 sort_merge_passes 暴涨和 mysqld cpu 长期超 90%。

为什么在mysql中order by rand()会导致服务器cpu飙升

ORDER BY RAND() 为什么让 MySQL CPU 打满

因为 MySQL 必须为表中**每一行都调用一次 RAND() 函数**,再对全部 N 行做完整排序——哪怕你只写 LIMIT 1。这不是“随机取一条”,而是“全表打乱再截头”,时间复杂度是 O(N log N),且无法利用任何索引。

常见现象包括:SHOW PROCESSLIST 中大量连接卡在 Sorting result 或 Creating sort index;慢日志里反复出现同一句 ORDER BY RAND();监控看到 Sort_merge_passes 暴涨、mysqld 进程 CPU 占用长期 90%+。

MySQL 5.7 下 ORDER BY RAND() 的执行陷阱

MySQL 5.7 不支持对 RAND() 做物化或下推优化,所有计算都在 server 层完成。它会:

  • 全表扫描(type: ALL),哪怕主键索引存在也完全无视
  • 为每行分配内存存随机值,触发 sort_buffer_size 频繁扩容
  • 若结果集超出内存阈值,自动落盘生成 MyISAM 临时表,伴随 Copying to tmp table on disk
  • RAND() 是非确定性函数,导致查询无法被 Query Cache 缓存(如果还开着)

为什么 Java 应用调用时更危险

Java 侧通常用 JDBC 同步执行 SQL,若没设 queryTimeout 或连接池熔断策略,一条 ORDER BY RAND() 就可能:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 独占一个数据库连接数秒甚至几十秒,阻塞后续请求
  • 并发 5–10 QPS 时,CPU 和连接池瞬间耗尽,引发雪崩
  • 日志里反复出现 converting HEAP to MyISAM,说明已进入恶性循环

真正有效的替代方案(不是“差不多快”,而是毫秒级)

核心原则:**把随机逻辑从 MySQL 移到应用层,SQL 只走主键索引查找**。前提是表有自增 id 且空洞不严重:

  • 先查总数:SELECT COUNT(*) FROM user(可缓存 60 秒)
  • Java 生成随机偏移:int offset = ThreadLocalRandom.current().nextInt(count)
  • 执行索引查询:SELECT * FROM user WHERE id >= ? ORDER BY id LIMIT 1(? 是估算的起始 id)
  • 若返回空,最多重试 3 次;需要多条时,生成多个随机 id 并去重

空洞严重?预加载有效 id 到 Redis,用 SRANDMEMBER 或 SPOP —— 这才是生产环境真正扛得住的随机。

别信“加个索引就能优化 ORDER BY RAND()”,它根本不会走索引。真正难的是把“随机”这个需求,从 SQL 层剥离出来,而不是在原地打补丁。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

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

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

437

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

880

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2652

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

896

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

789

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

414

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2396

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4412

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

727

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 283人学习