不是 PHP 不行了,而是 MySQL 数据库扛不住啊
大家好,我是码农先森。
大多数的业务场景下 PHP 还没有达到性能瓶颈,然而 MySQL 数据库就先行驾崩了。但我们总是不分青红皂白,一股脑的把原因归结于是 PHP 语言不行了,每当遇到这种情形我就会感叹到 PHP 的命真苦啊。PHP 作为一门优秀的开源编程语言,在编程语言界一直享有「PHP是世界上最好的语言」的美誉,它让 PHP 靓仔们养了家糊了口过上了小康生活,但一遇到点性能问题就被疯狂的吐槽,它真是干了件吃力不讨好的活。当然我相信这种吐槽是少数的,绝大数的人都还是会秉承理性公正的眼光来看待 PHP 语言,在碰到问题时会仔细分析缘由,找到问题的症结并解决它,让 PHP 绽放属于它自己的光芒。

还记得在之前的工作经历中,使用 ThinkPHP 框架开发公司内部的 ERP 后台系统,很多的情况都是数据库拖慢了用户的访问速度,比如开发的一些财务数据报表,这些接口往往都会聚合了好几张数据表的数据,左连接一张表右连接一张表,动不动还搞个全连接,这能不慢嘛。不仅如此,还有在一个接口里 SQL 语句的查询都嵌套了好几层,各种子查询漫天飞,这样的代码现状简直惨不忍睹,数据量小的时候尚且能用不会影响用户的体验,当数据量上来时接口就经常搞超时,数据库的慢日志都打满了。在我印象中有个最深刻的例子,就是有一个速卖通的产品编辑功能,一个页面需要能同时编辑几十个产品,这就是所谓的批量编辑,而且每个产品的详情数据特别多,还包括很多的图片,每次加载这些数据和图片就半天了,这个功能使用人数最多、使用次数最频繁,同时也是被吐槽的最多的。如果有开发过类似功能的朋友,可能会有比较深刻的感触。

还有一种用脚本跑异步任务的场景,由于有些报表用接口是真的搞不出来了,那就用脚本的方式定时计算。但当时由于我们的数据量比较大,都是上百万千万级别的,单进程跑数据太慢,为了提升效率就直接干上了 PHP 多进程。那时我们还满心欢喜的 Fork 着进程,一启动脚本就是并发几十个进程,结果现实情况就是给我们当头一棒,阿里云 MySQL 数据库监控系接连报警,登上云控制台一看傻眼了,CPU 直接干到 100% 满载运行,搞的 ERP 后台系统都无法正常访问了。还被技术老大当头呵斥你们搞什么飞机,吓得我们赶紧通过 Kill 命令把脚本进程强制杀掉。说到这里可能有些朋友会有些疑惑了,为什么异步脚本会影响到 ERP 后台系统呢?原因是大多数的 PHP 靓仔们都有直接在线上环境修改代码的习惯,当然这种事情在我们这里也不例外了哈哈,甚至有时都变成了常态,感觉就是怎么方便怎么来。所有的业务都是共享一个数据库,这不就影响到 ERP 后台系统了嘛。

通过谈我之前的经历,可以看出并不是 PHP 不行,而是因为没有正确的使用好 PHP 而把数据库搞垮了,单纯的责怪 PHP 语言本身没有任何意义。很多时候性能的瓶颈,往往都是先在数据库层面出现,比如某些查询没有命中索引、子查询嵌套层数过多、长事务造成死锁、并发大量的操作造成负载过高等等。总而言之,在我的经历中把 PHP 语言干出性能瓶颈的场景还是占少数,夸张点可以说几乎没有哈哈,可能是我资历尚浅,不过话又说回来,大家的经历和我的应该也差不多。最后希望大家可以在数据库层面多花一些功夫,而不是纠结于这门语言到底行不行了,如果数据库都不行了,那么换什么语言都是白瞎,愿这一点大家能有相应的共识。本次的分享内容就到这里结束了,希望对大家能有所启发。
感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。

不是 PHP 不行了,而是 MySQL 数据库扛不住啊的更多相关文章
- 基于Mysql数据库亿级数据下的分库分表方案
移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据的用户行为分析等这样的分析,都需要依靠数据都统计和分析,当数据量小时,问题没有暴露出来,数据库方面的优化显得不太重要,一旦数据量越来越大时, ...
- 阅读之MySQL数据库分表
移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据等这样的分析,都需要依靠数据统计和分析,当数据量小时,数据库方面的优化显得不太重要,一旦数据量越来越大,系统响应会变慢,TPS直线下降,直至 ...
- MYSQL数据库的优化
我们究竟应该如何对MySQL数据库进行优化?下面我就从MySQL对硬件的选择.MySQL的安装.my.cnf的优化.MySQL如何进行架构设计及数据切分等方面来说明这个问题. 服务器物理硬件的优化 在 ...
- [转]MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验
本文转自:http://liangweilinux.blog.51cto.com/8340258/1728131 年,嘿,废话不多说,下面开启MySQL优化之旅! 我们究竟应该如何对MySQL数据库进 ...
- MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验
原文地址:http://liangweilinux.blog.51cto.com/8340258/1728131 首先在此感谢下我的老师年一线实战经验,我当然不能和我的老师平起平坐,得到老师三分之一的 ...
- Javaweb 第5天 mysql 数据库课程
MySQL数据库课程 两日大纲 ● 数据库的概念.MySQL快速入门.SQL语言简介 ● 数据库操作.表操作.数据记录操作.数据类型和约束 ● 查询 ● 多表关系.多表连接查询 ● 视图 ● 数据备份 ...
- MySQL 之 MySQL数据库的优化
服务器物理硬件的优化 在挑选硬件服务器时,我们应该从下面几个方面着重对MySQL服务器的硬件配置进行优化,也就是说将项目中的资金着重投入到如下几处: 1.磁盘寻道能力(磁盘I/O),我们现在用的都是S ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
- MySQL数据库和InnoDB存储引擎文件
参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...
随机推荐
- 蚁群算法及 TSP 问题上的应用
群智能(Swarm intelligence) 自然界动物群,称之为群. 群的特征: 相互作用的相邻个体的集合 个体的行为简单,既有竞争又有协作 智能化的集体行为(1+1>2): 个体间不仅能够 ...
- 面试官:告诉我为什么static和transient关键字修饰的变量不能被序列化?
一.写在开头 在上一篇学习序列化的文章中我们提出了这样的一个问题: "如果在我的对象中,有些变量并不想被序列化应该怎么办呢?" 当时给的回答是:不想被序列化的变量我们可以使用tra ...
- 02-HTML知识点
01 元素的介绍 02 元素的属性 03 元素的嵌套关系 04 HTML结构分析 4.1 文档声明[这个不叫元素] 4.2 html元素 4.3 head元素 主要用来写文档的配置信息 05 HTML ...
- 高通参考设计中MTP与QRD
高通参考设计中MTP与QRD 背景 之前在调试设备树的时候,看到设备树带了一个qrd的后缀,一直没搞清楚.上网找资料也好像不是我想要的. 今天查阅lk侧的代码,发现了HW_PLATFORM_HRD这个 ...
- 基于 SQLite 3 的 C 学习:2-高级操作
基于 SQLite 3 的 C/C++ 学习:2-高级操作与有关函数 背景 基于 SQLite 3 的 C/C++ 学习:开发流程 与 基本函数 中,我们简单介绍了有关 SQLite3 函数的使用. ...
- C#/.NET/.NET Core优秀项目和框架2024年6月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...
- Java 面向对象编程之InstanceOf关键词和多态
InstanceOf关键字使用,什么是多态 InstanceOf关键字 是Java的一个二元操作符(运算符),也是Java的保留关键字 语法 //如果该object 是该class的⼀个实例,那⼀个实 ...
- yb课堂 新版SSM-SpringBoot2.X 后端项目框架搭建 《二》
在线创建 https://start.spring.io/ 依赖项 Spring Boot核心包 <dependency> <groupId>org.springframewo ...
- C语言基础要点
C语言基础 C语言基础 C程序编译过程 C程序编译步骤 汇编语言 32关键字 数据类型 常量 size程序 类型限定 goto语句 指针 指针和字符串 作用域 函数 内存 进程内存结构 可执行文件结构 ...
- Sonar 扫描之分析参数介绍
Sonar扫描之分析参数介绍 强制参数 服务器 Key 描述 默认 sonar.host.url 服务器网址 http://localhost:9000 项目配置 Key 描述 默认 sonar.pr ...