2012-10-25 197 views
1

我有幾百萬元的行SQLite表:如何加快Python中的sqlite3查詢速度?

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 

這裏,ids是一個可能有數萬個元素的列表。形成t1並不需要很長時間(即每秒約75K插入)。以我所做的方式查詢t1是不可接受的慢(即10秒內〜1K查詢)。

我完全不熟悉SQL。我究竟做錯了什麼?

+1

「我有一個數億行的sqlite表」。除非你絕對需要堅持SQLite,否則你應該放棄它並使用真正的數據庫。 SQLite並不是要有效處理這些數據量。 – kgr

+0

有趣,有什麼建議嗎?我最初只是使用字典,但事實證明,我將有太多的數據,以適應內存。我認爲SQLite是最好的選擇。 – dranxo

+0

我不想開始通常的爭論,但任何MySQL,PostgreSQL,MSSQL,Oracle都應該做得很好。重要的是,他們允許您調整其性能特徵,並將負載分散到多臺機器上。簡而言之,您擁有企業級數據量,因此您應該使用企業級數據庫引擎。如果你在Linux上,我推薦使用PostgreSQL,我用它來處理大型數據集,並且它工作正常。還有一本關於微調的好書 - http://www.amazon.com/PostgreSQL-High-Performance-Gregory-Smith/dp/184951030X(無隸屬關係) – kgr

回答

1

既然你通過它們的鍵檢索值,這似乎是一個鍵/值存儲將是在這種情況下更合適。關係數據庫(包括Sqlite)絕對是功能豐富的,但是你無法擊敗簡單鍵/值存儲的性能。

有以下幾種可供選擇:

  • Redis: 「先進的key-value存儲」,速度非常快,在內存中運行優化
  • Cassandra:極高的性能,可擴展性,使用的多高知名度的網站
  • MongoDB:功能豐富,試圖成爲「中間地帶」的關係和NoSQL之間(他們已經開始提供free online classes

還有many, many more

0

你應該讓一個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,而不是在DB不會出現一試。如果你想知道哪個ID是不會在結果中,你可以這樣做:

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