Python性能:大列表搜索 vs sqlite
假设我有一个数据库表,这个表有三列:id
、field1
和 field2
。这个表里可能有100到100,000行数据。我有一个Python脚本,应该往这个表里插入10到1,000行新数据。但是,如果新的field1
已经在表里存在,就应该执行UPDATE
操作,而不是INSERT
。
那么,下面哪种方法更高效呢?
- 先执行一个
SELECT field1 FROM table
(field1
是唯一的),把结果存到一个列表里。然后,对于每一行新数据,使用list.count()
来判断是要INSERT
还是UPDATE
。 - 对于每一行,执行两个查询。首先,
SELECT count(*) FROM table WHERE field1="foo"
,然后再决定是INSERT
还是UPDATE
。
换句话说,是执行n+1个查询并在列表中搜索更高效,还是执行2n个查询让sqlite来搜索更高效呢?
4 个回答
0
我想用Python的字典来查找东西会比用Python的列表快得多。(只需要把值设为0,实际上你并不需要这些值,希望0能节省空间。)
至于更大的问题,我也很好奇。:)
1
我对sqlite不太熟悉,但一般来说可以这样处理:
如果在field1
上有一个唯一索引,也就是说这个字段的值不能重复,那么当你试图插入一个已经存在的值时,系统应该会报错。如果插入失败了,那就可以选择更新这个值。
伪代码:
try
{
insert into table (value1, value2)
}
catch(insert fails)
{
update table set field2=value2 where field1=value1
}
9
如果我理解你的问题没错的话,听起来你可以直接使用SQLite自带的冲突处理机制。
假设你在field1字段上设置了唯一性约束,你可以简单地使用:
INSERT OR REPLACE INTO table VALUES (...)
以下的语法也是可以的(效果是一样的):
REPLACE INTO table VALUES (...)
编辑:我意识到我并没有真正回答你的问题,只是在提供一个可能更快的替代方案。