簡體   English   中英

如何在Python中加快sqlite3查詢?

[英]How do I speed up my sqlite3 queries in Python?

我有一個包含幾億行的sqlite表:

sqlite> create table t1(id INTEGER PRIMARY KEY,stuff TEXT );

我需要通過其整數主鍵查詢該表數億次。 我的代碼:

conn = sqlite3.connect('stuff.db')
with conn:
    cur = conn.cursor()
    for id in ids:
        try:
            cur.execute("select stuff from t1 where rowid=?",[id])
            stuff_tuple = cur.fetchone()
            #do something with the fetched row
        except:
            pass #for when id is not in t1's key set

在此,id是一個可能包含成千上萬個元素的列表。 形成t1並不需要很長時間(即每秒插入約75K)。 用我做過的方式查詢t1的速度實在令人難以接受(即10秒鍾內約有1K次查詢)。

我對SQL完全陌生。 我究竟做錯了什么?

由於您要通過鍵檢索值,因此在這種情況下,鍵/值存儲似乎更合適。 關系數據庫(包括Sqlite)肯定具有豐富的功能,但是您無法擊敗簡單的鍵/值存儲的性能。

有幾種可供選擇:

  • Redis :“高級鍵值存儲”,非常快,針對內存操作進行了優化
  • Cassandra :極高的性能,可伸縮性,供多個知名站點使用
  • MongoDB :功能豐富,試圖成為關系型和NoSQL之間的“中間地帶”(他們已經開始提供免費的在線類

還有很多很多

您應該改用一個sql調用,應該更快

conn = sqlite3.connect('stuff.db')
with conn:
    cur = conn.cursor()

    for row in cur.execute("SELECT stuff FROM t1 WHERE rowid IN (%s)" % ','.join('?'*len(ids)), ids):
        #do something with the fetched row
        pass 

您不需要嘗試,因為不會顯示數據庫中沒有的ID。 如果您想知道結果中沒有哪些ID,可以執行以下操作:

ids_res = set()
for row in c.execute(...):
    ids_res.add(row['id'])
ids_not_found = ids_res.symmetric_difference(ids)

暫無
暫無

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

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