小心!高效率的sql查询,它也会导致网站响应变慢

news/2024/5/13 13:33:33/文章来源:https://blog.csdn.net/weixin_34138377/article/details/90657613

最近一个项目进行2.0版本升级。2.0版本部署到所有的线上机器后,发现网站访问速度变的很慢。为了不影响用户体验,紧急进行版本回滚,然后进行问题查找。

分析
首先查看php的日志,没有发现有用的线索。
然后看了下mysql db的监控情况。如下图:
cpu_io_wait

<img class="alignnone size-full wp-image-228" alt="cpu_io_wait" src="http://www.bo56.com/wp-content/uploads/2013/11/cpu_io_wait.jpg" width="910" height="207" /></a></p>

load

<img class="alignnone size-full wp-image-229" alt="load" src="http://www.bo56.com/wp-content/uploads/2013/11/load.jpg" width="928" height="206" /></a></p>

memory_usage

<img class="alignnone size-full wp-image-230" alt="memory_usage" src="http://www.bo56.com/wp-content/uploads/2013/11/memory_usage.jpg" width="900" height="206" /></a></p>

network_in

<img class="alignnone size-full wp-image-231" alt="network_in" src="http://www.bo56.com/wp-content/uploads/2013/11/network_in.jpg" width="900" height="206" /></a></p>

network_out

<img class="alignnone size-full wp-image-232" alt="network_out" src="http://www.bo56.com/wp-content/uploads/2013/11/network_out.jpg" width="900" height="206" /></a></p>

qps

<img class="alignnone size-full wp-image-233" alt="qps" src="http://www.bo56.com/wp-content/uploads/2013/11/qps.jpg" width="900" height="206" /></a></p>

reponse_time

<img class="alignnone size-full wp-image-234" alt="reponse_time" src="http://www.bo56.com/wp-content/uploads/2013/11/reponse_time.jpg" width="900" height="206" /></a></p>

sys_cpu

<img class="alignnone size-full wp-image-235" alt="sys_cpu" src="http://www.bo56.com/wp-content/uploads/2013/11/sys_cpu.jpg" width="900" height="206" /></a></p>

user_cpu

<img class="alignnone size-full wp-image-236" alt="user_cpu" src="http://www.bo56.com/wp-content/uploads/2013/11/user_cpu.jpg" width="900" height="206" /></a></p>

2.0版本是在20点左右上线,20点20分左右回滚。从上图,可以看到2.0版本上线后,数据库服务器的网络io明显增高。这说明,不仅查询的次数增多了,而且返回的数据量也增大了很多。看来网站变慢很可能和mysql数据库查询有关。和db负责人沟通,让其查看是否有sql的满查询。但是反馈很让人意外。他查看慢查询日志后,没有发现执行效率有问题的sql。

在web服务器上,使用strace对php进程的执行情况做了进一步的跟踪。发现有一条sql (show status)语句频繁执行。这条语句的具体执行情况如下:

1382678984.106491 write(19, "\r\0\0\0\3SHOW STATUS;", 17) = 17 <0.000334>
1382678984.106896 read(19, "\1\0\0\1\2N\0\0\2\3def\22information_schema\6STATUS\6STATUS\rVariable_name\rVARIABLE_NAME\f\34\0\200\0\0\0\375\1\0\0\0\0G\0\0\3\3def\22information_schema\6STATUS\6STATUS\5Value\16VARIABLE_VALUE\f\34\0\0\10\0\0\375\0\0\0\0\0\5\0\0\4\376\0\0\"\0\26\0\0\5\17Aborted_clients\00597839\32\0\0"..., 16384) = 4096 <0.002601>
1382678984.109672 read(19, "_discover\0010\25\0\0\254\17Handler_prepare\0041290\30\0\0\255\22Handler_read_first\0042060\30\0\0\256\20Handler_read_key\006524197\26\0\0\257\21Handler_read_last\003604\31\0\0\260\21Handler_read_next\006499561\31\0\0\261\21Handler_read_prev\006404599\30\0\0\262\20Handler_read_rnd\00611"..., 16384) = 6648 <0.000036>
1382678984.109947 poll([{fd=19, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) <0.000029>

看这条show status语句的执行情况。

A.  从发起sql查询,到可以读取结果大概花费了0.405毫秒。从1382678984.106491开始向mysql服务器发送查询请求。从1382678984.106896就已经完成了sql查询,并且可以读取数据了。可见这条sql语句的查询速度还是很快的。
B.  从发起sql查询,到读取完所有数据大概消耗了3毫秒。这条sql语句返回的数据大概10k左右,查询结果分两次才读取完毕。
C.  这条sql语句每秒执行了240次计算,这样每秒大概要有3*240 = 720毫秒消耗在这条sql语句中。这样1秒中有72%的时间消耗在这条sql查询上。这样就导致要多花费3.5倍的时间进行数据库操作。大家都直到web站点的瓶颈多数在数据库查询。

这样看来,很有可能就是这条sql语句导致的网站响应速度变慢。那为什么会每秒有这么多次查询?在2.0代码中增加了重试机制,即发现数据库连接有问题的时候,进行数据库重连。在设计重试机制时逻辑有问题,是每次进行数据库操作前都进行一次show status的查询,如果查询失败就进行数据库重新建立连接。

总结
1.不要因为某条sql的执行效率高就忽视。甚至肆无忌惮的使用。
2.不仅要注意sql的执行效率,还要特别注意返回数据量比较大的sql。否则过大的数据量返回,会给数据库造成很大的网络io压力。进而会导致load过高等一系列的反应。
3.合理的机制和策略很重要。不要滥用sql查询。

补充
本文原发布在阿里内网“阿里云计算”圈中,引起一些评论。因此在原文的基础上结合评论整理后发在本圈。
在原文评论中提到了select查询时,*符号的使用。我感觉非特殊必要,建议不要在select查询中使用*符号。如:select * from feed. 原因有以下几点:
1.当你仅需要表中部分字段中的内容时,必然会导致资源浪费。如,多余的数据必然会导致更多的网络io(大家直到io是很耗资源的一个操作)。多于数据在网络中传输会导致网络带宽的浪费。
2.不利于后期维护。作为web程序对应数据表的更改是常事。如表中某个字段名修改了,如果使用*的情况下,必须把所有引用此字段的地方的代码都要做相应修改。如果是通过select field from feed这样指定字段名查询数据。当field字段更名为new_field时,只要在select中使用AS 关键字即可。select new_field AS field from feed. 这样改动比较小。

另外,有两点需要注意。不过这些和数据库的SERVER端实现有关。
1.如果使用*的时候,可能会导致从*到表中字段名columns的转换。会造成一些时间浪费。2.在所需要的列正好都有索引时,可能数据直接读取索引。这样可以更少的磁盘io,从而提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_724474.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关键词提取自动摘要相关开源项目,自动化seo

关键词提取自动摘要相关开源项目 GitHub - hankcs/HanLP: 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换https://github.com/hankcs/HanLP 文章或博客的自动摘要(自动简介) - 开源中国社区http://www.oschina.net/cod…

最全的静态网站生成器(开源项目)

将动态网页静态化&#xff0c;可以有效减轻服务器端的压力&#xff0c;并且静态网页的访问速度要快于动态网页。此外&#xff0c;使用静态网页还有利于搜索引擎的收录&#xff0c;从而提高网站的搜索排名。 下面是StaticSiteGenerators网站收集整理的开源的静态网站生成器&…

SEO终极算法(二)

上一篇我的文章《草根站长这一年用血的教训换来的SEO终极算法》受到了许多读者的争议。今天为了迎合读者迫切的需求&#xff0c;特意写了SEO终极算法(二)&#xff0c;希望给做SEO的朋友们能有一些启发。本篇文章比较基础常识性的SEO基础的问题我就不写了&#xff0c;只写比较有…

网站服务器炸了 进不去怎么办,炉石传说服务器炸了怎么回事-暴风城进不去排不到人解决方法-乖乖手游网...

炉石传说暴风城更新了&#xff0c;但玩家说进不去游戏&#xff0c;新版本的更新服务器就会炸掉&#xff0c;有很多玩家已经知道是怎么回事了&#xff0c;详细情况乖乖小编会在下面与大家分享&#xff0c;想知道暴风城进不去&#xff0c;还排不上人的可以来看看。相关推荐:炉石传…

iis 上传php文件,PHP网站在IIS中发布的相关配置

前言前段时间整了一个挂Q的平台。源代码是从网上下载的&#xff0c;后期稍微调整了一下链接和title之类的文字就上线了。详细在这里。运行了一段时间&#xff0c;除了偶尔出现QQ下线上线&#xff0c;整体效果基本上符合预期&#xff0c;个人感觉很满意&#xff0c;也小有成就感…

《大型网站服务器容量规划》一导读

前 言 大型网站服务器容量规划当今社会已经进入信息时代&#xff0c;人们足不出户&#xff0c;从网络上就可以获取自己需要的信息。为了满足正常的业务需求&#xff0c;任何一个网站都要有硬件支持&#xff0c;无论日访问量是一个百万级的中型网站还是上亿级的大型网站。为了正…

通过COOKIE欺骗登录网站后台

1.今天闲着没事看了看关于XSS&#xff08;跨站脚本攻击&#xff09;和CSRF&#xff08;跨站请求伪造&#xff09;的知识&#xff0c;xss表示Cross Site Scripting(跨站脚本攻击)&#xff0c;它与SQL注入攻击类似&#xff0c;SQL注入攻击中以SQL语句作为用户输入&#xff0c;从而…

win7服务器建网站教程,win7搭建Web服务器教程

如何实现资源共享?那就需要利用Web服务器&#xff0c;借助它来实现信息的同步&#xff0c;也能将信息上传到服务器端&#xff0c;让用户悉知。那win7如何搭建Web服务器来实现这一目的呢?下面小编就给大家介绍win7搭建Web服务器教程。第一步&#xff1a;打开控制面板&#xff…

一句话道破SEO真谛

都在问SEO是什么&#xff1f;SEO到底是做什么的&#xff1f;为什么要做SEO&#xff1f; SEO是什么&#xff1f;一句话&#xff1a;SEO就是优化。优化包含两部分&#xff1a;内部优化&#xff08;网站优化&#xff09;和外部优化&#xff08;市场优化&#xff09; 内部优化&am…

使用C#的HttpWebRequest模拟登陆网站

使用C#的HttpWebRequest模拟登陆网站 原文:使用C#的HttpWebRequest模拟登陆网站这篇文章是有关模拟登录网站方面的。 实现步骤&#xff1b; 启用一个web会话 发送模拟数据请求&#xff08;POST或者GET&#xff09; 获取会话的CooKie 并根据该CooKie继续访问登录后的页面&#x…

SEO站长必备的十大常用搜索引擎高级指令

作为一个seo人员&#xff0c;不懂得必要的搜索引擎高级指令&#xff0c;不是一个合格的seo。网站优化技术配合一些搜索引擎高级指令将使得优化工作变得简单。今日就和大家聊聊SEO站长必备的十大常用搜索引擎高级指令的那些事儿。 【1】引号的用法 把关键字打上引号后把引号部分…

转:游戏玩家集体出逃 社交网站遭遇迷途

原文地址&#xff1a;http://games.sina.com.cn/y/2010-04-27/1130394729.shtml 在经历了摘菜和抢车位等游戏引发的狂热之后&#xff0c; 国内社交游戏玩家集体出逃&#xff0c;社交网站危机显现。 在商业价值和盈利模式的质疑声中&#xff0c;这些依靠游戏起家的Facebook模…

使用phpmyadmin管理远程sql_网站搬家记录-使用cPanel面板从SugarHosts迁出

自从购买了独立服务器&#xff0c;就准备把分散在各处主机的站点迁移到一块。目前最麻烦的就是在SugarHosts.com上的产品公园站点&#xff0c;只能使用cPanel面板&#xff0c;而我对这个面板又不熟悉&#xff0c;故在此做下记录。cPanel是什么cPanel是一套基于Web的自动化hosti…

部分网站为什么上不去_大量网站索引暴跌,百度搞鬼可以如何应对

做SEO的同事一大早跟我说他们站长群一早就炸了&#xff01;只因为进入11月以来&#xff0c;不少的站点收录变慢、收录变少&#xff0c;今天更是有不少站长反馈说&#xff0c;索引量直接砍半。根据提供的索引截图来看&#xff0c;昨天的索引量都出现了断崖式暴跌&#xff0c;200…

《SEO的艺术(原书第2版)》——3.12 规划和评估的高级方法

3.12 规划和评估的高级方法 业务规划有许多方法。其中一种著名的方法是SWOT&#xff08;Strengths、Weaknesses、Opportunities、Threats&#xff0c;优势、劣势、机遇、威胁&#xff09;分析。还有一些方法能够确保规划目标的正确&#xff0c;如SMART&#xff08;Specific、Me…

快速构建LAMP网站平台

快速构建LAMP网站平台1.1 问题 本例要求基于Linux主机快速构建LAMP动态网站平台&#xff0c;并确保可以支撑PHP应用及数据库&#xff0c;完成下列任务&#xff1a; 1&#xff09;安装LAMP平台各组件&#xff0c;启动LAMP平台 软件包&#xff1a;httpd、mariadb-server、mariadb…

[转载]网站性能优化之CSS无图片技术 —— 网站性能优化

一、无图片技术定义在不使用CSS Image&#xff08;通过CSS的引入的背景图片,不包括img标签内的图片&#xff09;情况下生成类似图片效果的技术&#xff1b;换句话的意思就是在使用纯CSS生成类似图片效果的技术。二、为什么要“无图片”&#xff1f;首先我们通过yslow的statisti…

WebRAY网站检查技术支撑平台的实践

平台与网站越来越多&#xff0c;问题更多 互联网服务平台及门户网站已经成为互联网时代政府机关企事业单位的形象代言&#xff0c;是政企单位展示自身形象的一个重要渠道。从国务院办公厅组织开展的第一次全国政府网站普查情况获悉&#xff0c;截至2015年11月&#xff0c;各地区…

强大的跨平台绘制流程图软件网站ProcessOn

一个强大的作图网址&#xff08;https://www.processon.com&#xff09;&#xff0c;告别vision,rose等需要本地安装的软件&#xff0c;只需要连接网络不需要安装任何软件就能制作流程图了。能绘制基本流程图形&#xff0c;flowchart流程图&#xff0c;bpmn,evc企业价值链&…

Google Developers 中国网站正式发布

Google Developers 中国网站 (developers.google.cn) 正式发布&#xff01;Google Developers 中国网站是特别为中国开发者而建立的&#xff0c;它汇集了 Google 为全球开发者所提供的开发技术资源&#xff0c;包括 API 文档、开发案例、技术培训的视频。并涵盖了以下关键开发技…