Python:sqlite3 - 如何加快数据库的更新

时间:2017-07-28 23:56:05

标签: python database sqlite sql-update

我有一个数据库,我将其作为.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)

(new_income_i的值对于每个i是不同的)。 这需要花费大量时间,即使数据集不是巨大的。有没有办法加快数据库的更新?我应该使用除sqlite3之外的其他内容吗?或者我应该而不是将数据库存储为.db文件存储在内存中(使用sqlite3.connect(":memory:"))?

1 个答案:

答案 0 :(得分:2)

每个UPDATE语句必须扫描整个表以查找与名称匹配的任何行。

name列上的索引会阻止此操作并使搜索速度更快。 (请参阅Query PlanningHow does database indexing work?

但是,如果name列不唯一,则该值甚至不适合查找单个行:每个具有重复名称的更新都将修改具有相同名称的所有行。因此,您应该使用id列来标识要更新的行;作为主键,此列已有一个隐式索引。