Python:sqlite3-如何加快数据库更新
我有一个数据库,作为Python:sqlite3-如何加快数据库更新,python,database,sqlite,sql-update,Python,Database,Sqlite,Sql Update,我有一个数据库,作为.db文件存储在磁盘上。我使用sqlite3实现了管理该数据库所需的所有功能。但是,我注意到更新表中的行需要花费大量时间。我的数据库当前有608042行。数据库有一个表,我们称之为Table1。此表由以下列组成: id | name | age | address | job | phone | income (id在将行插入数据库时自动生成值)。 在读取所有行之后,我对行中的值执行一些操作(用于预测收入的ML算法),接下来我必须更新(对于每行)收入的值(因此,对于6080
.db
文件存储在磁盘上。我使用sqlite3
实现了管理该数据库所需的所有功能。但是,我注意到更新表中的行需要花费大量时间。我的数据库当前有608042行。数据库有一个表,我们称之为Table1
。此表由以下列组成:
id | name | age | address | job | phone | income
(id
在将行插入数据库时自动生成值)。
在读取所有行之后,我对行中的值执行一些操作(用于预测收入的ML算法),接下来我必须更新(对于每行)收入的值(因此,对于608042行中的每一行,我执行SQL更新
操作)。
为了更新,我正在使用以下函数(从我的类复制):
我为数据库中注册的每个人调用这个函数
for each i out of 608042 rows:
update_row(new_income_i, i.name)
(每个i的新收入值不同)。
这需要大量的时间,即使数据集不是巨大的。有没有办法加快数据库的更新速度?我应该使用sqlite3以外的东西吗?或者我应该将数据库存储为.db文件而不是将其存储在内存中(使用
sqlite3.connect(“:memory:”)
)?每个UPDATE语句都必须扫描整个表以查找与名称匹配的任何行
name
列上的索引可以防止这种情况,并使搜索速度更快。(见和)
但是,如果
name
列不是唯一的,则该值甚至不适合查找单个行:每个具有重复名称的更新都会修改具有相同名称的所有行。因此,您应该使用id
列来标识要更新的行;作为主键,此列已经有一个隐式索引。您是否尝试在列name
上创建索引,或者甚至使用id
更新这些记录?如果name
对每一行都是唯一的,您甚至可以尝试在name
列上创建一个唯一的索引,但我认为使用id
应该很快,因为它不是字符串而是数字。@id是唯一的,名称不一定是唯一的。请您多告诉我一点,这个索引是怎么做的以及它能帮助什么?看看“数据库索引是如何工作的”?考虑使用支持存储过程的数据库,这样您就可以实现ML算法作为一个存储过程,它可以应用在一个更新语句中,不必将所有数据移到Python中,然后一次将结果移回一行。@rd_nielsen您可以推荐任何支持存储过程的数据库或任何我可以阅读的教程/博客文章吗?谢谢您的解释!
for each i out of 608042 rows:
update_row(new_income_i, i.name)