精易论坛

标题: mysql批量更新慢 [打印本页]

作者: weilaideren    时间: 2025-4-3 15:13
标题: mysql批量更新慢
.版本 2
.支持库 mysql

        ret = 连接MySql (“127.0.0.1”, “root”, “123456”, “data”, 3306)

    开始事务 (集_句柄)
    .计次循环首 (10000, i)
        执行SQL语句 (ret, lswb [i])
        程序_延时 (10, )
    .计次循环尾 ()
    bool = 保存事务 (ret)
    .' 如果真 (bool = 假)
        ' 回滚事务 (ret)
    .如果真结束
    断开MySql (ret)


语句是这样的
update data.accessdata set sczt='1' where orderSn='573539694961564'
循环越久速度越慢,有大佬知道什么原因吗
每次更新数据都是重新获取一次数据库句柄


作者: 禁回忆    时间: 2025-4-3 15:13
慢的优化有多个层面的。
首先你得看你orderSn有没有加索引,没加索引的话每次都是全表扫描,数据越多执行sql越慢。
其次你虽然使用了事务统一提交,但是每次都是单条更新,考虑拼接成如下格式
[SQL] 纯文本查看 复制代码
UPDATE data.accessdata
SET sczt = CASE orderSn
    WHEN '573539694961564' THEN '1'
    WHEN 'another_order' THEN '1'
    ...
END
WHERE orderSn IN ('573539694961564', 'another_order', ...);

通过[color=rgba(0, 0, 0, 0.9)]CASE WHEN合并多条更新为一条SQL

另外如果不考虑case when的话,一万次的提交会导致I/O压力和日志压力过大,换成每一千条提交一次。
延时就没必要加了,除非你自己有需要。
另外你说的每次更新都是重新获取一次数据库句柄,这个你的写法和你的描述没啥关系,没有在循环里每次都重新获取句柄,影响不大。你要是想连接复用的话就用数据库连接池。


补充内容 (2025-4-5 22:29):
易语言没有ORM框架,用的话就是字符串拼接sql,把n条更新sql合并为一条进行批量更新。避免全表扫描是数据库层面的事,连接池是管理、复用连接的事
作者: ltais    时间: 2025-4-3 17:40
每次都把记录集释放
作者: 奕本正经    时间: 2025-4-3 17:50
数据库句柄获取一次即可,全部执行完毕后再释放
作者: 飞翔的小弟弟    时间: 2025-4-3 20:35
你这个每次循环都要执行一次肯定慢,给你个例子自己琢磨一下。 能看明白就明白,不明白也没有办法!

1. 使用INSERT INTO语句:这是最常用的方法,用于向表中插入新记录。
语法:

INSERT INTO table_name (column1, column2, column3, …)
VALUES (value1, value2, value3, …);

示例:
假设我们有一个名为 e_student 的表,包含以下列:id,name,age,grade。我们可以使用以下语句向表中插入一条新记录:

INSERT INTO e_student (id, name, age, grade)
VALUES (1, ‘张三’, 6, ‘一年级’);

作者: weilaideren    时间: 2025-4-4 02:31
禁回忆 发表于 2025-4-3 22:47
慢的优化有多个层面的。
首先你得看你orderSn有没有加索引,没加索引的话每次都是全表扫描,数据越多执行sq ...

这个用易语言怎么实现呢
作者: weilaideren    时间: 2025-4-4 02:32
飞翔的小弟弟 发表于 2025-4-3 20:35
你这个每次循环都要执行一次肯定慢,给你个例子自己琢磨一下。 能看明白就明白,不明白也没有办法!

1. 使用I ...

插入没问题 是更新输入慢




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4