记一次数据库的优化

摘要:
之前遇到过这个问题鉴于上次的经验,这次也是定位到数据库,但是肯定不是上次的问题,也进行了重启,发现根本没有鸟用,看不到什么错,无法跟踪。最后找了公司的DBA,帮忙看下数据库是不是执行很慢,他查看了一下,跟我们说是数据库挤压的很多的SQL待执行,结果就卡住了,从而导致应用的线程耗尽。DBA给了我们执行慢的SQL,其实也不复杂,就是一个三表连接查询,就查三个字段,结果执行需要6秒以上的时间。

前几天公司应用后台更新版本,晚上发版,测试 到了12点过,测试的差不多没有问题,其他同事都回家了,我和所谓的主管(要好的朋友)不想回去了,就留在的公司过夜。

第二天起来,我戳了一眼,没有问题,结果到了8点多,团队群里就报登录界面显示不了验证码。(登录需要输入验证码)

迅速的就开始进行问题的检查,因为是验证码无法显示,于是就定位到处理登录的工程account,打开日志一看,报的算是线程耗尽的问题。

之前遇到过这个问题(有一次linux上mysql安装的磁盘不对,被推了大量数据后,磁盘满了,导致处理更新的语句变慢,从而导致应用的线程耗尽)

鉴于上次的经验,这次也是定位到数据库,但是肯定不是上次的问题,也进行了重启,发现根本没有鸟用,看不到什么错,无法跟踪。

最后找了公司的DBA,帮忙看下数据库是不是执行很慢,他查看了一下,跟我们说是数据库挤压的很多的SQL待执行,结果就卡住了,从而导致应用的线程耗尽。

DBA给了我们执行慢的SQL,其实也不复杂,就是一个三表连接查询,就查三个字段,结果执行需要6秒以上的时间。

因为公司应用日活1万多,集中在早上,于是一下子就导致应用不可用了。

快速定位到SQL所用的地方,主要是新版本发布后,增加了记录用户的微信小程序的openid信息,倒是无关紧要,于是就注释了,重新部署,测试一下,完美如初。

程序正常运行之后,我着手看了一下SQL,其实查到表,两张表各有50万数据,另外一张表10几条数据,使用了很多不等于判断,,这样的情况下,居然要5秒以上的执行时间

,真实难以相信,使用explain看了一下执行计划,不过之前学了不少SQL优化,倒是现在看执行计划是真的陌生,没常用,,,不过执行计划都还好,第一张表全部查询,

其他感觉没有什么大问题,部分也使用到了索引,也用了where条件。

因为不等操作可能会导致索引失效,于是把不等操纵都改为的等于操作,结果没有鸟用。

看了一下SQL连接的查询结构,发现了左连接查询的字段,其实是没有命中索引的,于是我改了下数据库的索引,把50万条左连接查询的右表上的连接字段

放到的多列索引的头部,结果SQL一执行,一瞬间就会查询出结果(200ms左右吧)。

算是解决了,真的想不到改一个索引,改变会这么大,后面把程序恢复后重新部署,正常运行。

刚来这个公司不久,虽然是大公司,但是数据库是真的烂,设计数据库都不会太考虑合适的数据类型使用,索引也是来就是一大推,也不管名不命中,

人微又嫌烦,实在不想多说什么。

最后贴一个学习SQL优化时,讲师总结的索引优化的口头禅:

全值匹配我最爱,最左前缀要遵守;

带头大哥不能死,中间兄弟不能断;

索引列上少计算,范围之后全失效;

LIKE百分写最右,覆盖索引不写星;

不等控制还有or,索引失效要远离;

VAR引号不可丢,SQL高级也不难;

免责声明:文章转载自《记一次数据库的优化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Spark(十二)【SparkSql中数据读取和保存】Builder生成器(创建型模式)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java中的vo 、dto 、dao--转

 java中的vo 、dto 、dao--转 原文地址:http://yinchunjian.iteye.com/blog/758196 O是跟数据库里表的映射,一个表对应一个VO DAO是用VO来访问真实的表,对数据库的操作都在DAO中完成 BO是业务层,做逻辑处理的 VO , PO , BO , QO, DAO ,POJO, O/R Mappin...

Sqlmap注入技巧收集整理

TIP1 当我们注射的时候,判断注入 http://site/script?id=10http://site/script?id=11-1 # 相当于 id=10http://site/script?id=(select 10) # 相当于 id=10 http://site/script?id=10 and 1=1 #失败 通过判断可发现and和or被过...

python3+Scrapy爬虫使用pipeline数据保存到文本和数据库,数据少或者数据重复问题

爬取的数据结果是没有错的,但是在保存数据的时候出错了,出现重复数据或者数据少问题。那为什么会造成这种结果呢? 其原因是由于Spider的速率比较快,而scapy操作数据库操作比较慢,导致pipeline中的方法调用较慢,这样当一个变量正在处理的时候,一个新的变量过来,之前的变量的值就会被覆盖。 就比如pipline的速率是1TPS,而spider的速率是5...

XML导入Access/MySql数据库 XML2OleDb Fred

学校XML课程布置了一个作业“XML导入Access和MySql”,我在网上找到了孟子E章的Xml2OleDb,功能很全面,唯一的不足就是缺少了导入MySql的支持,经过我的完善,补充了该功能。 我的版本是为了交作业,所以去掉了连接字符串自输入,而是固定在web.config里啦。导入MySql的代码与2OleDb有所不同,思路是一样的,下面我贴出来2My...

php mssql几条常见的数据库分页 SQL 语句

我们在编写MIS系统和Web应用程序等系统时,都涉及到与数据库的交互,如果数据库中数据量很大的话,一次检索所有的记录,会占用系统很大的资源,因此 我们常常采用,需要多少数据就只从数据库中取多少条记录,即采用分页语句。根据自己使用过的内容,把常见数据库Sql Server,Oracle和MySQL的分页语句,从数据库表中的第M条数据开始取N条记录的语句总结如...

sql 获取数据库表名与某表的列名

1:获取某表的列名 select 列名=name from syscolumns where id=object_id(表名') 2:获取数据库表中的表名 select 表名=name from sysobjects where objectproperty(id, 'isusertable ')=1 3:获取数据库表中的列名、字段类型、字段长度 sele...