sql在update更新时如何快速且大批量的更新数据

等等,之前的项目中使用了merge语句。
那天下午三点,我坐在电脑前工作。
屏幕上是数据库界面,我只是点击了合并按钮。
我记得目的是为了将销售数据与产品表同步。
源表是 staging_sale,目标表是 products。

MERGEINTOproductsASpUSINGstaging_saleASsON(p.product_id=s.product_id)WHENMATCHEDTHENUPDATESETp.sale=s.sale,p.last_updated=CURRENT_TIMESTAMP() WHENNOTMATCHEDTHENINSERT(p.product_id,p.sale,p.last_updated)VALUES(s.product_id,s.sale,CURRENT_TIMESTAMP());
当时,我觉得这个语句确实是分开的。
不需要两次更新和一次插入,可以在一行中完成。
但是在调试的时候卡住了好久。
最后发现ON条件下的product_id为null,数据库卡在那里。
查了一会日志,在一个角落的警报里看到,凌晨的备份任务暂时锁定了几张桌子。

等等,还有一件事。
后来我写了一段代码,在合并之前检查是否有空值,然后再次运行,就可以了。
突然我想,如果直接用这两个命令是不是会更快一些呢?或者,这种合并在某些数据库引擎中是否特别慢?

男人要慢,SQL要快:记一次慢SQL优化

上星期。
我的这位朋友。
这种缓慢的 SQL 优化。
真的很有用。

2 02 3 我查了一下。
请求时间。
从 1 1 秒开始。
最多 0.8 秒。

很棒1 0次。
就是这样。

分析是这样写的。
查询速度慢。
定位在1 1 秒。
这肯定很慢。

原始 SQL。
WHERE 条件和排序。
排序是按金额降序进行的。
还有一个升序的 create_time 顺序。

该表有两个索引。
(状态,to_account_id)和(状态,from_account_id)。

但是 amount 和 create_time 没有被覆盖。
这就是问题所在。

查看执行计划。
使用文件排序。
不使用索引。
需要额外的排序。

先检查一下数据。
贴上排序印章。
它被毁了。

影响因素。
排序字段很长。
很多数据。
邮票很小。
反正。

但是对文件进行排序是一个陷阱。

优化部门。
调整指数结构。

有什么问题吗?索引不覆盖排序字段。
我得把手表拿回来。

解决方案。
添加公共索引。
(状态、金额 DESC、创建时间 ASC)。

覆盖指数。
包含WHERE和排序。
减少工作台周转次数。

排序方向必须匹配。
金额DESC。
创建时间 ASC。

效果。
优化后。
附加字段。
使用索引。

说明:使用覆盖指数。
无需对文件进行排序。

代码结构优化。
辅助手段。

原来是for循环。
1 5 00 个独立更新。

切换到批量更新。
每 1 00 件。
更新。

写入操作。
3 000次起。
最多3 0次。

I/O 开销。
较小。
很多。

测试环境。
3 0万条数据。

优化前。
超过1 .5 秒。

优化后。
0.4 秒。

提高了3 到4 倍。

生产环境。
超过3 000万条数据。

有资格。
3 00万。

优化前。
1 1 -1 4 秒。

优化后。
0.8 秒。

很棒1 0次。

要点。
避免文件排序。
添加覆盖索引。

索引设计。
首先满足WHERE。
对字段的顺序进行排序。
方向。
一切都必须是好的。

批量操作。
减少小事。
数据库压力。
小的。

扩展建议。
注意缓慢的查询。
行_检查。
附加字段。

索引的维护。
不要过度索引。
干净,无需索引。

参数调整。
排序缓冲区大小。
tmp_table_size。

调整。
取决于数据量。

不要证明任何事情。
SQL 基础知识。
执行计划。
要了解。

索引的优化。
代码调整。
效率。
可以改进。

仅此而已。
这是你的。

Mybatis之批量更新数据(批量update)

记得有一次,项目中有一个需求,需要批量更新用户信息。
当时我们直接使用循环遍历来更新,数据库响应极其缓慢。
当时不懂Mybatis的foreach,只能一一更新,效率极低。
后来有同事提醒我可以使用Mybatis的批量更新功能。
我尝试了这一点,并将 XML 映射文件中的更新代码更改为 foreach,执行速度立即加快。
当时我负责的更新操作从半个小时缩短到了5 分钟,效率大大提高。
等等,还有一件事,我突然想到,如果批量更新时SQL太复杂,会不会对数据库造成额外的负载?