簡體   English   中英

Python:sqlite3-如何加快數據庫更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM