› 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
brader
V2EX  ›  MySQL

从 mysql 随机查询 10 条数据

  •  
  •   brader · Mar 4, 2023 · 4006 views
    This topic created in 1315 days ago, the information mentioned may be changed or developed.
    有什么高效的实现方案吗?需要每次请求过来都是随机的 10 条返回
    14 replies  •  2023-03-04 22:52:12 +08:00
    Akitora
        1
    Akitora  
       Mar 4, 2023 via Android
    order by rand() limit 10
    falsemask
        2
    falsemask  
       Mar 4, 2023
    主键存 redis ,用 redis 的随机函数
    MMMMMMMMMMMMMMMM
        3
    MMMMMMMMMMMMMMMM  
       Mar 4, 2023
    线性同余吧,都常数,不占计算资源
    https://zh.wikipedia.org/zh-hans/%E7%BA%BF%E6%80%A7%E5%90%8C%E4%BD%99%E6%96%B9%E7%A8%8B

    SELECT * FROM (
    SELECT *, ((@seed := (@seed * 1103515245 + 12345) % (2 ^ 32)) / (2 ^ 32)) AS rand_num
    FROM table_name, (SELECT @seed := RAND()) AS seed_table
    ORDER BY rand_num
    ) AS random_table LIMIT 10;

    思路就这样,脏活 gpt 干的,看起来可以跑,自行验证

    a b m 可以自己调整,比如想更"随机"点,整个时间戳放进去之类的
    MMMMMMMMMMMMMMMM
        4
    MMMMMMMMMMMMMMMM  
       Mar 4, 2023
    哦,傻屌 gpt 果然不能直接信,他还是用了 rand()

    SELECT * FROM (
    SELECT *, (UNIX_TIMESTAMP() * (@seed := (@seed * UNIX_TIMESTAMP() + 1) % (2 ^ 31 - 1)) / (2 ^ 31 - 1)) AS rand_num
    FROM table_name, (SELECT @seed := UNIX_TIMESTAMP()) AS seed_table
    ORDER BY rand_num
    ) AS random_table LIMIT 10;

    这该对了
    auh
        5
    auh  
       Mar 4, 2023
    数据库里面只放 10 条记录
    makelove
        6
    makelove  
       Mar 4, 2023
    数据量大又要高效的话表加一列随机数列并加索引,可定期重置
    netnr
        7
    netnr  
       Mar 4, 2023
    先 count(*) 总行(可以缓存),程序生成 10+ 的随机 ID (范围在 1- count )
    如果自增是主键直接使用主键查询一条,然后 union all 10+ 的查询,这种方式性能应该是最好的
    查询 10+ 是考虑删除的情况,最终只返回 10 条

    不是自增可以 row_number 加一列序号,在 in ,性能不高
    LeegoYih
        8
    LeegoYih  
       Mar 4, 2023
    id 连续自增,应用服务随机生成 10 个数,用 in(...)查
    id 不连续,定时任务查库,随机放一些数据到 rediis ,然后接口从 redis 中随机取 10 条,和热门商品的思路一样
    kenvix
        9
    kenvix  
       Mar 4, 2023
    看你的表的情况
    ID 是否连续没有中断?
    是否可以接受一次随机查询得到的条目少于规定数目?
    是否要求高度随机?能否接受一块连续数据?
    vace
        10
    vace  
       Mar 4, 2023
    之前做过百万递增 ID 的用户中随机匹配 N 个,取 maxID ,随机生成 2N 个编号,取出后排除无效用户,一般一次就够了,如果不足,就递归再取一次合并。
    YVAN7123
        11
    YVAN7123  
       Mar 4, 2023
    @vace 取 2N 太厉害了
    ldyisbest
        12
    ldyisbest  
       Mar 4, 2023
    SELECT name
    FROM random AS r1 JOIN
    (SELECT CEIL(RAND() *
    (SELECT MAX(id)
    FROM random)) AS id)
    AS r2
    WHERE r1.id >= r2.id
    ORDER BY r1.id ASC
    LIMIT 1
    opengps
        14
    opengps  
       Mar 4, 2023
    先随机 id,再 where id in
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   939 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 20:03 · PVG 04:03 · LAX 13:03 · JFK 16:03
    ♥ Do have faith in what you're doing.