创建MySQL索引大幅优化某PHP应用性能

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于索引大幅优化某php应用性能的相关内容,下面一起来看一下,希望对大家有帮助。

创建MySQL索引大幅优化某PHP应用性能

起因

前两个月某朋友要做一个项目,本着快速上线推广的目的,直接购买了某公司的源码并让卖家部署上线。看到源码后,我直接对朋友说:算是被小坑了,这个源码质量有点差,用户数起来后可能会有比较严重的性能问题。

做出这样的评价,我是有依据的:

作为近乎实时应用,核心代码用PHP编写,通过数据库表记录控制许多场景的并发和重复请求;

立即学习“PHP免费学习笔记(深入)”;

PHP开发不是问题,但对方工程师似乎不知道有CLI模式,而是通过计划任务(crontab)达到程序不停运转,于是乎浩浩荡荡几十条curl计划任务每分钟执行;

代码中有不少 class1.php, class1-1.php这样复制备份的文件,一眼看过去很难知晓其存在目的;

存在不少for循环读取数据库的代码,命名规则混乱。

当然,能赚钱的代码才是好代码(对方就通过这些代码赚钱了),我也没多去纠结。最初的想法是,4核8G的配置,跑1万个客户应该很难,跑5000就可以了。

转折

就在这周,忽然频繁接到 阿里云 的报警短信和邮件,说CPU占用过高。心想市场推广很顺利,用户大增吗?一问朋友,才不到300个用户!

01.png

这时才意识到,这套代码实际表现比我想想中的更差,有严重的性能问题。按照这个资源消耗速度,升级硬件是无底洞,性能优化才是正途。

性能优化

拿到代码两个月了,闲暇时间偶尔会看一下,已经大体知道其结构和主要功能。现在出现了严重性能问题,是时候尝试做一些性能优化了。

鉴于几十个计划任务不停运行,其不断驱动系统运转,因此计划任务的相关功能是最先被了解的。根据自己的理解,首先暂停了二十多个已经不需要的计划任务。暂停无用计划任务后,系统总体CPU使用率下降到了60%多,烦人的提醒短信和邮件终于消停了。等待了一天,朋友也没有反馈有功能受影响,说明思路和出手点都正确。

但是200多个用户就这么消耗资源,一定还有什么地方不对劲。今天有空又登录服务器,执行top命令,发现mysql进程一直占据200%多的CPU资源。看过源码的我知道MySQL占用高是有原因的并且是可能的,但还是想看看为什么这么耗资源。

登录MySQL服务器,查看是否开启了slow log:show variables like ‘%slow%’;,发现开启了慢查询日志:

02.png

接着查看日志,查到某条sql语句一直出现在日志中:

03.png

可以看到,执行这条sql语句扫描了38万多行记录。语句涉及到的两张表一张有600多条记录,另一张4万多条记录,相当于全表扫描了4万多的表好几次,怪不得特别慢。

接着检查两张表的索引,除了自增id作为主键外,没有创建其他索引。使用explain执行语句,显示没有使用任何索引:

04.png

接下来,在两张表上分别就查询条件的uid、session_id列上创建索引。索引创建完成后,肉眼可见的CPU占用率和系统负载都降下来了。再次使用explain执行查询语句,索引信息已经用上了,扫描行数大大减少:

05.png

经过上面的优化,目前应用的总体CPU占用率在5%左右,MySQL的CPU占用率大约为15%,系统负载从4降到了0.3。终于暂时不用担心性能问题了,即使服务器配置降到1核CPU也能撑得住。

进一步查看代码并结合日志,创建索引和修改部分查询语句,CPU占用率降到6%左右,终于暂时不用担心性能问题了

总结

工程师在开发工程中,不仅要写出“能用”的代码,更要写出“好用”的代码。本例中通过创建两个索引就能大幅提升系统性能,便是让代码从“能用”转到“好用”。

本文提到的性能优化偏运维,代码中的性能优化暂时还未触碰。但一个总体的原则是不会错的:多使用缓存,尽可能的减少慢IO设备的同步读取。

推荐学习:《mysql视频教程》、《PHP视频教程》

以上就是创建MySQL索引大幅优化某PHP应用性能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1882515.html

(0)
上一篇 2025年2月22日 11:32:15
下一篇 2025年2月22日 11:32:34

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • navicat数据库如何连接php

    第一步,打开Navicat,新建数据库。 第二步,在数据库中新建表。 立即学习“PHP免费学习笔记(深入)”; 相关推荐:《Navicat for mysql使用图文教程》  第三步,保存表。  第四步,表中添加数据。  第五步,打开ide…

    2025年2月23日 数据库
    100
  • mysql与php连接失败的原因是什么

    mysql与php连接失败的原因及解决办法:1、MySQL服务器无法访问,使用ping命令来检查MySQL服务器是否可以被访问;2、MySQL服务器端口被屏蔽或占用,连接MySQL服务器时必须使用正确的端口;3、MySQL用户名或密码不正确…

    2025年2月23日
    100
  • php中prerare如何运用

    在php中prerare的用法是“PDO::prepare”,表示准备要执行的语句,并返回语句对象,其使用语法如“public PDO::prepare(string $statement, array $driver_options = …

    2025年2月23日
    100
  • php二维码活码是什么意思

    php二维码活码是一种用于生成二维码的技术,是一种应用广泛、简单易用、具有很强可塑性的技术,其主要作用是将一些信息,如文本、网址等,转换成二维码形式,就是利用PHP程序语言来生成二维码,并且在生成二维码的同时可以实现对二维码的一些操作,在电…

    2025年2月23日
    100
  • php域名重定向是什么意思

    PHP域名重定向是一种网络技术,它是将用户访问的不同域名重定向到同一个主域名下的方法,例如,个人网站可能由多个域名访问,如www.example.com、example.net、example.org,任何一个域名都可以访问到该网站,但这对…

    2025年2月23日
    100
  • php中为什么要用转义符

    php中转义符的作用:1、在PHP中,单引号内的字符不需要转义,但是双引号内的字符需要转义才能够被正确解释;2、在PHP中,特殊字符需要使用转义符进行处理,例如,:回车符:换行符:制表符:反斜杠$:美元符号&#8221…

    2025年2月23日
    100
  • php可以写区块链吗

    PHP可以写区块链,可以利用“class Block {public 前一个区块的Hash值;public 当前区块的Hash值;public 区块生成的时间戳;public 区块保存的数据;}”代码来定义区块。 本文操作环境:Window…

    2025年2月23日
    100
  • php怎么输出弹窗错误提示

    php输出弹窗错误提示的方法:1、打开相应的PHP文件;2、添加“error_reporting(E_ALL);”;3、通过“function cache_shutdown_error() {…}”方法输出错误信息即可。 本系统…

    2025年2月23日
    100
  • php门户是什么意思

    php门户是一种基于PHP语言开发的Web门户系统,是一种建立在Web服务器上、以 Web 为载体,将网站的所有信息、业务系统和Internet信息资源的分类按照一定的结构组合在一起,为用户提供网上办公、信息查询和交流互动等服务的综合性站点…

    2025年2月23日
    100
  • php如何实现重定向和跳转页面

    php实现重定向和跳转页面:1、创建一个PHP示例文件;2、使用“header()”函数实现重定向,其代码为“header(“Location: http://example.com”)”;3、通过“’e…

    2025年2月23日
    100

发表回复

登录后才能评论