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()  # 等待進程池中的所有進程執行完畢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM