gpt4 book ai didi

python - 提高sqlite查询速度

转载 作者:行者123 更新时间:2023-12-03 00:01:34 26 4
gpt4 key购买 nike

我有一个要在数据库中更新的数字列表(实际上是百分比)。查询非常简单,我在代码中的某个位置获取项目的 ID,然后使用数字列表更新数据库中的这些项目。看我的代码:

start_time = datetime.datetime.now()

query = QtSql.QSqlQuery("files.sqlite")
for id_bdd, percentage in zip(list_id, list_percentages):
request = "UPDATE papers SET percentage_match = ? WHERE id = ?"
params = (percentage, id_bdd)

query.prepare(request)

for value in params:
query.addBindValue(value)

query.exec_()

elsapsed_time = datetime.datetime.now() - start_time
print(elsapsed_time.total_seconds())

生成list_percentages需要1秒,将所有百分比写入数据库需要2分多钟。我使用sqlite作为数据库,数据库中有大约7000个项目。查询花费这么多时间正常吗?如果不行,有没有办法优化?

编辑:与std库中的sqlite3模块的比较:

bdd = sqlite3.connect("test.sqlite")
bdd.row_factory = sqlite3.Row
c = bdd.cursor()

request = "UPDATE papers SET percentage_match = ? WHERE id = ?"

for id_bdd, percentage in zip(list_id, list_percentages):
params = (percentage, id_bdd)
c.execute(request, params)

bdd.commit()
c.close()
bdd.close()

我认为 QSqlQuery 在每个循环圈提交更改,而 sqlite3 模块允许在末尾同时提交所有不同的查询。

对于相同的测试数据库,QSqlQuery 需要约 22 秒,而“正常”查询需要约 0.3 秒。我不敢相信这只是一个性能问题,我一定做错了什么。

最佳答案

您需要启动事务,并在循环后提交所有更新。

未经测试,但应该接近:

start_time = datetime.datetime.now()

# Start the transaction time
QtSql.QSqlDatabase.transaction()

query = QtSql.QSqlQuery("files.sqlite")
for id_bdd, percentage in zip(list_id, list_percentages):
request = "UPDATE papers SET percentage_match = ? WHERE id = ?"
params = (percentage, id_bdd)

query.prepare(request)

for value in params:
query.addBindValue(value)

query.exec_()

# commit changues
if QtSql.QSqlDatabase.commit():
print "updates ok"

elsapsed_time = datetime.datetime.now() - start_time
print(elsapsed_time.total_seconds())

另一方面,这个问题可能是数据库性能问题,尝试在id字段上创建索引:https://www.sqlite.org/lang_createindex.html

您将需要直接访问数据库。

create index on papers (id);

关于python - 提高sqlite查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28477099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com