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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP到MySQL数据查询过程概述HP层到MySQL层Php到sql组件层次如下图所示:ext/mysqli和ext/mysql 是客户端的扩展程序库(库函数) ,在客户端脚本层面的扩展库。 Mysqli库是mysql库的扩展版本,扩展版本增加了列版定(Bind Column)绑定。PDO (PHP Data Object) 是另外一种面向数据对象的 扩展库。这些扩展库直接面向编程者,而它的底层实现是mysql连接引擎(如mysqlnd和libmysql )(参考 /thread-3679393-1-1.html 、/treesky/article/details/7286098 )。mysqlnd和libmysql 是PHP端(客户端)的数据库连接驱动引擎。libmysql 是通用的数据库连接引擎,而mysqlnd是专属PHP开发的连接引擎,从属于Zend中。 当PHP通过调用扩展库(ext/mysqli和ext/mysql)中的mysql_query() 函数进行数据库查询的时候,Zend引擎将通过mysql(mysqlnd和libmysql)查询引擎向MySQL服务器发出查询请求。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)简单查询锁的持有率低My/article/search_SQL+Server/SQL Server 到 PHP层通信模式My/article/search_SQL+Server/SQL Server和客户端的通信采用“半双工通信”,意思是:客户端和服务端只能有一个在读,并且另外一个必须是写。优点:协议简单,客户端和服务端的写权限是互斥的缺点:无法进行/article/search_%e6%b5%81%e9%87%8f/流量控制,一端开始发送消息,另一端要完整的接受这个消息后才能响应它。启示:服务端查询后的结果集发送给客户端,客户端(客户端的查询引擎,例如mysqlnd)必须完整的接受。所以,如果只需要少数行,记得在sql语句添加使用limit,少用select *。结果集回传模式结果集回传中,每一行记录都通过 客户端-服务器通信协议进行包装,然后再交接给下层的tcp协议;当然,在tcp层,可以先缓存每行记录的协议包,组成大包在发出(对应用层透明)。MySQL服务端只有将结果集全部发送给客户端后,才能释放结果集所占用的buffer。服务端缓存模式客户端命令: mysql_unbuffer_query(),在客户端的sql驱动扩展(mysqlnd)中不设置结果集的缓存,所以在fecth_array_xxx从结果集中读取一条记录时,需要从服务端的缓冲区中读取。服务端无缓存模式客户端命令: 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。ext/mysq

文档评论(0)

wuailuo + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档