PHP到MySQL数据查询过程概述

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

HP层到MySQL层

Php到sql组件层次如下图所示:

PHP到MySQL数据查询过程概述

ext/mysqli和ext/mysql 是客户端的扩展程序库(库函数) ,在客户端脚本层面的扩展库。 Mysqli库是mysql库的扩展版本,扩展版本增加了列版定(Bind Column)绑定。PDO (PHP Data Object) 是另外一种面向数据对象的 扩展库。这些扩展库直接面向编程者,而它的底层实现是mysql连接引擎(如mysqlnd和libmysql )(参考 http://bbs.chinaunix.net/thread-3679393-1-1.html 、http://blog.csdn.net/treesky/article/details/7286098 )。

mysqlnd和libmysql 是PHP端(客户端)的数据库连接驱动引擎。libmysql 是通用的数据库连接引擎,而mysqlnd是专属PHP开发的连接引擎,从属于Zend中。 当PHP通过调用扩展库(ext/mysqli和ext/mysql)中的mysql_query() 函数进行数据库查询的时候,Zend引擎将通过mysql(mysqlnd和libmysql)查询引擎向MySQL服务器发出查询请求。

MySQL层的数据查询

PHP到MySQL数据查询过程概述

MySQL服务器接受到客户端的查询请求后,查询执行过程如上图所示:
1. 查询缓存,如果命中则直接将结果集返回给到客户端,否则进入步骤2
2. 对SQL语句依次进行解析、预处理、查询优化等操作,最终生成查询执行计划(select的查询执行计划可以通过explain select 查看)
3. MySQL服务端的查询执行引擎将依据查询执行计划 调用存储引擎对数据进行查询。当SQL语句的最后一层关联被执行后,将产生查询结果集
4. 查询结果集发送到客户端,传回的方式有两种:MySQL服务端缓存结果集 或 不缓存,这个由参数SQL_BUFFER_RESULT设置。 并且,如果用户设置了SQL_CACHE 那么本次的查询的结果集的一份副本存储于 查询缓存 中(步骤1相关)。

SQL_CACHE参数的启示:
将复杂的(多个关联)查询分解为多条简单的查询,因为
1)简单查询的缓存命中搞、
2)复杂查询结果的缓存易失效(关联太多表)
3)简单查询锁的持有率低

MySQL Server 到 PHP层

通信模式MySQL Server和客户端的通信采用“半双工通信”,意思是:客户端和服务端只能有一个在读,并且另外一个必须是写。

优点:协议简单,客户端和服务端的写权限是互斥的

缺点:无法进行流量控制,一端开始发送消息,另一端要完整的接受这个消息后才能响应它。

启示:服务端查询后的结果集发送给客户端,客户端(客户端的查询引擎,例如mysqlnd)必须完整的接受。所以,如果只需要少数行,记得在sql语句添加使用limit,少用select *。

结果集回传模式结果集回传中,每一行记录都通过 客户端-服务器通信协议进行包装,然后再交接给下层的tcp协议;当然,在tcp层,可以先缓存每行记录的协议包,组成大包在发出(对应用层透明)。

MySQL服务端只有将结果集全部发送给客户端后,才能释放结果集所占用的buffer。

服务端缓存模式

PHP到MySQL数据查询过程概述


客户端命令: mysql_unbuffer_query(),在客户端的sql驱动扩展(mysqlnd)中不设置结果集的缓存,所以在fecth_array_xxx从结果集中读取一条记录时,需要从服务端的缓冲区中读取。

服务端无缓存模式

PHP到MySQL数据查询过程概述


客户端命令: mysql_query(),在客户端的sql驱动扩展(mysqlnd)中设置了buffer用于缓存服务端的结果集,所以在fecth_array_xxx从结果集中读取一条记录时,是直接从mysqlnd扩展的缓冲区中取得row。

小结

如果结果集很大: 服务端无缓存模式可以减少服务端的内存压力哟,但是占用客户端的内存。这样只有看情况取舍了。

PHP层到用户层

在客户端,于服务端对接的是mysql扩展引擎(libmysql 或者 mysqlnd),而用户层是通过扩展库(ext/mysql 或 ext/mysqli)和mysql引擎进行交互(启示就是调用引擎的api读取结果集)。

引 擎libmysql 和 mysqlnd 的机制并不同,主要区别是mysqlnd是转为php写的,被编译到zend内部。而libmysql是通用的库,zend需要调用该库实现数据库的连 接。在这种却别下,mysqlnd和zend具有更好的粘合性,在数据传输到用户层时,少了一层数据的拷贝。具体的架构区别如下图所示。图中,五角星表示 缓存 buffer。


PHP到MySQL数据查询过程概述


ext/mysqli和ext/mysql 是客户端的扩展程序库(库函数) : 在客户端脚本层面mysqlInd和libmysql 是MySQL Server端的驱动程序。其中,libmysql是通用的MySQL查询驱动程序,而mysqlnd是专为PHP设置的基于Zend引擎的SQL驱动,即mysqlnd的数据驱动动作需要经过Zend和mysqlserver交互,而libmysql直接和mysqlserver交互的。

对比:
ext/mysqli(或者ext/mysql)和libmysql的数据库查询中的过程为:
1)mysqi向libmysql驱动发送查询请求
2)Libmysql执行请求并得到结果集存储域libmysql的buffers中
3)Mysqli申请内存:zval指定的一块buffer
4)Mysqii从libmysql拷贝结果集到zval指定的buffer中
ext/mysqli(或者ext/mysql)和mysqlnd的数据库查询中的过程为:
1) mysqi向mysqlnd驱动发送查询请求
2) mysqlnd驱动通过zend引擎执行sql查询,结果集的每一行由一个buffer存储(各个buffer是分散的)
3) Mysqlnd创建多个zval,并指向这些buffers

例如:
在ext/mysql & libmysql 中,libmysql驱动执行SQL语句后得到结果集Row1~Row3,然后ext/mysql将结果集拷贝到zend buffer中,之后mysqli_fetch_xxx函数从该区域内存中读取结果集中的内容。
在ext/mysqli & mysqlInd 中,mysqlnd 驱动执行SQL语句得到结果集Row1~Row3,其中,每个row直接由zend的一个buffer存储,并由一个zval指向。客户端通过映射直接从 该内存区域中读取结果实现mysqli_fetch_xxx。

小结

mysqlnd和zend更具有粘合性,在sql查询驱动中,mysqlnd通过zend引擎访问数据库,并直接将将结果存储域zend的buffer中,相比libmysql驱动(独立于zend),少了一次结果集缓存拷贝。

参考

《高性能MySQL》

http://www.cnxct.com/libmysql-mysqlnd-which-is-best-and-what-about-mysqli-pdomysql-mysql/

http://www.cnxct.com/wp-content/uploads/2012/12/andrey-mysqlnd.pdf

版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文章,未经博主允许不得转载。

以上就介绍了PHP到MySQL数据查询过程概述,包括了方面的内容,希望对MySql有兴趣的朋友有所帮助。

电脑/手机小常识:取消共享文档
默认情况下,在Windows XP中打开我的电脑,会看到在硬盘图标上方有一些文件夹。这些就是“共享文件夹”,这里有每一个用来户共享文件所用的文件夹。我们可以让这些文件夹在我的 电脑中消失,原理很简单,只要打开注册表找到如下位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows \CurrentVersion\ Explorer\MyComputer\NameSpace\DelegateFolders,把 {59031a47-3f72-44a7-89c5-5595fe6b30ee}键值删掉,下次打开我的电脑,这些烦人的文件夹就不复存在了。


来源:51CTO

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
关系型数据库 MySQL 数据库
【MySQL基础篇】MySQL概述、Windows下载MySQL8.0超详细图文安装教程
在这一章节,主要介绍两个部分,数据库相关概念及MySQL数据库的介绍、下载、安装、启动及连接。接着,详细描述了MySQL 8.0的版本选择与下载,推荐使用社区版(免费)。安装过程包括自定义安装路径、配置环境变量、启动和停止服务、以及客户端连接测试。此外,还提供了在同一台电脑上安装多个MySQL版本的方法及卸载步骤。最后,解释了关系型数据库(RDBMS)的特点,即基于二维表存储数据,使用SQL语言进行操作,格式统一且便于维护。通过具体的结构图展示了MySQL的数据模型,说明了数据库服务器、数据库、表和记录之间的层次关系。
【MySQL基础篇】MySQL概述、Windows下载MySQL8.0超详细图文安装教程
|
24天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
1天前
|
SQL Oracle 关系型数据库
【MySQL】——数据查询_进阶操作(超详细)!!
聚合查询,联合查询,内外连接,子查询,合并查询爽歪歪
|
25天前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
26 4
|
27天前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效协同开发策略####
本文深入探讨了PHP与MySQL在Web开发中的协同工作机制,通过优化配置、最佳实践和高级技巧,展示了如何提升数据库交互性能,确保数据安全,并促进代码可维护性。我们将从环境搭建讲起,逐步深入到查询优化、事务管理、安全防护及性能调优等核心环节,为开发者提供一套实战驱动的解决方案框架。 ####
|
20天前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
23 0
|
27天前
|
关系型数据库 MySQL PHP
PHP与MySQL的深度整合:构建高效动态网站####
在当今这个数据驱动的时代,掌握如何高效地从数据库中检索和操作数据是至关重要的。本文将深入探讨PHP与MySQL的深度整合方法,揭示它们如何协同工作以优化数据处理流程,提升网站性能和用户体验。我们将通过实例分析、技巧分享和最佳实践指导,帮助你构建出既高效又可靠的动态网站。无论你是初学者还是有经验的开发者,都能从中获得宝贵的见解和实用的技能。 ####
21 0
|
3月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
1月前
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
43 0
|
3月前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
164 9