同事被开除,一条SQL引发的惨案

文章讲述了在MySQL中使用`INSERTINTOorder_recordSELECT*FROMorder_today`时遇到的全表扫描导致性能下降和支付失败问题,通过添加索引解决,强调了在类似查询中使用索引的重要性。
摘要由CSDN通过智能技术生成

**订单记录表**


`CREATE TABLE order_record like order_today;`


**今日订单表数据**


![图片](https://img-blog.csdnimg.cn/img_convert/fbaecdeaa0722e24182a5a324fc93447.png)


模拟迁移


把8号之前的数据都迁移到`order_record`表中去。



INSERT INTO order_record SELECT    
    *     
FROM    
    order_today     
WHERE    
    pay_success_time < ‘2020-03-08 00:00:00’;


在navicat中运行迁移的sql,同时开另个一个窗口插入数据,模拟下单


![图片](https://img-blog.csdnimg.cn/img_convert/1666d25cdcd888fdd94e6c273fbaff59.png)


![图片](https://img-blog.csdnimg.cn/img_convert/ae69402cd680e2609c158fa9540fcfba.png)


从上面可以发现一开始能正常插入,但是后面突然就卡住了,并且耗费了23s才成功,然后才能继续插入。这个时候已经迁移成功了,所以能正常插入了。


#### 出现的原因


在默认的事务隔离级别下:`insert into order_record select * from order_today` 加锁规则是:`order_record`表锁,`order_today`逐步锁(扫描一个锁一个)。


分析执行过程。


![图片](https://img-blog.csdnimg.cn/img_convert/dcb61852754ca42a7231c92e8b9155a3.png)


通过观察**迁移sql**的执行情况你会发现`order_today`是全表扫描,也就意味着在执行`insert into select from` 语句时,mysql会从上到下扫描`order_today`内的记录并且加锁,这样一来不就和直接锁表是一样了。


这也就可以解释,为什么一开始只有少量用户出现支付失败,后续大量用户出现支付失败,初始化订单失败等情况。


因为一开始只锁定了少部分数据,没有被锁定的数据还是可以正常被修改为正常状态。


由于锁定的数据越来越多,就导致出现了大量支付失败。最后全部锁住,导致无法插入订单,而出现初始化订单失败。


#### 解决方案


由于查询条件会导致`order_today`全表扫描,什么能避免全表扫描呢。


很简单嘛,给`pay_success_time`字段添加一个`idx_pay_suc_time`索引就可以了。


由于走索引查询,就不会出现扫描全表的情况而锁表了,只会锁定符合条件的记录。


关于 MySQL 索引的详细用法有实战,大家可以看我以前的索引优化系列的文章。


最终的sql



INSERT INTO order_record SELECT    
    *     
FROM    
    order_today FORCE INDEX (idx_pay_suc_time)    
WHERE    
    pay_success_time <= ‘2020-03-08 00:00:00’;


**执行过程**


![图片](https://img-blog.csdnimg.cn/img_convert/14f6c06aa35624bbea3298d3e911a388.png)


#### 总结


使用`insert into tablA select * from tableB`语句时,一定要确保`tableB`后面的`where`,`order`或者其他条件,都需要有对应的**索引**,来避免出现`tableB`全部记录被锁定的情况。


**文末福利**


**【可以加小新老师vx免费领取JAVA全套学习资料哦,基础,进阶,高阶都有】**


**![](https://img-blog.csdnimg.cn/daec72a1052d468090cc9db8a95a2dd9.png)**


**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/86d62ecfab38734a43835bd3af9b7431.png)
![img](https://img-blog.csdnimg.cn/img_convert/6bbecf4a9cc9fcbf45c621ae7d0a1f21.png)
![img](https://img-blog.csdnimg.cn/img_convert/43c176323a44b12aca13fb346ca5ecca.png)
![img](https://img-blog.csdnimg.cn/img_convert/2a02e436a8f2d8bad419ed6b812591ab.png)
![img](https://img-blog.csdnimg.cn/img_convert/d5c40eb4860282100c693beae60cc452.png)
![img](https://img-blog.csdnimg.cn/img_convert/9e2327e86130366bfb06f03bf460b446.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值