[英]Python: sqlite3 - how to speed up updating of the database
我有一個數據庫,該數據庫以.db
文件的形式存儲在磁盤上。 我使用sqlite3
實現了管理該數據庫所需的所有功能。 但是,我注意到更新表中的行需要大量時間。 我的數據庫當前有608042行。 該數據庫有一個表-我們稱之為Table1
。 該表包括以下列:
id | name | age | address | job | phone | income
(將一行插入數據庫時自動生成id
值)。 讀完所有行后,我對行中的值執行一些操作(用於預測收入的ML算法),然后我必須(針對每一行)更新income
值(因此,針對608042行中的每一行)我執行SQL update
操作)。 為了更新,我使用以下功能(從我的課程中復制):
def update_row(self, new_value, idkey):
update_query = "UPDATE Table1 SET income = ? WHERE name = ?" %
self.cursor.execute(update_query, (new_value, idkey))
self.db.commit()
我為在數據庫中注冊的每個人調用此函數。
for each i out of 608042 rows:
update_row(new_income_i, i.name)
(每個i的new_income_i的值都不同)。 即使數據集不是很大,也要花費大量時間。 有什么辦法可以加快數據庫的更新? 我是否應該使用sqlite3
以外的其他工具? 還是應該代替將數據庫存儲為.db文件而是將其存儲在內存中(使用sqlite3.connect(":memory:")
)?
每個UPDATE語句必須掃描整個表以查找與該名稱匹配的任何行。
name
列上的索引可以防止這種情況並使搜索更快。 (請參閱查詢計划和數據庫索引如何工作? )
但是,如果name
列不是唯一的,則該值甚至都不適合查找單獨的行:每次使用重復名稱進行的更新都會修改具有相同名稱的所有行。 因此,您應該使用id
列來標識要更新的行; 作為主鍵,此列已具有隱式索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.