MySQL循环全解析_存储过程实战到优化避坑指南,MySQL循环全解析_存储过程实战到优化避坑指南

刚接触MySQL循环一脸懵?存储过程写半天 *** 活不执行?别慌!今天咱们就掰开揉碎讲透这个知识点,保准你看完从青铜变王者!


一、循环类型:MySQL的三种玩法

​1. WHILE循环:直男式操作​
就像复读机不断重复直到条件满足

sql复制
DELIMITER //CREATE PROCEDURE simple_loop()BEGINDECLARE i INT DEFAULT 1;WHILE i <= 5 DOSELECT i;SET i = i + 1;END WHILE;END //DELIMITER ;

​特点​​:

  • 必须手动设置计数器
  • 适合次数明确的循环
  • 容易写成 *** 循环(新手重灾区)

​2. 游标循环:优雅遍历数据​
像读小说逐页翻看查询结果

sql复制
DECLARE cur CURSOR FOR SELECT id FROM users;OPEN cur;FETCH cur INTO var;WHILE NOT done DO-- 处理数据FETCH cur INTO var;END WHILE;

​避坑指南​​:

  • 必须声明NOT FOUND处理器
  • 游标用完立即关闭
  • 大数据量记得加LIMIT

​3. REPEAT循环:先上车后补票​
先执行再判断条件

sql复制
REPEATSET i = i +1;UNTIL i > 10END REPEAT;

适合至少执行一次的场景


二、性能优化:从青铜到王者的跃迁

​1. 批量操作VS单条处理​

方式1万条耗时内存消耗
单条UPDATE58秒120MB
批量UPDATE3.2秒15MB

​实战技巧​​:

  • 用CASE WHEN实现条件批量更新
  • INSERT时多条VALUES合并
  • 临时表预处理数据

​2. 索引的致命影响​
在循环内执行SELECT查询?索引不生效直接凉凉!
​正确姿势​​:

  • 先把数据存入临时表
  • 必要字段创建覆盖索引
  • 避免在循环内关联查询

​3. 变量使用的隐藏坑​

sql复制
DECLARE total INT DEFAULT (SELECT COUNT(*) FROM big_table); -- 错误!SET total = (SELECT COUNT(*) FROM big_table); -- 正确

声明变量时不能直接赋值查询结果


三、高频问题:血泪经验大放送

​Q:循环执行到一半中断怎么办?​
A:用事务拯救你的数据!

sql复制
START TRANSACTION;-- 循环操作COMMIT;

​注意​​:

  • 设置合理的SAVEPOINT
  • 错误处理里加ROLLBACK
  • 大批量操作分批次提交

​Q:存储过程调试太难?​
​调试三板斧​​:

  1. SELECT输出中间变量值
  2. 用LIMIT 10测试小数据量
  3. SHOW WARNINGS看执行警告

​Q:如何实现动态SQL循环?​

sql复制
SET @sql = CONCAT('UPDATE ',table_name,' SET status=1');PREPARE stmt FROM @sql;EXECUTE stmt;

适用表名不固定的场景


个人观点

搞MySQL循环就像炒菜——火候最关键!WHILE循环是猛火快炒,游标是文火慢炖。新手建议先用WHILE练手,等玩熟了再上游标这种高阶玩法。记住,能用批量操作就别用循环,这跟能坐电梯就别爬楼梯一个理。最近发现个神器——MySQL的HandlerSocket插件,直接把循环性能提升三倍,不过配置起来要人命。最后送大家八字真言:少循环,多批量,保平安!