如何提高更新数据库某字段的效率

2015-12-15 17:05:27 +08:00
 yuewolf
我的程序是有一个全局数组$arrTmp ,不断接纳符合条件的数组(状态和 ID ),有三种:( 1,id),(2,id),(3,id)。
当 count($arrTmp)>300 的时候,执行如下函数用 medoo 这个数据库类提交 update 到 sqlite 数据库中,然后清空$arrTmp ,继续接纳新的。

function updateSqlite($dbfile,$arr){
$db = new medoo([
'database_type' => 'sqlite',
'database_file' => $dbfile.'.db3'
]);
$db->pdo->beginTransaction();
$value = array();
foreach($arr as $value){
$db->update("Content",["status"=>$value['do']],["id"=>$value['id']]);
}
/* Commit the changes */
$db->pdo->commit();
}

等于是提交了 300 条记录更改,用时 6-10 秒。如果是 insert 的话,一次 500 条都很快完成。

所以,想请教一下:
1.这个速度是正常的吗?
2.能更快吗?
3.我的这个函数是否有错,或者思路有错?

谢谢!
2209 次点击
所在节点    PHP
12 条回复
yuewolf
2015-12-15 17:41:16 +08:00
检查了一遍,貌似描述不算乱,态度语气也没问题,怎么大神都不留个只言片语呢? 555555
Daniel65536
2015-12-15 17:45:23 +08:00
@yuewolf 因为才过了 40 分钟
SparkMan
2015-12-15 17:47:28 +08:00
300 条记录更改,用时 6-10 秒 这个耗时肯定不正常
tmkook
2015-12-15 17:48:14 +08:00
数据库记录有多少?是否加索引?
sivacohan
2015-12-15 17:49:00 +08:00
1 ,数据库用 SQLite 的话是比较慢的。官网有说明,它的目标是替换 fseek 。如果想快的话,可以考虑 SSD 或者直接扔内存里。
2 ,可以考虑把 300 个 update 合并为 3 个。即按照 3 个 status 分类, where 后使用 in ( id1 , id2...)可能会有一定速度提升。
sivacohan
2015-12-15 17:51:00 +08:00
另外检查一下 SQLite 版本,看看这个版本 transcation 实现的情况。我记得 SQLite 实现的是不完整的。
yuewolf
2015-12-15 17:51:25 +08:00
@tmkook 数据库记录有 50 多万条,没有加索引,只有 id(不是自增的)和 status (值就是 0 、 1 、 2 、 3 )俩字段。
tmkook
2015-12-15 17:55:16 +08:00
@yuewolf 50 万没索引 300 多个请求这速度算正常的 @sivacohan 已经说的很详细了,把索引加上再尝试合并请求,最方便的是换 SSD
yuewolf
2015-12-15 17:55:32 +08:00
@sivacohan 用 where in 是我最初的考虑。后来发现用 Transaction 后挨个 insert 五百条上千条速度飞快,就去掉了那种合并的形式,结果 update 却慢了许多。

SQLite 是 3 ,很有可能是不完整,我再查一遍,感谢指点。
yuewolf
2015-12-15 17:57:35 +08:00
@tmkook 因为没有索引,所以 update 时候做条件判断变慢了对吗?而 insert 是没有影响的。我觉得这个应该就是问题所在。
solupro
2015-12-15 17:59:40 +08:00
REPLACE INTO ?!
yuewolf
2015-12-15 18:05:31 +08:00
@sivacohan
@tmkook 感谢两位大牛指点。的确是没有索引的缘故,加上索引以后,和 insert 时候一样,完全感觉不到一点停滞。

再次感谢!太赞了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243732

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX