开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 192|回复: 6
收起左侧

[完成] mysql批量更新慢

 关闭 [复制链接]
结帖率:78% (14/18)
发表于 2025-4-3 15:13:25 | 显示全部楼层 |阅读模式   重庆市重庆市
10精币
.版本 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'
循环越久速度越慢,有大佬知道什么原因吗
每次更新数据都是重新获取一次数据库句柄

最佳答案

查看完整内容

慢的优化有多个层面的。 首先你得看你orderSn有没有加索引,没加索引的话每次都是全表扫描,数据越多执行sql越慢。 其次你虽然使用了事务统一提交,但是每次都是单条更新,考虑拼接成如下格式[mw_shl_code=sql,true]UPDATE data.accessdata SET sczt = CASE orderSn WHEN '573539694961564' THEN '1' WHEN 'another_order' THEN '1' ... END WHERE orderSn IN ('573539694961564', 'another_order', ...);[/mw_shl_cod ...

签到天数: 13 天

发表于 2025-4-3 15:13:26 | 显示全部楼层   山东省*
慢的优化有多个层面的。
首先你得看你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合并为一条进行批量更新。避免全表扫描是数据库层面的事,连接池是管理、复用连接的事

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:100% (38/38)

签到天数: 16 天

发表于 2025-4-3 17:40:29 | 显示全部楼层   北京市北京市
每次都把记录集释放
回复

使用道具 举报

结帖率:100% (10/10)

签到天数: 11 天

发表于 2025-4-3 17:50:27 | 显示全部楼层   广东省东莞市
数据库句柄获取一次即可,全部执行完毕后再释放
回复

使用道具 举报

结帖率:33% (1/3)

签到天数: 2 天

发表于 2025-4-3 20:35:40 | 显示全部楼层   河北省石家庄市
你这个每次循环都要执行一次肯定慢,给你个例子自己琢磨一下。 能看明白就明白,不明白也没有办法!

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, ‘一年级’);
回复

使用道具 举报

结帖率:78% (14/18)

签到天数: 12 天

 楼主| 发表于 2025-4-4 02:31:14 | 显示全部楼层   重庆市重庆市
禁回忆 发表于 2025-4-3 22:47
慢的优化有多个层面的。
首先你得看你orderSn有没有加索引,没加索引的话每次都是全表扫描,数据越多执行sq ...

这个用易语言怎么实现呢
回复

使用道具 举报

结帖率:78% (14/18)

签到天数: 12 天

 楼主| 发表于 2025-4-4 02:32:36 | 显示全部楼层   重庆市重庆市
飞翔的小弟弟 发表于 2025-4-3 20:35
你这个每次循环都要执行一次肯定慢,给你个例子自己琢磨一下。 能看明白就明白,不明白也没有办法!

1. 使用I ...

插入没问题 是更新输入慢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表