惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
Vercel News
Vercel News
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
量子位
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
博客园 - 【当耐特】
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
IT之家
IT之家
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
博客园 - 三生石上(FineUI控件)

膨胀自留地

使用CloudFlare标记管理功能优雅的使用谷歌分析 四天轻松版北京旅游攻略 Adsense税务居住地证明申请教程:如何申请中国税收居民身份证明以及Google Adsense更新新加坡税务信息教程 常见的 VPS 优化措施 HTML实现table表格移动端自动转为卡片样式 个人网站接入 Google 登录 如何从 GitHub 永久删除泄露的 .env 文件 Cloudflare设置www的域名跳转到不带www的域名 顶级iOS神器!全面解开App Store限制,AssPP Pro保姆级教程 BroadcastChannel将你的 Telegram Channel 转为微博客 Medama开源轻量级网站统计(分析)系统 白嫖一个网站监控面板:uptime-kuma 部署TraffMonetizer利用闲置VPS挂机赚钱 Counterscale-使用CloudflareWorkers部署的免费网站数据统计工具,界面类似umami 封装一个最简单的Axios,避免过度封装! 如何使用Cloudflare Email Routing创建域名邮箱免费发送邮件 使用Cron定时更新Hosts解决Gihub无法访问问题 容器化MariaDB/Mysql实现定时备份 JetBrains全家桶许可证服务器怎么找,JetBrains激活教程 图片加速接口:缓存图片,加速访问,解决防盗链 MySQL模糊查询再也不用like+%了,全文索引介绍及使用简介 为什么这么多人推荐你办理流量卡?流量卡怎么赚钱?怎么避坑? 借助Cloudflare Worker实现Google Analytics反代加速,规避广告屏蔽插件的拦截 etcd入门之在Centos上安装部署 Grafana在linux下安装和基本使用入门 Prometheus介绍、安装和基本功能快速入门 无需加速器,油猴插件解锁xbox云游戏 阿里云盘自动每日签到,无需部署,无需服务器 自定义VSCode终端主题样式 一行 CSS 代码实现响应式布局 – 使用 Grid 实现的响应式布局
MySQL 数据库中随机获取一条或多条记录的三种方法
2021-04-19 · via 膨胀自留地

#编程技术 2021-04-19 13:23:00 | 全文 611 字,阅读约需 2 分钟 | 加载中... 次浏览

👋 相关阅读


工作中会遇到从数据库中随机获取一条或多条记录的场景,下面介绍几种随机获取的方法供参考。

首先创建个 users 表演示:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表中存放30万记录。

1、使用 order by rand()

SELECT * FROM users ORDER BY RAND() LIMIT 1;

LIMIT 1 的执行时间:0.559s, LIMIT 100 耗时 0.660s。

此种方法在数据量小的情况下可以使用,但在生产环境不建议使用。

MYSQL 手册里面针对 RAND() 的提示大概意思就是,在 ORDER BY 从句里面不能使用 RAND() 函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低,效率不行,切忌使用。

2、使用 join 及 rand() 函数

SELECT * FROM users AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id) 
FROM users)) AS id) AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;

此 sql 随机获取一条的时间是 0.014s,LIMIT 100 时耗时 0.020s,性能上没差多少。

获取多条的话有时会达不到要求(获取的记录数可能达不到多条)

3、子查询及 rand() 函数

SELECT * FROM users as t1 WHERE t1.id>=(RAND()*(SELECT MAX(id) FROM users)) LIMIT 1;

随机取一条的耗时:0.015,LIMIT 100 时耗时 0.026s。

随机获取一条记录推荐使用 第 2 种方法,在 30 万条记录时也只需 0.014s。

2021.06.02 更新:

上边第二种方法更优写法:

SELECT * FROM users  AS t1  JOIN (SELECT ROUND(RAND() * ((SELECT MAX(userId) FROM `users`)-(SELECT MIN(userId) FROM users))+(SELECT MIN(userId) FROM users)) AS userId) AS t2 WHERE t1.userId >= t2.userId ORDER BY t1.userId LIMIT 1

第三种方法的更优写法:

SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users) LIMIT 1

via: MySQL数据库中随机获取一条或多条记录_River106的博客-CSDN博客_mysql随机取一条记录 https://blog.csdn.net/angellee1988/article/details/103845533

MYSQL随机读取一条数据_shenzhou_yh的博客-CSDN博客_mysql 随机查询一条数据 https://blog.csdn.net/shenzhou_yh/article/details/90550090


×