IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Mysql的随机读取

淡水河边的博客 2011-06-20 13:34:01 累计浏览 7,865 次
本机暂存

随机读取数据库记录,搜索发现很多人都使用 order by rand() 来达到该目的,这是mysql提供的功能。但是实际上存在非常严重的性能问题。 如果表里记录不多,偶尔用一下也可以。但是如果数据多的话,就会凸显出查询的性能问题。

随机查询5条记录:

SELECT * FROM `table` ORDER BY RAND() LIMIT 5;

在数十万记录的表里,这样的查询要好几秒的时间。下面采用JOIN的方式改进一下:

SELECT *
FROM `table` AS t1 JOIN (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

这样得到连续的5条记录。要不联续的记录,可以连续查询几次,每次limit 1条。这淡水比较推荐,SQL语句比较清晰,效率也不错。

还有,可以这样的:

SELECT * FROM `table`
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)))  ORDER BY id LIMIT 1;

其他更复杂的实现,淡水无视之。

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,251)
  2. 如何成为Python高手 (累计阅读 54,992)
  3. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,399)
  4. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  5. Mysql监控指南 (累计阅读 21,351)
  6. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  7. 如何查找消耗资源较大的SQL (累计阅读 15,211)
  8. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,057)
  9. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  10. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,789)