解决用Python对Sqlite进行数据更新比较慢的一种方法

Background

在使用sqlite数据库时,虽然数据库以文件形式存在,并且基本ubuntu默认安装sqlite数据库,使用起来非常方便。
但是由于数据库比较简单,操作效率比较低。
非常明显的就是数据更新,也就是update语句是非常非常非常慢!
(我不会告诉你我的一个百万级的数据更新跑了3天还没跑完。)

Method

  1. 关闭同步
  2. 显式开启事务
  3. COMMIT
    代码为:
def fastUpdate(sql, list_datas,db):
    '''
    sql: sql
    list_datas:data list to update or insert
    db : sqlite connection
    '''
    db.execute("PRAGMA synchronous=OFF") #关闭同步
    db.execute("BEGIN TRANSACTION") #显式开启事务
    cur = db.cursor()
    cur.executemany(sql, list_datas)
    db.execute("COMMIT") #COMMIT
    cur.close()

Evaluation

相比普通的更新方式,分别更新500,000条数据,记录执行需要时间。

import sqlite3
from datetime import datetime

def fastUpdate(sql, list_datas,db):
    '''
    sql: sql
    list_datas:data list to update or insert
    db : sqlite connection
    '''
    db.execute("PRAGMA synchronous=OFF")
    db.execute("BEGIN TRANSACTION")
    cur = db.cursor()
    cur.executemany(sql, list_datas)
    db.execute("COMMIT")
    cur.close()


def slowUpdate(sql, list_datas, db):
    '''
    sql: sql
    list_datas:data list to update or insert
    db : sqlite connection
    '''
    cur = db.cursor()
    cur.executemany(sql, list_datas)
    db.commit()
    cur.close()

db = sqlite3.connect("test.sqlite")

#data generation
To_Insert_data = []
for i in range(1000000):
    To_Insert_data.append((i, i+123,i))

sql = "update test set id=?,num=? where id=?"

t1 = datetime.now()
slowUpdate(sql, To_Insert_data[0:500000], db)
t2 = datetime.now()
print("Slow Op time: %s" % (t2-t1))

t3 = datetime.now()
fastUpdate(sql, To_Insert_data[500000:], db)
t4 = datetime.now()
print("Fast Op time: %s" % (t4-t3))
db.close()
             

执行三次,时间统计为:

root@b26d5e2d88ae:/test# python FastInsertSqlite.py
Slow Op time: 0:00:02.372968
Fast Op time: 0:00:01.687531
root@b26d5e2d88ae:/test# python FastInsertSqlite.py
Slow Op time: 0:00:02.382283
Fast Op time: 0:00:01.508636
root@b26d5e2d88ae:/test# python FastInsertSqlite.py
Slow Op time: 0:00:02.371668
Fast Op time: 0:00:01.692238

Conclusion

使用这种方式,时间提升28.8%左右。(这么少?)

Reference

https://stackoverflow.com/questions/17867605/performance-of-insert-with-python-and-sqlite3

你可能感兴趣的:(python用法)