簡體   English   中英

使用 sqlalchemy 從 mysql 獲取大量數據的最佳方法是什么?

[英]What is the best way to fetch huge data from mysql with sqlalchemy?

我想處理存儲在 MySQL 中的超過 1000 萬條數據。 所以我寫這個是為了將 sql 分成幾個部分,然后將數據連接到后面的過程中。 如果count < 2 millions ,則效果很好。 但是當count上升時,sqlalchemy 消耗的時間會更長。

def fetch_from_sql(_sql_pat, count):
    """
    :param _sql_pat: SELECT id, data FROM a.b LIMIT {},{};
    :param count: how many data you want to fetch from mysql
    :return: generator
    """
    def gen_connect(sql):
        __engine = create_engine(db_config['SQLALCHEMY_DATABASE_URI'])
        with __engine.connect() as c:
            for row in c.execute(sql)
                yield row

    def gen_range(limit, step):
        if step > limit:
            yield 0, limit
        else:
            R = range(0, limit + 1, step)
            for idx, v in enumerate(R):
                if idx == 0:
                    yield v, step
                elif limit - v >= step:
                    yield v + 1, step
                else:
                    yield v + 1, limit - v

    sqls = [_sql_pat.format(start, step) for start, step in gen_range(count, 100000)]
    sources = (gen_connect(sql) for sql in sqls)
    for s in sources:
        for item in s:
            yield item
        gc.collect()

問題是為什么 sqlalchemy 花費越來越多的時間(我記錄了時間並在下面發布),以及處理這種情況的最佳方法是什么?

Dumped 10000 items, at 2016-10-08 11:55:33
Dumped 1000000 items, at 2016-10-08 11:59:23
Dumped 2000000 items, at 2016-10-08 12:05:07
Dumped 3000000 items, at 2016-10-08 13:54:05

這是因為您使用的是LIMIT / OFFSET ,因此當您指定偏移量 3000000 時,例如,數據庫必須跳過 3000000 條記錄。

執行此操作的正確方法是按某些索引列(例如主鍵id列)進行ORDER BY ,然后執行WHERE id > :last_fetched_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM