PHP到MySQL数据查询过程概述.docx

上传人:牧羊曲112 文档编号:4887597 上传时间:2023-05-21 格式:DOCX 页数:6 大小:134.13KB
返回 下载 相关 举报
PHP到MySQL数据查询过程概述.docx_第1页
第1页 / 共6页
PHP到MySQL数据查询过程概述.docx_第2页
第2页 / 共6页
PHP到MySQL数据查询过程概述.docx_第3页
第3页 / 共6页
PHP到MySQL数据查询过程概述.docx_第4页
第4页 / 共6页
PHP到MySQL数据查询过程概述.docx_第5页
第5页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《PHP到MySQL数据查询过程概述.docx》由会员分享,可在线阅读,更多相关《PHP到MySQL数据查询过程概述.docx(6页珍藏版)》请在三一办公上搜索。

1、PHP到MySQL数据查询过程概述HP层到MySQL层Php到sql组件层次如下图所示:ext/mysqli PDO/IVIySQLMySQL Client Library - librrtysql-MySCftServerext/mysqli和ext/mysql是客户端的扩展程序库(库函数),在客户端脚本层面的扩展库。Mysqli库是mysql库的扩展版本,扩展版本增加了列版定(Bind Column)绑定。PDO (PHP Data Object)是另外一种面向数据对象的扩展库。这些扩展库直接面向编程者,而它的底层实现 是 mysql 连 接引擎 (如 mysqlnd 和 libmysql

2、 ) (参考 mysqlnd和libmysql是PHP端(客户端)的数据库连接驱动引擎。libmysql是通用的数据库 连接引擎,而mysqlnd是专属PHP开发的连接引擎,从属于Zend中。当PHP通过调用扩 展库(ext/mysqli和ext/mysql)中的mysql_query()函数进行数据库查询的时候,Zend引擎 将通过mysql (mysqlnd和libmysql)查询引擎向MySQL服务器发出查询请求。MySQL层的数据查询*1,- - -辩虹谎-一喜白#单事耳SJHIanMySQL服务器接受到客户端的查询请求后,查询执行过程如上图所示:1. 查询缓存,如果命中则直接将结果集

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

4、关联)查询分解为多条简单的查询,因为1)简单查询的缓存命中搞、2)复杂查询结果的缓存易失效(关联太多表)3)简单查询锁的持有率低MySQL Server 到 PHP 层通信模式MySQL Server和客户端的通信采用“半双工通信”,意思是:客户端和服务端只 能有一个在读,并且另外一个必须是写。优点:协议简单,客户端和服务端的写权限是互斥的缺点:无法进行流量控制,一端开始发送消息,另一端要完整的接受这个消息后才能响应它。 启示:服务端查询后的结果集发送给客户端,客户端(客户端的查询引擎,例如mysqlnd) 必须完整的接受。所以,如果只需要少数行,记得在sql语句添加使用limit,少用sel

5、ect*。 结果集回传模式结果集回传中,每一行记录都通过客户端-服务器通信协议进行包装,然后 再交接给下层的tcp协议;当然,在tcp层,可以先缓存每行记录的协议包,组成大包在发 出(对应用层透明)。MySQL服务端只有将结果集全部发送给客户端后,才能释放结果集所占用的buffer。服务端缓存模式客户端命令:mysql_unbuffer_query(),在客户端的sql驱动扩展(mysqlnd)中不设置结果 集的缓存,所以在fecth_array_xxx从结果集中读取一条记录时,需要从服务端的缓冲区中读 取。服务端无缓存模式客户端命令:mysql_query(),在客户端的sql驱动扩展(my

6、sqlnd)中设置了 buffer用于缓 存服务端的结果集,所以在fecth_array_xxx从结果集中读取一条记录时,是直接从mysqlnd 扩展的缓冲区中取得row。小结如果结果集很大:服务端无缓存模式可以减少服务端的内存压力哟,但是占用客户端的内 存。这样只有看情况取舍了。PHP层到用户层在客户端,于服务端对接的是mysql扩展引擎(libmysql或者mysqlnd),而用户层是通过 扩展库(ext/mysql或ext/mysqli)和mysql引擎进行交互(启示就是调用引擎的api读取结 果集)。引擎libmysql和mysqlnd的机制并不同,主要区别是mysqlnd是转为php

7、写的,被编译 到zend内部。而libmysql是通用的库,zend需要调用该库实现数据库的连接。在这种却别 下,mysqlnd和zend具有更好的粘合性,在数据传输到用户层时,少了一层数据的拷贝。 具体的架构区别如下图所示。图中,五角星表示缓存buffer。-Ines s hold results only once m enemory: op to t?u怕 saving -ott-en teas ope ration s to performc?php $a mysqli_fe-tch_aEsoc($res4a:g exVmysqlimy&qlnd T,MySQL Serve-re g.

8、 ext/mysqthbmysqlZualEtnjcitire- wilh *ptrRow 1 Row 2 Raw 3 =MySQL Serverext/mysqli和ext/mysql是客户端的扩展程序库(库函数):在客户端脚本层面mysqlInd和 libmysql是MySQL Server端的驱动程序。其中,libmysql是通用的MySQL查询驱动程序 而mysqlnd是专为PHP设置的基于Zend引擎的SQL驱动,即mysqlnd的数据驱动动作需要 经过Zend和mysqlserver交互,而libmysql直接和mysqlserver交互的。对比:ext/mysqli(或者ext/

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

10、并指向这些buffers例如:在ext/mysql & libmysql中,libmysql驱动执行SQL语句后得到结果集Row1Row3,然后 ext/mysql将结果集拷贝到zend buffer中,之后mysqli_fetch_xxx函数从该区域内存中读取结 果集中的内容。在ext/mysqli & mysqlInd中,mysqlnd驱动执行SQL语句得到结果集Row1Row3,其中, 每个row直接由zend的一个buffer存储,并由一个zval指向。客户端通过映射直接从该 内存区域中读取结果实现mysqli_fetch_xxx。小结mysqlnd和zend更具有粘合性,在sql查询

11、驱动中,mysqlnd通过zend引擎访问数据库,并 直接将将结果存储域zend的buffer中,相比libmysql驱动(独立于zend),少了一次结果 集缓存拷贝。参考高性能MySQL /版权声明:本文为博主(以上就介绍了 PHP到MySQL数据查询过程概述,包括了方面的内容,希望对MySql有兴趣 的朋友有所帮助。电脑/手机小常识:取消共享文档默认情况下,在Windows XP中打开我的电脑,会看到在硬盘图标上方有一些文件夹。这些 就是“共享文件夹”,这里有每一个用来户共享文件所用的文件夹。我们可以让这些文件夹 在我的电脑中消失,原理很简单,只要打开注册表找到如下位置: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerMyComputerNameSpaceDelegateFolders,把59031a47-3f72-44a7-89c5-5595fe6b30ee键值删掉,下次打开我的电脑,这些烦人的文件夹 就不复存在了。【编辑推荐】我用爬虫一天时间“偷了 ”知乎一百万用户,只为证明PHP是世界上最好的语言PHP和Node.js的10项对比挑战10个必须收藏的PHP代码样例PHP: 6种GET和POST请求发送方法十五套专为开发人员打造的PHP资源库PHP性能分析与实验性能的宏观分析

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号