› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
wbd31
V2EX  ›  MySQL

mysql 随机返回多条记录的问题

  •  
  •   wbd31 · Jul 12, 2021 · 3160 views
    This topic created in 1906 days ago, the information mentioned may be changed or developed.

    我看到的解决方案有两种

    一种 order by rand() 可能存在性能问题

    一种 SELECT id FROM table WHERE id >= FLOOR(RAND() * 1000) LIMIT 10;

    第二种方式有点迷惑,为什么返回的不是 10 条连续的记录,而是 10 条随机记录?而且返回的结果不是那么随机的

    8 replies  •  2021-07-13 10:15:50 +08:00
    ch2
        1
    ch2  
       Jul 12, 2021
    没有排序就这样
    eric96
        2
    eric96  
       Jul 12, 2021
    第二种方式返回的数据是连续的,除非你表里的 id 本身不连续。
    可以看下 mysql45 讲的 17 章,如何返回随机的数据
    myd
        3
    myd  
       Jul 12, 2021   ❤️ 1
    第二种方式返回的数据是不连续的,因为每扫描一行数据都会执行一次 FLOOR()和 RAND(),你可以把函数改成 sleep 验证一下。
    Duolingo
        4
    Duolingo  
       Jul 12, 2021 via Android
    所以第二种到底是不是连续的。。。
    myd
        5
    myd  
       Jul 12, 2021
    试了一下,返回的结果确实不是很随机。
    1. 结果中 id 是递增的,因为扫描顺序也是根据 id 的顺序。
    2. 其次,前面的记录被返回的几率更大,有 limit 的存在,id 小的记录满足 where 条件了就不会继续往后扫描了。
    alvin2ye
        6
    alvin2ye  
       Jul 12, 2021
    用 id > rand limit 1, union 4 条
    xuanbg
        7
    xuanbg  
       Jul 12, 2021
    连续不连续其实无所谓,换个角度,n 条记录你可以把它当做一个集合。关键是这个集合要随机。
    我的做法是总条数-n 取一个随机数,然后获取连续的 n 条记录。最简单,也最高效。
    xiang0818
        8
    xiang0818  
       Jul 13, 2021
    SELECT id FROM mbo_user WHERE id >= FLOOR(RAND() * 1000) LIMIT 10;
    每次执行结果一样,这个查询是幂等的?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   894 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 18:55 · PVG 02:55 · LAX 11:55 · JFK 14:55
    ♥ Do have faith in what you're doing.