成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PHP到MySQL數據查詢過程概述

開發 后端
本篇文章主要介紹了"PHP到MySQL數據查詢過程概述",主要涉及到方面的內容,對于MySql感興趣的同學可以參考一下:

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}鍵值刪掉,下次打開我的電腦,這些煩人的文件夾就不復存在了。

 
 
 
責任編輯:王雪燕 來源: ordeder的博客
相關推薦

2022-02-07 07:37:14

MySQL數據查詢

2013-09-08 22:40:38

EF Code Fir數據查詢架構設計

2023-02-24 16:37:04

MySQL數據查詢數據庫

2015-06-15 12:58:39

大數據大數據查詢

2009-09-18 13:58:00

LINQ查詢數據庫

2017-12-20 15:10:09

HBaseHadoop數據

2010-09-25 09:12:44

SQL Server

2010-05-27 10:35:09

查詢MySQL數據

2009-01-19 08:59:04

PHP調用MySQL存儲過程MySQLi擴展

2009-09-28 13:29:41

加載過程Hibernate訪問

2022-01-12 18:35:54

MongoDB數據查詢

2021-09-16 23:33:41

大數據Sentry監控

2017-09-01 09:52:20

PythonPandas數據分析

2009-09-10 16:28:17

LINQ查詢

2010-06-01 16:50:29

MySQL存儲過程

2009-09-03 11:42:32

2020-11-26 15:51:11

SQL數據庫大數據

2024-12-20 16:41:22

2023-11-28 07:48:23

SQL Server數據庫

2023-09-07 07:30:26

Oracle數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在线观看视频 | 在线欧美一区二区 | 粉嫩国产精品一区二区在线观看 | 国产第一页在线观看 | 久久久国产一区二区三区 | 欧美激情一区二区 | 成年人黄色一级片 | 国产日韩欧美在线 | 欧美激情一区 | 亚洲国产精品99久久久久久久久 | 亚洲一区二区三区免费在线观看 | 日韩国产三区 | 亚洲一页 | 神马福利 | 久久久精品视频一区二区三区 | 久久亚 | 亚洲精品欧美精品 | 欧美成人精品在线 | 中文字幕在线看 | 日韩精品一区二区三区中文字幕 | 国产亚洲精品精品国产亚洲综合 | 日韩在线免费视频 | 日韩中文字幕一区 | 久久久久久久亚洲精品 | 91久久久久久久久久久久久 | 日韩精品免费视频 | www.一区二区三区.com | 久久久久久高潮国产精品视 | 亚洲国产精品自拍 | 91不卡在线 | 一区二区视屏 | 伊人久久免费视频 | 自拍偷拍第一页 | 五月精品视频 | 国产资源网 | 日韩av一区在线观看 | 免费的日批视频 | 亚洲一区二区综合 | 香蕉视频一区二区 | 国产精品免费看 | 在线观看视频一区二区三区 |