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 如何分批 读取数据

上一篇:数据库多表查询


下一篇:android AlertDialog.Builder