码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MySQL中如何随机获取一条记录


    点击上方蓝字关注我

    832aaa2c09d6df38d7e8a6cc96f4bad4.png

        随机获取一条记录是在数据库查询中常见的需求,特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中,有多种方法可以实现随机获取一条记录,每种方法都有其适用的情况和性能特点。在本文中,我们将探讨几种常用的方法,并推荐适合不同情况下的最佳方法。

    方法一:使用 ORDER BY RAND()

    这是最常见的随机获取一条记录的方法之一:

     
     
    SELECT * FROM testdb.test_tb1 ORDER BY RAND() LIMIT 1;

    0805d7e4e4668b2b8a4b7bda2c9ea27f.png

    虽然简单直接,但在大数据量下性能较低,因为需要对整个结果集进行排序。

    方法二:利用 RAND() 函数和主键范围

    这种方法利用主键范围来实现随机获取记录,避免了全表扫描:

     
     
    1. SELECT * FROM testdb.test_tb1
    2. WHERE id >=
    3. (SELECT id FROM
    4. (SELECT id FROM testdb.test_tb1 ORDER BY RAND() LIMIT 1) AS t)
    5. LIMIT 1;

    218afed6af646a4cef082864eba09dd8.png

    方法三:使用JOIN及RAND()

    1. SELECT * FROM testdb.test_tb1 AS t1
    2. JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM testdb.test_tb1)) AS id) AS t2
    3. WHERE t1.id >= t2.id
    4. ORDER BY t1.id
    5. LIMIT 1;

    JOIN 和 RAND() 函数可以通过JOIN一个随机生成的ID来获取记录,这种方法比直接使用 ORDER BY RAND() 效率更高。

    其他方法:

    也可以通过动态SQL的方式进行获取

    1. SET @row_num = FLOOR(RAND() * (SELECT COUNT(*) FROM testdb.test_tb1));
    2. PREPARE STMT FROM 'SELECT * FROM testdb.test_tb1 LIMIT ?, 1';
    3. EXECUTE STMT USING @row_num;
    4. DEALLOCATE PREPARE STMT;

    不过如果表比较多,建议表记录数从统计信息中获取

    方法选择

    • 对于小表或需求不是十分严格的场景,可以使用 ORDER BY RAND() 方法,简单直接。

    • 对于大表,推荐使用第二种/第三种/第四种方法,通过估算行数或利用主键范围来提高性能。

    在选择具体方法时,需要根据实际数据量大小、性能需求以及具体场景来进行权衡和选择。合理选择适合情况的随机获取记录方法,可以有效提高数据库查询效率。

    通过以上方法和推荐,可以更好地在 MySQL 数据库中实现随机获取一条记录的功能,满足不同场景下的需求。如果您有任何问题或更多相关需求,欢迎留言讨论。

    437f228c004df9a39c41991f8740debe.png

    往期精彩回顾

    1.  MySQL高可用之MHA集群部署

    2.  mysql8.0新增用户及加密规则修改的那些事

    3.  比hive快10倍的大数据查询利器-- presto

    4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

    5.  PostgreSQL主从复制--物理复制

    6.  MySQL传统点位复制在线转为GTID模式复制

    7.  MySQL敏感数据加密及解密

    8.  MySQL数据备份及还原(一)

    9.  MySQL数据备份及还原(二)

    767030385a0afaf8e064b89c6d8cb0c4.png

    扫码关注     

    8be933122e2adbd6a55c90dcc2cce01c.jpeg

    d351129ef51120b107195bf45801c79a.png

    9694be02b54c89c3c63d8b15d0ce8b53.png

  • 相关阅读:
    分类模型评估的实际编码与逻辑回归可视化
    癫痫脑电信号基础知识
    Android图形-架构2
    【二分查找】【键值皆有序】1840最高建筑高度
    深信服SG上网优化管理系统存在任意文件读取漏洞 附POC
    【大数据环境安装】虚拟机安装操作
    Spring Boot的循环依赖问题
    分布式缓存
    深度解密Go底层Map
    《日期类》的模拟实现
  • 原文地址:https://blog.csdn.net/gjc592/article/details/137946586
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号