2010-08-04 84 views
2

可以說我有一個數據庫表,它由三列組成:id,field1field2。這張表可能有100到100000行之間的任何地方。我有一個python腳本,應該在此表中插入10-1,000個新行。但是,如果表中已存在新的field1,它應該執行UPDATE,而不是INSERTPython性能:搜索大列表vs sqlite

以下哪種方法更有效?

  1. 做一個SELECT field1 FROM tablefield1是唯一的),並將其存儲在列表中。然後,對於每個新行,請使用list.count()來確定是INSERT還是UPDATE
  2. 對於每一行,運行兩個查詢。首先,SELECT count(*) FROM table WHERE field1="foo"然後是INSERTUPDATE

換句話說,執行n + 1個查詢和搜索列表,或者2n個查詢並獲得sqlite搜索效率更高嗎?

+0

我不確定我是否理解「計數」的必要性 - 您究竟計算了什麼?你只需要檢查存在,對吧? (因爲每個'field1'值只能有一個..) – tzaman 2010-08-04 10:30:22

+0

好點,我想它可以簡化爲'SELECT 1 FOM table WHERE field1 =「foo」'。 – 2010-08-04 13:51:12

回答

9

如果我正確理解你的問題,它似乎可以簡單地使用SQLite內置的衝突處理機制。

假設您有field1的UNIQUE約束,你可以簡單的使用:

INSERT OR REPLACE INTO table VALUES (...) 

下面的語法還支持(相同的語義):

REPLACE INTO table VALUES (...) 

編輯:我知道我是沒有真正回答你的問題,只是提供一個更快的替代解決方案。

+0

+1,我正要發佈這個自己。 – tzaman 2010-08-04 10:35:20

+0

很酷,謝謝!虛擬+1,我今天沒票了。嘆息:) – sarnold 2010-08-04 10:43:21

+0

很好的答案!偉大的功能。令人遺憾的是它不在SQL-92規範中,所以* all * RLDB的實現:) – invert 2010-08-04 11:29:49

0

我想象一下,使用python字典可以比使用python列表更快地進行搜索。 (只需將值設置爲0,您不需要它們,並希望'0'存儲緊湊。)

至於更大的問題,我也很好奇。 :)

+2

或者只是將它們存儲在'set'而不是'dict'中... – tzaman 2010-08-04 10:29:09

+0

感謝tzaman,沒有意識到集合是快速的:) – sarnold 2010-08-04 10:42:46

1

我不熟悉的源碼,但像這樣的一般方法應該工作:

如果有上field1唯一索引,並且你要插入一個值已經存在,你應該得到一個錯誤。如果插入失敗,則使用更新。

僞代碼:

try 
{ 
    insert into table (value1, value2) 
} 
catch(insert fails) 
{ 
    update table set field2=value2 where field1=value1 
} 
0

你似乎與橘子進行比較蘋果。

只有當您的數據符合進程的地址空間時,python列表纔有用。一旦數據變大,這將不再起作用。

此外,python列表沒有編入索引 - 因爲你應該使用字典。

最後,python列表是非持久性的 - 當進程退出時它會被遺忘。

你怎麼能比較這些?