首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: sqlite3 -如何加速数据库更新

Python: sqlite3 -如何加速数据库更新
EN

Stack Overflow用户
提问于 2017-07-29 07:56:05
回答 1查看 997关注 0票数 1

我有一个数据库,我将它作为.db文件存储在我的磁盘上。我使用sqlite3实现了管理此数据库所需的所有功能。但是,我注意到更新表中的行需要花费大量的时间。我的数据库目前有608042行。数据库有一个表-让我们称它为Table1。此表由以下列组成:

代码语言:javascript
复制
id | name | age | address | job | phone | income

(id值是在向数据库插入一行时自动生成的)。在读入所有行之后,我对这些行的值执行了一些操作(ML算法,用于预测收入),接下来,我必须(针对每行)更新income的值(因此,对于608042行中的每一行,我都执行SQL update操作)。为了更新,我使用以下函数(从我的类中复制):

代码语言:javascript
复制
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()

我为每个在数据库中注册的人调用这个函数。

代码语言:javascript
复制
for each i out of 608042 rows:
  update_row(new_income_i, i.name)

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

EN

回答 1

Stack Overflow用户

发布于 2017-07-29 15:29:59

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

name列上建立索引可以防止这种情况,并使搜索速度更快。(参见Query PlanningHow does database indexing work?)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45383883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档