zoukankan      html  css  js  c++  java
  • mysql 如何分批 读取数据

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

    `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主从复制设置
    转:CentOS---网络配置详解
    Linux-vim学习入门
    Linux图形界面与字符界面切换
    转:MySQL表名不区分大小写
    CentOS6.5_x86安装Mysql5.5.49
    Linux的环境变量设置和查看
    Linux防火墙的关闭和开启
    Linux command not found 问题解释
  • 原文地址:https://www.cnblogs.com/wzbk/p/15090021.html
Copyright © 2011-2022 走看看