当超过10万条记录时,mysql上的Update查询执行慢解决办法,示例update mes_production_order,sap_sale_order_more set mes_production_order.ZSTATUS = sap_sale_order_more.ZSTATUS where mes_production_order.PRO_CODE = sap_sale_order_more.AUFNR
时间: 2023-07-20 21:23:26 浏览: 146
sql查询慢的原因,及解决方法
当 MySQL 中的数据量较大时,如何优化 update 查询的执行速度,可以考虑以下几个方面:
1. 索引优化:在 update 操作时,MySQL 会对表进行写锁,如果更新的数据行很多,会导致其他查询请求等待锁释放,从而影响性能。可以通过在 mes_production_order 和 sap_sale_order_more 表中创建 PRO_CODE 和 AUFNR 的联合索引来加快查询速度。
2. 分批更新:将更新操作分批执行,每次只更新一部分数据,可以避免表锁定所带来的性能问题。可以使用 limit 关键字和循环语句来实现分批更新操作。
3. 避免全表扫描:在 update 操作中,避免全表扫描是很重要的。可以通过查询执行计划来查看 MySQL 是否使用了索引,如果没有使用索引,可以考虑增加索引或者优化查询语句来避免全表扫描。
4. 内存调优:在 MySQL 中,内存配置对于数据库的性能来说至关重要。可以考虑调整 MySQL 的内存配置参数,如 innodb_buffer_pool_size 等,来提高查询性能。
综上所述,可以尝试以下优化方案:
```
1. 在 mes_production_order 和 sap_sale_order_more 表中创建 PRO_CODE 和 AUFNR 的联合索引:
ALTER TABLE mes_production_order ADD INDEX idx_pro_code (PRO_CODE);
ALTER TABLE sap_sale_order_more ADD INDEX idx_aufnr (AUFNR);
2. 分批更新:
DECLARE start INT DEFAULT 0;
DECLARE limit INT DEFAULT 1000;
SET @total = (SELECT COUNT(*) FROM mes_production_order);
WHILE start < @total DO
UPDATE mes_production_order, sap_sale_order_more
SET mes_production_order.ZSTATUS = sap_sale_order_more.ZSTATUS
WHERE mes_production_order.PRO_CODE = sap_sale_order_more.AUFNR
LIMIT start, limit;
SET start = start + limit;
END WHILE;
3. 避免全表扫描:
通过 EXPLAIN 查询执行计划来查看是否使用了索引,如果没有使用,可以考虑增加索引或者优化查询语句。
4. 内存调优:
根据实际情况,适当调整 MySQL 的内存配置参数,如 innodb_buffer_pool_size 等。
```
阅读全文