我有一个数据库,作为.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的新收入值不同)。
这需要大量的时间,即使数据集不是很大。有没有办法加快数据库的更新?我应该用别的东西吗?或者应该将数据库存储为.db文件而不是存储在内存中(使用sqlite3)?

最佳答案

每个UPDATE语句都必须扫描整个表以查找与名称匹配的任何行。
name列上的索引可以防止这种情况,并使搜索速度更快。(参见Query PlanningHow does database indexing work?
但是,如果name列不唯一,则该值甚至不适合查找单个行:使用重复名称的每次更新都将修改具有相同名称的所有行。因此,应该使用id列来标识要更新的行;作为主键,该列已经有一个隐式索引。

07-28 14:00
查看更多