欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解讀MySQL的客戶端和服務(wù)端協(xié)議

 更新時(shí)間:2021年05月10日 14:09:34   作者:島上碼農(nóng)  
這篇文章主要介紹了MySQL的客戶端和服務(wù)端協(xié)議的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下

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

  1. 客戶端將 SQL 語句發(fā)送到服務(wù)端。
  2. 服務(wù)端檢查查詢緩存。如果緩存中已有數(shù)據(jù),則直接返回緩存結(jié)果;否則,將 SQL 語句傳遞給下一環(huán)節(jié)。
  3. 服務(wù)端解析、預(yù)處理和優(yōu)化 SQL 語句后,傳遞到查詢優(yōu)化器中形成查詢計(jì)劃。
  4. 查詢執(zhí)行引擎通過調(diào)用存儲(chǔ)引擎接口執(zhí)行查詢計(jì)劃。
  5. 服務(wù)端將查詢結(jié)果返回給客戶端。

上述的幾個(gè)步驟都有其復(fù)雜性,接下來幾篇文章將詳細(xì)講述各個(gè)環(huán)節(jié)。查詢優(yōu)化過程尤其復(fù)雜,并且理解這一環(huán)節(jié)很重要。

MySQL 客戶端/服務(wù)端協(xié)議

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

客戶端通過單個(gè)數(shù)據(jù)包將查詢語句發(fā)送給服務(wù)端,因此在存在大的查詢語句時(shí)配置 max_allowed_packet 很重要。一旦客戶端發(fā)送查詢語句后,它就只能等待返回結(jié)果。

相反,服務(wù)端的響應(yīng)通常是由多個(gè)數(shù)據(jù)包組成的。一旦服務(wù)端響應(yīng)后,客戶端必須獲取整個(gè)結(jié)果集??蛻舳藳]法簡(jiǎn)單地獲取幾行然后告訴服務(wù)端不要再發(fā)送剩余的數(shù)據(jù)。如果客戶端僅僅需要返回?cái)?shù)據(jù)前面的幾行,只能是等待服務(wù)端全部數(shù)據(jù)返回后再?gòu)闹衼G棄不需要的數(shù)據(jù),或者是粗暴地?cái)嚅_連接。不管哪種方式都不是好的選擇,因此合適的 LIMIT子句就顯得十分重要。

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

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

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

?>

這個(gè)代碼看起來好像是只獲取了需要的數(shù)據(jù)行。然而,這個(gè)查詢通過 mysql_query 的調(diào)用后實(shí)際上將全部結(jié)果放到了內(nèi)存中。而 while 循環(huán)實(shí)際上是對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行循環(huán)迭代。相反,如果使用 mysql_unbuffered_query 替代 mysql_query 的話,那就不會(huì)緩存結(jié)果。

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

?>

不同的編程語言處理緩存覆蓋的方式不同。例如,Perl 的 DBD::mysql 驅(qū)動(dòng)需要通過 mysql_use_result 屬性指定 C 語音客戶端庫(kù)(默認(rèn)是 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()) {
	#處理數(shù)據(jù)結(jié)果
}

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

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

以上就是解讀MySQL的客戶端和服務(wù)端協(xié)議的詳細(xì)內(nèi)容,更多關(guān)于MySQL 客戶端和服務(wù)端協(xié)議的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Windows環(huán)境MySQL全量備份+增量備份的實(shí)現(xiàn)

    Windows環(huán)境MySQL全量備份+增量備份的實(shí)現(xiàn)

    本文主要介紹了Windows環(huán)境MySQL全量備份+增量備份的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 利用JuiceFS使MySQL?備份驗(yàn)證性能提升?10?倍

    利用JuiceFS使MySQL?備份驗(yàn)證性能提升?10?倍

    這篇文章主要介紹了如何讓?MySQL?備份驗(yàn)證性能提升?10?倍,JuiceFS?非常適合用來做?MySQL?物理備份,通過不斷調(diào)整?XtraBackup?的參數(shù)和?JuiceFS?的掛載參數(shù),在一個(gè)小時(shí)內(nèi)將時(shí)間縮短到原先的?1/10,下文一起來看相關(guān)內(nèi)容的詳細(xì)介紹吧
    2022-03-03
  • mysql5.7.17.msi安裝圖文教程

    mysql5.7.17.msi安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17.msi安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • mysql myisam 優(yōu)化設(shè)置設(shè)置

    mysql myisam 優(yōu)化設(shè)置設(shè)置

    mysql myisam 優(yōu)化設(shè)置設(shè)置,需要的朋友可以參考下。
    2010-03-03
  • MySQL之Innodb_buffer_pool_size設(shè)置方式

    MySQL之Innodb_buffer_pool_size設(shè)置方式

    這篇文章主要介紹了MySQL之Innodb_buffer_pool_size設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Mysql8.0密碼問題mysql_native_password和caching_sha2_password詳解

    Mysql8.0密碼問題mysql_native_password和caching_sha2_password詳解

    這篇文章主要介紹了Mysql8.0密碼問題mysql_native_password和caching_sha2_password,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 解決mysql的int型主鍵自增問題

    解決mysql的int型主鍵自增問題

    這篇文章主要介紹了解決mysql的int型主鍵自增問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 淺析MySQL的注入安全問題

    淺析MySQL的注入安全問題

    這篇文章主要介紹了淺析MySQL的注入安全問題,文中簡(jiǎn)單說道了如何避免SQL注入敞開問題的方法,需要的朋友可以參考下
    2015-05-05
  • Linux系統(tǒng)徹底刪除Mysql的詳細(xì)教程

    Linux系統(tǒng)徹底刪除Mysql的詳細(xì)教程

    我們?cè)谥匦掳惭bMySQL、或更新MySQL版本時(shí),一定會(huì)遇到mysql數(shù)據(jù)殘留(臟數(shù)據(jù)),或組件沖突等問題,下面這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)徹底刪除Mysql的詳細(xì)教程,需要的朋友可以參考下
    2023-02-02
  • 基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫分離操作

    基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫分離操作

    這篇文章主要介紹了基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫分離操作,需要的朋友可以參考下
    2018-09-09

最新評(píng)論