我有一个包含几亿行的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新手。我做错了什么?
答案 0 :(得分:1)
由于您通过键检索值,因此在这种情况下,键/值存储似乎更合适。关系数据库(包括Sqlite)绝对功能丰富,但你无法击败简单的键/值存储的性能。
有几种可供选择:
答案 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)