热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

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

load

memory_usage

network_in

network_out

qps

reponse_time

sys_cpu

user_cpu

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,从而提高效率。


推荐阅读
  • 开发笔记:新手DVWACSRF
    开发笔记:新手DVWACSRF ... [详细]
  • SQL注入实验:SqliLabs第38至45关解析
    本文深入探讨了SqliLabs项目中的第38至45关,重点讲解了堆叠注入(Stacked Queries)的应用技巧及防御策略。通过实际案例分析,帮助读者理解如何利用和防范此类SQL注入攻击。 ... [详细]
  • KKCMS代码审计初探
    本文主要介绍了KKCMS的安装过程及其基本功能,重点分析了该系统中存在的验证码重用、SQL注入及XSS等安全问题。适合初学者作为入门指南。 ... [详细]
  • 本文详细记录了《PHP与MySQL Web开发》第一章的学习心得,特别关注了PHP的基本构成元素、标记风格、编程注意事项及表单处理技巧等内容。 ... [详细]
  • 本文详细探讨了在Windows Server 2003环境下遇到MySQL连接失败(错误代码10061)的解决方案,包括通过卸载特定的Windows更新和调整系统注册表设置的方法。 ... [详细]
  • 尝试从 MySQL 转向 SQL Server 2008 时遇到了安装错误,提示“系统配置未能初始化”,错误代码为 0x84B10001。怀疑可能是由于之前的 MySQL 安装残留导致的注册表问题。寻求专家建议。 ... [详细]
  • 本文详细探讨了在不同服务器上运行的PHP程序如何成功连接MySQL数据库的方法,包括常见的连接失败原因及解决方案。 ... [详细]
  • 深入理解FastDFS
    FastDFS是一款高效、简洁的分布式文件系统,广泛应用于互联网应用中,用于处理大量用户上传的文件,如图片、视频等。本文探讨了FastDFS的设计理念及其如何通过独特的架构设计提高性能和可靠性。 ... [详细]
  • mysql 分库分表策略_【数据库】分库分表策略
    关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多, ... [详细]
  • 解析程序员与软件工程师的角色差异
    本文深入探讨了程序员与软件工程师之间的主要区别,包括它们的职业定位、技能要求以及工作内容等方面的不同,旨在帮助读者更好地理解这两个角色的特点。 ... [详细]
  • 本文详细介绍了MySQL在Linux环境下的主从复制技术,包括单向复制、双向复制、级联复制及异步复制等多种模式。主从复制架构中,一个主服务器(Master)可与一个或多个从服务器(Slave)建立连接,实现数据的实时同步。 ... [详细]
  • php怎么重新发布网站(2023年最新分享) ... [详细]
  • 本文详细介绍了如何通过Percona插件监控MySQL 5.7数据库,包括环境准备、插件安装、配置调整及数据测试等步骤,旨在为用户提供一个高效且稳定的监控解决方案。 ... [详细]
  • 本文介绍了如何通过安装 VirtualBox 和 Vagrant 来快速搭建和管理虚拟机环境。我们将详细探讨如何选择合适的 Box 镜像,以及如何高效地下载、添加和管理这些镜像。 ... [详细]
  • 本文探讨了如何利用Oracle的REGEXP_SUBSTR函数高效地从复杂字符串中提取括号内的特定值,提供了详细的示例和解决方案。 ... [详细]
author-avatar
手机用户2502939421
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有