好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 解讀MySQL的客戶端和服務端協議

解讀MySQL的客戶端和服務端協議

熱門標簽:武漢電銷機器人電話 呂梁外呼系統 南太平洋地圖標注 400電話辦理服務價格最實惠 大豐地圖標注app 北京金倫外呼系統 html地圖標注并導航 400電話變更申請 催天下外呼系統

如果需要從 MySQL 服務端獲得很高的性能,最佳的方式就是花時間研究 MySQL 優化和執行查詢的機制。一旦理解了這些,大部分的查詢優化是有據可循的,從而使得整個查詢優化的過程更有邏輯性。下圖展示了 MySQL 執行查詢的過程:

  1. 客戶端將 SQL 語句發送到服務端。
  2. 服務端檢查查詢緩存。如果緩存中已有數據,則直接返回緩存結果;否則,將 SQL 語句傳遞給下一環節。
  3. 服務端解析、預處理和優化 SQL 語句后,傳遞到查詢優化器中形成查詢計劃。
  4. 查詢執行引擎通過調用存儲引擎接口執行查詢計劃。
  5. 服務端將查詢結果返回給客戶端。

上述的幾個步驟都有其復雜性,接下來幾篇文章將詳細講述各個環節。查詢優化過程尤其復雜,并且理解這一環節很重要。

MySQL 客戶端/服務端協議

雖然并不需要了解 MySQL 客戶端/服務端協議的內部細節,但需要從高應用層面理解其是如何工作的。這個協議是半雙工的,這意味著 MySQL 服務端不同同時發送和接收消息,以及不可以將消息拆成多條短消息發送。這種機制一方面使得 MySQL 的通信簡單快速,另一方面也增加了一些限制。例如,這意味著無法進行流控,一旦一方發送了消息,另一方在響應前必須接收整個消息。這就好像來回打乒乓球一樣,同一時間只有一方有球,只有接到了球才能把它打回去。

客戶端通過單個數據包將查詢語句發送給服務端,因此在存在大的查詢語句時配置 max_allowed_packet 很重要。一旦客戶端發送查詢語句后,它就只能等待返回結果。

相反,服務端的響應通常是由多個數據包組成的。一旦服務端響應后,客戶端必須獲取整個結果集。客戶端沒法簡單地獲取幾行然后告訴服務端不要再發送剩余的數據。如果客戶端僅僅需要返回數據前面的幾行,只能是等待服務端全部數據返回后再從中丟棄不需要的數據,或者是粗暴地斷開連接。不管哪種方式都不是好的選擇,因此合適的 LIMIT子句就顯得十分重要。

大部分的 MySQL連接庫支持獲取整個結果集并在內存中緩存起來,或者是獲取需要的數據行。默認的行為通常是獲取整個結果集然后在內存緩存。知道這一點很重要,因為 MySQL 服務端在所有請求的數據行沒返回前,不會釋放這次查詢的鎖和資源。大部分客戶端庫會讓你感覺數據是從服務端獲取的,實際上這些數據可能僅僅是從緩存中讀取的。這在大部分時間是沒問題的,但對于耗時很久或占據很多內存的大數據量查詢來說就不合適了。如果指定了不緩存查詢結果,那么占用的內存會更小,并且可以更快地處理結果。缺點是這種方式會在查詢時引起 服務端的鎖和資源占用。

以 PHP 為例,以下是PHP常用的查詢代碼:

?php
$link = mysql_connect('localhost', 'user', 'password');
$result = mysql_query('SELECT * FROM huge_table', $link);
while ($row = mysql_fetch_array($result)) {
  //處理數據結果
}

?>

這個代碼看起來好像是只獲取了需要的數據行。然而,這個查詢通過 mysql_query 的調用后實際上將全部結果放到了內存中。而 while 循環實際上是對內存中的數據進行循環迭代。相反,如果使用 mysql_unbuffered_query 替代 mysql_query 的話,那就不會緩存結果。

?php
$link = mysql_connect('localhost', 'user', 'password');
$result = mysql_unbuffered_query('SELECT * FROM huge_table', $link);
while ($row = mysql_fetch_array($result)) {
  //處理數據結果
}

?>

不同的編程語言處理緩存覆蓋的方式不同。例如,Perl 的 DBD::mysql 驅動需要通過 mysql_use_result 屬性指定 C 語音客戶端庫(默認是 mysql_buffer_result),示例如下:

#!/usr/bin/perl

use DBI;
my $dbn = DBI->connect('DBI:mysql:;host=localhost', 'user', 'password');
my $sth = $dbn->prepare('SELECT * FROM huge_table', {mysql_use_result => 1});
$sth->execute();
while (my $row = $sth->fetchrow_array()) {
	#處理數據結果
}

注意到 prepare 指定了使用結果而不是緩存結果。也可以通過在連接的時候指定,這會使得每次查詢都不緩存。

my $dbn = DBI->connect('DBI:mysql:;mysql_use_result=1;host=localhost', 'user', 'password');

以上就是解讀MySQL的客戶端和服務端協議的詳細內容,更多關于MySQL 客戶端和服務端協議的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • MySQL mysqladmin客戶端的使用簡介
  • MySQL 如何連接對應的客戶端進程
  • 解決MySql客戶端秒退問題(找不到my.ini)
  • PHP Swoole異步MySQL客戶端實現方法示例
  • 解決Node.js mysql客戶端不支持認證協議引發的問題
  • mysql8.0.11客戶端無法登陸的解決方法
  • mysql/Java服務端對emoji的支持與問題解決方法詳解
  • 初識NodeJS服務端開發入門(Express+MySQL)
  • 用于App服務端的MySQL連接池(支持高并發)

標簽:迪慶 自貢 麗水 徐州 西寧 無錫 龍巖 南充

巨人網絡通訊聲明:本文標題《解讀MySQL的客戶端和服務端協議》,本文關鍵詞  解讀,MySQL,的,客戶端,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解讀MySQL的客戶端和服務端協議》相關的同類信息!
  • 本頁收集關于解讀MySQL的客戶端和服務端協議的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 窝窝视频成人影院午夜在线| 羞羞漫画??登录入口| 触手怪从下部入侵美女| 一级特黄录像免费播放肥| 男朋友扒开胸罩狂揉吃奶| www.日本一区二区| 天天影视综合视频网站| 女给男下药强睡他h| 美女扒开尿口给男人看大全| 欧美xxxx性特级高清| 厨房愉情理伦片HD| 武则天丰满妇内乱AAAXXX| 亚洲欧美日韩综合| 色噜噜狠狠色综合免费视频| 美娟小雄谭婧铁辉4p小说| 几天没弄你下面是不是又痒了| 好紧好爽好深再快点| 午夜精品视频在线观看美女| 石渠县| 国产免费又色又爽又黄mv| 欧美一卡2卡3卡4卡免费| 韩国黄色网址| 97se色综合一区二区三区| 人妻亂倫激情文学区| 12学生小嫩嫩裸体喷水视频| 全肉np变态奶汁| 在线视频天堂| 亚洲精品午夜久久电影| 亚洲福利一区福利三区| 91综合视频| 乳罩脱了喂男人吃奶视频| 国产91??丝袜在线播放00| 国产一区二区高清在线| 看内裤就知道怀没怀孕| 人与拘一级a毛片| 91人成网站色www免费| 亚欧乱色| 小妾裸体跪趴撅着给人玩弄| 91偷自产一区二区三区堕落人妻| 五月天六月色| 国产精品亚洲第一区柳州莫青|