目前正在开发,SQL审核模块。基础功能已经开发完毕,一路也算顺风顺水,从10月8号开始开发这个模块,在做最后一个功能的时候回滚SQL,突然在开发的过程中有遇见“难事”了,听我徐徐道来。
流程介绍:
开发写入要上线SQL,由于开发组长查看,并且审核。判断是否可以执行,如果可以执行可以选择立即执行,或者定时执行,可以选择执行时间。哪怕凌晨执行都可以。(从此不用半夜陪开发上线啦~)。如果上线失败,就会面临SQL回滚。
故事的背景介绍完毕,开始说正文。
问题现象,点击SQL回滚,然后然后就卡住了。这部分的代码如下
代码逻辑:先获取第一个SQL的返回结果,把SQL结果添加到列表中,作为参数传递给第二条SQL作为条件,获得第二条SQL的返回值,添加到字典中,把这个字典返回给django。
就是这段代码,执行时间大概需要40S左右,(我和我的小伙伴都惊呆了)。因为SQL本身并不慢,单独执行不到0S。那么问题来了为什么,需要那么久呢。
因为这个问题折腾了很久,到底是哪里消耗了那么多时间呢。苦思冥想,久久不能解。于是我找到了 我的好基友知数堂 zizi老师。
zizi老师:"机智的我一眼就看到了你犯的错。但我就不告诉你,就不告诉你。但我可以跟你一起排错,让你自己来发现“。
帅萌:”大神收下我的膝盖吧~“
zizi老师:”我这就传授你心法,首先你再关键的位置打上时间戳,然后在看看那步消耗时间久“
于是代码就是这样的
zizi老师:”你应该发现了吧,是这步消耗了你太多时间 ,每条SQL要链接MySQL,所以主要消耗时间在这里。“
帅萌说:”嗯,有道理。吱吱老师我的偶像,于是我改了一版本”。
执行时间:
帅萌:“zizi老师好厉害,现在页面秒出,果然不卡了”
zizi老师:“知道消耗时间在哪里了嘛,你每次执行SQL都需要,频繁的创建链接和销毁链接,中途网络开销的消耗,一条需要消耗1S,那么数目多了自然就会慢。”,当然你后面的哪个版本虽然能解决问题,但我有更好的办法。
帅萌:“汗,快被我自己给蠢哭了。。。zizi老师还有什么其他建议吗?”
zizi老师:"我建议你使用连接池,其实我的课中已经讲过了”第四期第九周时“,这样会快很多。上课有没听课吧,你按照我说的配置,指定速度嗖嗖的~”
帅萌:"zizi老师我这块要不要启用多线程,这样会不会更快”
zizi老师:“目前的状况来说,其实没必要。因为数据库本身访问非常快。主要原因不是SQL慢,而是你创建连接需要消耗时间。”
帅萌:"受教,受教。多谢zizi老师"
原文发布时间为:2018-10-30
本文作者:田帅萌