美文网首页
mysql 如何分批 读取数据

mysql 如何分批 读取数据

作者: 王镇_ee87 | 来源:发表于2021-08-02 11:29 被阅读0次

    遇到问题: 数据库里的数据要都跑一遍,全拿出来会卡爆缓存,还有一种是跑一个删一个。不行数据还要呢,或则复制一份,跑一个删一个。还是不行麻烦。
    理想状况:可以分批次取,一次取多少,记录下当前值。以后可以从当前值 ,接着取。

    `limit n,m`,表示起始值为n,然后取出m个记录。如果batch size为25,那么可以:
    `limit 25`,`limit 25,25`,limit`50,25` ... 依次下去,默认按照表的主键id升序排列,每次记录最大的已处理记录的主键id(这里基于了一个假设,此表是自增主键)
    
    如果此表没有新增记录,以上方法肯定没问题,但是如果此表有多个事务并发写入,可能会导致大id记录先于小id记录(两个事务)被处理,导致这部分小id记录永远也不会被处理到。
    
    问题中使用`post_date`其实也会有这个问题,无法保证`post_date`小的数据记录一定先于`post_date`大的记录先入库。insert时间早,id小的记录并不一定早于id大的记录插入至数据库。此完全取决于事务的提交时间。
    

    具体使用过程

    import multiprocessing
    
    def func(start, end):
        ip_list = MySql.xxxxxxxx(start, end)  # 126000
        print(ip_list)
    
        token, c = get_token()
    
        for ip in ip_list:
            # time.sleep(random.random()*10)
            get_tuan_info(token, c, ip)
    
    
    if __name__ == "__main__":
        pool = multiprocessing.Pool(processes=10)  # 创建4个进程
        results = []
        for msg in range(0, 10000, 1000):
            msg += 0
            results.append(pool.apply_async(func, (msg, 1000)))
        pool.close()  # 关闭进程池,表示不能再往进程池中添加进程,需要在join之前调用
        pool.join()  # 等待进程池中的所有进程执行完毕
    

    相关文章

      网友评论

          本文标题:mysql 如何分批 读取数据

          本文链接:https://www.haomeiwen.com/subject/yowdvltx.html