V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuewolf
V2EX  ›  PHP

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

  •  
  •   yuewolf · 2015-12-15 17:05:27 +08:00 · 2210 次点击
    这是一个创建于 3298 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的程序是有一个全局数组$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.我的这个函数是否有错,或者思路有错?

    谢谢!
    第 1 条附言  ·  2015-12-15 18:10:29 +08:00
    感谢 @sivacohan @tmkook

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

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

    再次感谢!太赞了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:27 · PVG 22:27 · LAX 06:27 · JFK 09:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.