如何在Python中加速我的sqlite3查询?

时间:2012-10-25 01:12:34

标签: python sqlite

我有一个包含几亿行的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

这里,ids是一个可能有数万个元素的列表。形成t1并不需要很长时间(即每秒约75K插入)。以我的方式查询t1的速度慢得令人无法接受(即在10秒内查询~1K)。

我是SQL新手。我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于您通过键检索值,因此在这种情况下,键/值存储似乎更合适。关系数据库(包括Sqlite)绝对功能丰富,但你无法击败简单的键/值存储的性能。

有几种可供选择:

  • Redis:“高级键值存储”,速度非常快,针对内存操作进行了优化
  • Cassandra:性能极高,可扩展,可供多个高端网站使用
  • MongoDB:功能丰富,试图在关系和NoSQL之间成为“中间地带”(他们已经开始提供free online classes

还有many, many more

答案 1 :(得分: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不会显示。如果您想知道结果中没有哪些ID,您可以执行以下操作:

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