V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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
qmaker
V2EX  ›  MySQL

从数据库中捞取某个字段和为特定值的记录

  •  1
     
  •   qmaker · 2020-09-11 10:27:22 +08:00 · 1681 次点击
    这是一个创建于 1528 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设表 t_pay 中有一个字段为 amount,int 类型;现在需要从表中随机捞取一批记录,满足 2000>sum(amount)>10000,请问有没有什么好的方法

    9 条回复    2020-09-11 16:29:52 +08:00
    fuyufjh
        1
    fuyufjh  
       2020-09-11 10:46:15 +08:00
    是性能关键的场景吗?
    是 --> 用 stored procedure 把结果写到临时表,然后一次 select 读取
    不是 --> 每次 select limit 100,不够就再来一批
    qmaker
        2
    qmaker  
    OP
       2020-09-11 10:55:20 +08:00
    条件更正 2000>sum(amount)>10000 =》 20000>sum(amount)>10000
    qmaker
        3
    qmaker  
    OP
       2020-09-11 11:03:06 +08:00
    @fuyufjh 对实时性要求比较高,其实是有多个需求池,比如池 A 要求 sum(amount)≈10000,池 B 要求 sum(amount)≈80000,目前想到的办法是单个记录处理,每条记录取出后丢到某个池里,池蓄满了就接着续下个池,不过单个处理效率感觉还是比较低
    taogen
        4
    taogen  
       2020-09-11 11:09:26 +08:00 via iPhone
    1. 重复地随机取一批值,可以一次随机取 1 条或者 N 条,放入 list 中。直到 sum 满足条件或者 sum 大了。
    2. 若 sum 满足条件,直接返回。若 sum 大了,使用动态规划找到满足条件的子段和。
    3. 若动态规划找到有效解返回。若找不到有效解,清空 list,跳转到第 1 步。
    taogen
        5
    taogen  
       2020-09-11 11:14:34 +08:00 via iPhone
    你这个需求不一定有解,可能出现死循环。可以设置最大寻找次数,超过限制次数视为无解,提示暂无数据。
    kkeiko
        6
    kkeiko  
       2020-09-11 11:36:23 +08:00
    写入数据库的时候,把这个字段作为排序值,其他字段打包 json 写入 redis 的有序集合,redis key 根据一定的业务规则进行 hash,多分一些 key,每次从不同的 key 取出在此范围内的数据,多取一些,再合并,根据某个条件排个序,取前几位,做相对随机的效果。
    rockyou12
        7
    rockyou12  
       2020-09-11 11:39:33 +08:00
    先开张表记录下单条值的区间分布,然后去拿各个区间内对应的值?
    taogen
        8
    taogen  
       2020-09-11 12:19:14 +08:00
    @rockyou12 有两个问题。1. 区间的宽度如何设置? 2. 在 1 中设置的区间宽度下,如何选择区间找到有效解的算法是什么?
    rockyou12
        9
    rockyou12  
       2020-09-11 16:29:52 +08:00
    @taogen 区间好说,先根据业务取细一点,比如总区间是 0-2000,那就以 10 为间隔来取。然后通过类型 flink 这种流计算框架先预计算每个区间的总数,和记录该区间中有哪些值(可以放入 redis 的 hset ),然后整个分布就有了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2761 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:51 · PVG 15:51 · LAX 23:51 · JFK 02:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.