我有一个数据库,我将它作为.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之外的其他东西吗?或者我是否应该(使用sqlite3.connect(":memory:"))将数据库存储在内存中,而不是将其存储为.db文件?
发布于 2017-07-29 15:29:59
每个UPDATE语句都必须扫描整个表,以查找与名称匹配的任何行。
在name列上建立索引可以防止这种情况,并使搜索速度更快。(参见Query Planning和How does database indexing work?)
但是,如果name列不是惟一的,那么该值甚至不适合查找单独的行:每次具有重复名称的更新都会修改具有相同名称的所有行。因此,您应该使用id列来标识要更新的行;作为主键,该列已经有一个隐式索引。
https://stackoverflow.com/questions/45383883
复制相似问题