目錄
摘要
PHP层到MySQL层
MySQL层的数据查询
MySQL Server 到 PHP层
服务端缓存模式
服务端无缓存模式
小结
PHP层到用户层
首頁 資料庫 mysql教程 PHP到MySQL数据查询过程概述_MySQL

PHP到MySQL数据查询过程概述_MySQL

Jun 01, 2016 am 11:52 AM
資料查詢 過程

摘要

本文概述了从PHP层发起mysql查询请求到mysql server 返回结果集的工作流程,并简单描述了各层可能涉及到的动作和组件。从全局把握整个交互过程。

PHP层到MySQL层

Php到sql组件层次如下图所示:
Zend->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层的数据查询

这里写图片描述
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。

服务端缓存模式

这里写图片描述
客户端命令: 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。
这里写图片描述vcWxvrLjw+ZteXNxbEluZLrNbGlibXlzcWwgysdNeVNxbCBTZXJ2ZXK2y7XEx/22r7PM0PKho8bk1tCjrGxpYm15c3FsysfNqNPDtcRNeVNRTLLp0a/H/bavs8zQ8qOstvhteXNxbG5kysfXqM6qUEhQyejWw7XEu/nT2lplbmTS/cfmtcRTUUzH/bavo6y8tG15c3FsbmS1xMr9vt3H/bavtq/X99Do0qq+rbn9WmVuZLrNbXlzcWxzZXJ2ZXK9u7ulo6y2+GxpYm15c3Fs1rG907rNbXlzcWxzZXJ2ZXK9u7ultcShozwvcD4NCjxwPrbUscijujxiciAvPg0KZXh0L215c3FsaaOou/LV32V4dC9teXNxbKOpus1saWJteXNxbLXEyv2+3b/isunRr9bQtcS5/bPMzqqjujxiciAvPg0KMaOpbXlzcWnP8mxpYm15c3Fsx/22r7eiy82y6dGvx+vH8zxiciAvPg0KMqOpTGlibXlzcWzWtNDQx+vH87KitcO1vb3hufu8r7TmtKLT8mxpYm15c3FstcRidWZmZXJz1tA8YnIgLz4NCjOjqU15c3Fsacnqx+vE2rTmo7p6dmFs1ri2qLXE0ru/6WJ1ZmZlcjxiciAvPg0KNKOpTXlzcWlptNNsaWJteXNxbL+9sbS94bn7vK+1vXp2YWzWuLaotcRidWZmZXLW0DxiciAvPg0KZXh0L215c3FsaaOou/LV32V4dC9teXNxbKOpus1teXNxbG5ktcTK/b7dv+Ky6dGv1tC1xLn9s8zOqqO6PGJyIC8+DQoxKSBteXNxac/ybXlzcWxuZMf9tq+3osvNsunRr8frx/M8YnIgLz4NCjIpIG15c3FsbmTH/bavzai5/XplbmTS/cfm1rTQ0HNxbLLp0a+jrL3hufu8r7XEw7/Su9DQ08nSu7j2YnVmZmVytOa0oqOouPe49mJ1ZmZlcsrHt9bJorXEo6k8YnIgLz4NCjMpIE15c3FsbmS0tL2otuC49np2YWyjrLKi1rjP8tXi0KlidWZmZXJzPC9wPg0KPHA+wP3I56O6PGJyIC8+DQrU2mV4dC9teXNxbCAmYW1wOyBsaWJteXNxbCDW0KOsbGlibXlzcWzH/bav1rTQ0FNRTNPvvuS687XDtb294bn7vK9Sb3cxflJvdzOjrMi7uvNleHQvbXlzcWy9q73hufu8r7+9sbS1vXplbmQgYnVmZmVy1tCjrNauuvNteXNxbGlfZmV0Y2hfeHh4uq/K/bTTuMPH+NPyxNq05tbQtsHIob3hufu8r9bQtcTE2sjdoaM8YnIgLz4NCtTaZXh0L215c3FsaSAmYW1wOyBteXNxbEluZCDW0KOsbXlzcWxuZCDH/bav1rTQ0FNRTNPvvuS1w7W9veG5+7yvUm93MX5Sb3czo6zG5NbQo6zDv7j2cm931rG909PJemVuZLXE0ru49mJ1ZmZlcrTmtKKjrLKi08nSu7j2enZhbNa4z/Kho7/Nu6e2y82ouf3Ts8nk1rG907TTuMPE2rTmx/jT8tbQtsHIob3hufvKtc/WbXlzcWxpX2ZldGNoX3h4eKGjPC9wPg0KPGgyIGlkPQ=="小结-1">小结

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
Yii框架中的資料查詢:有效率地存取數據 Yii框架中的資料查詢:有效率地存取數據 Jun 21, 2023 am 11:22 AM

Yii框架是一個開源的PHPWeb應用程式框架,提供了眾多的工具和元件,簡化了Web應用程式開發的流程,其中資料查詢是其中一個重要的元件之一。在Yii框架中,我們可以使用類似SQL的語法來存取資料庫,從而有效率地查詢和操作資料。 Yii框架的查詢建構器主要包括以下幾種類型:ActiveRecord查詢、QueryBuilder查詢、命令查詢和原始SQL查詢

如何在CakePHP中進行資料查詢與更新? 如何在CakePHP中進行資料查詢與更新? Jun 03, 2023 pm 02:11 PM

CakePHP是一個流行的PHP框架,它提供了方便的ORM(物件關聯映射)功能,使得查詢和更新資料庫變得非常容易。本文將介紹如何在CakePHP中進行資料查詢與更新。我們將從簡單的查詢和更新開始,逐步深入,了解如何使用條件和關聯的模型來更複雜地查詢和更新資料。基本查詢首先,讓我們來看看如何進行最簡單的查詢。假設我們有一個名為「Users」的資料表,並且我們想要

重返未來19996-24怎麼過 重返未來19996-24怎麼過 Mar 02, 2024 pm 12:58 PM

重返未來1999中玩家會在其中面對很多的關卡挑戰,而且其中一個個不同的關卡所帶來的挑戰都完全不一樣,而6-24作為其中一個關卡,也肯定會有不少玩家想知道這一關卡該如何去進行挑戰吧,所以下面也是會帶來相關的通關方法了。重返未來19996-24通關方法1、一句話掛30層燃燒後,等boss眩暈一頓胖揍。 2、一回合優先用主C和142d掛燃燒。 3.二回合用輔助和奶媽小技能掛燃燒+和主c卡攢個大招。 4.三回合頭目就暈了,然後直接用大招和傷害技能胖揍。

MySQL與Python:如何實作資料查詢功能 MySQL與Python:如何實作資料查詢功能 Jul 31, 2023 pm 01:34 PM

MySQL與Python:如何實現資料查詢功能近年來,資料的快速成長使得資料查詢與分析成為了各個領域的重要任務。而MySQL作為一種廣泛使用的關聯式資料庫管理系統,配合Python這門強大的程式語言,可以提供快速、靈活的資料查詢功能。本文將介紹如何使用MySQL和Python來實作資料查詢功能,並提供程式碼範例。首先,我們需要安裝並設定MySQL和Python

鳴潮異想奇境難度3怎麼過 鳴潮異想奇境難度3怎麼過 Feb 28, 2024 pm 10:19 PM

鳴潮異想奇境難度3怎麼過通關方式分享。鳴潮裡面很多人都在通關這個異想奇境難度3了呢,這一關其實還是有點難度的,很多小伙伴們還不知道該怎麼辦比較好,不過不用擔心,小編為大家帶來了其中的攻略,你也來試試看。鳴潮異想奇境難度3怎麼過鳴鐘之龜角色強化共鳴技能可以提升我們氣動的效果了,這樣一來打出的攻擊效率也會提升到,傷害也會更加的大的,不過大家要是有效果替換也是可以換取的。 〔隱喻〕前三關選擇:林中驕陽:可以讓忌炎的傷害提升很多,技能的使用次數變多的話那麼可以打出非常不錯的暴擊效果了。防護裝置:用共鳴技

如何使用MySQL和Ruby實作一個簡單的資料查詢分析功能 如何使用MySQL和Ruby實作一個簡單的資料查詢分析功能 Sep 21, 2023 pm 04:36 PM

如何使用MySQL和Ruby實作一個簡單的資料查詢分析功能在當今大數據時代,資料分析已經成為了許多領域中不可或缺的一部分。而在進行資料分析時,最常見的操作就是進行資料查詢。本文將介紹如何使用MySQL和Ruby程式語言來實作一個簡單的資料查詢分析功能,並且給出具體的程式碼範例。首先,我們需要安裝MySQL和Ruby的開發環境。 MySQL是一個開源的關聯式資料庫

如何使用 PHP 實現資料驅動和動態內容產生功能 如何使用 PHP 實現資料驅動和動態內容產生功能 Sep 05, 2023 am 10:46 AM

如何使用PHP實現資料驅動和動態內容產生功能在網站開發中的許多場合,我們常常需要根據資料來動態產生內容。 PHP作為一種廣泛使用的伺服器端腳本語言,提供了豐富的功能和工具來實現資料驅動和動態內容生成。本文將介紹如何使用PHP來實現這些功能,並提供相應的程式碼範例。資料驅動資料驅動是指根據資料庫或其他資料來源中的資料來產生內容,以實現動態的展示和互動。 PHP提供

MySQL與TiDB的資料查詢與分析能力對比 MySQL與TiDB的資料查詢與分析能力對比 Jul 13, 2023 pm 11:07 PM

MySQL與TiDB的資料查詢和分析能力比較隨著資料量的不斷增長和應用場景的複雜化,資料查詢和分析能力成為各種資料儲存系統的核心競爭力之一。 MySQL作為關係型資料庫的代表之一,在單機環境下已經得到了廣泛的應用。然而,隨著業務規模的不斷擴大,MySQL在處理大規模資料以及高並發查詢等方面存在一定的限制。 TiDB則是一個新興的分散式資料庫系統,針對這些問題提

See all articles