MySQL存储过程优化实例

这个存储过程的主要功能是统计指定时间范围内的用户订单汇总数据。先看看最初的核心逻辑是什么样子的:

然后就是经典的游标循环处理:

看起来逻辑挺清晰的,但问题就出在这里。在测试环境用10万条订单数据跑了一下,居然要4.8秒!这完全不能接受。

仔细分析后发现几个明显的性能问题:

首先,在循环内部执行SELECT COUNT(*)来判断记录是否存在,这相当于每处理一条订单都要执行一次查询。10万条订单就是10万次查询,不慢才怪!

其次,游标本身就会带来额外的开销,而且这种逐行处理的方式效率很低。

优化思路很明确:用批量操作代替逐行处理。改写后的核心逻辑是这样的:

这里有个关键点,需要在user_order_summary表上建立唯一索引:

这样就能确保(user_id, summary_date)组合的唯一性,为批量更新创造条件。

另外,原来的查询条件也需要优化。检查发现orders表在order_time字段上没有索引,赶紧加上:

经过这两步优化后,效果立竿见影。同样的数据量,执行时间从4.8秒降到了0.2秒左右,性能提升了20多倍!

这里总结几个存储过程优化的关键点:

避免在循环内执行查询 - 这是最常见的性能杀手

优先考虑集合操作 - 能用一条SQL解决的问题就不要用游标

合理使用索引 - 特别是WHERE条件和JOIN条件的字段

利用批量操作 - 比如INSERT ... ON DUPLICATE KEY UPDATE

减少上下文切换 - 在存储过程中尽量减少SQL语句的执行次数

在实际开发中,游标虽然用起来方便,但性能往往不尽如人意。除非确实需要逐行处理复杂逻辑,否则都应该优先考虑基于集合的操作方式。

另外还要注意,有时候业务逻辑的调整也能带来性能提升。比如这个案例中,如果不需要实时更新汇总数据,可以考虑用定时任务在业务低峰期执行,这样对线上系统的影响会更小。

存储过程优化是个细致活,需要结合具体的业务场景和数据特点来分析。关键是要养成良好的习惯,在写存储过程的时候就要有性能意识,避免留下性能隐患。

相关推荐
TDengine (老段)几秒前
TDengine IDMP 十大实用功能(3)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
sun03225 分钟前
【JDK 动态代理】 和 【CGLIB 代理】对比
java·数据库·sql
YH_Analytics23 分钟前
2026 高压 E-House 市场深度分析报告市场格局
网络·数据库
后台模板学习38 分钟前
MongoDB 与 MySQL 在 IM 即时聊天场景中该
数据库·mysql·mongodb
KaiwuDB1 小时前
企业级数据库数据保护:KaiwuDB KaiwuDB V3.3.0 发布:S3 冷热分层存储与主备集群能力增强实战解析模场景备份恢复方案解析
数据库·时序数据库·kaiwudb·发版·多模时序数据库·冷热分层存储·主备集群
DataY1 小时前
MySQL CDC 直接写进 Doris 汇总模型:同步即汇总,明细不用搬两遍
数据库
琳达爱分享1 小时前
客服改了地址,发货任务把它改了回去:一次没人报错的覆盖
数据库
IT大白鼠1 小时前
渗透测试实战从靶场搭建到渗透流程——第 8 篇 · 服务型靶标(上):MySQL 双版本写文件链
数据库·mysql·渗透测试
piaoyiren2 小时前
Python FTP 服务端项目详细功能文档
网络·数据库·python
少年的范儿2 小时前
Windows 安装 MySQL 8.4 教程(ZIP 解压版):配置 my.ini、初始化数据库与启动服务
数据库·windows·mysql