MySQL查詢優化(三):深度解讀 MySQL客戶端和服務端協議

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

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

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


mysql 查詢完整過程
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/perluse 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');
最后編輯于:2025-01-18 16:58:25


喜歡的朋友記得點贊、收藏、關注哦!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67398.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67398.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67398.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Van-Nav:新年,將自己學習的項目地址統一整理搭建自己的私人導航站,供自己后續查閱使用,做技術的同學應該都有一個自己網站的夢想

嗨&#xff0c;大家好&#xff0c;我是小華同學&#xff0c;關注我們獲得“最新、最全、最優質”開源項目和高效工作學習方法 Van-Nav是一個基于Vue.js開發的導航組件庫&#xff0c;它提供了多種預設的樣式和靈活的配置選項&#xff0c;使得開發者可以輕松地定制出符合項目需求…

VSCode+Continue實現AI輔助編程

Continue是一款功能強大的AI輔助編程插件&#xff0c;可連接多種大模型&#xff0c;支持代碼設計優化、錯誤修正、自動補全、注釋編寫等功能&#xff0c;助力開發人員提高工作效率與代碼質量。以下是其安裝和使用方法&#xff1a; 一、安裝VSCode 參見&#xff1a; vscode安…

【hot100】刷題記錄(6)-輪轉數組

題目描述&#xff1a; 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪轉 1 步: [7,1,2,3,4,5,6] 向右輪轉 2 步: [6,7,1,2,3,4,5] 向右輪轉…

FPGA 使用 CLOCK_DEDICATED_ROUTE 約束

使用 CLOCK_DEDICATED_ROUTE 約束 CLOCK_DEDICATED_ROUTE 約束通常在從一個時鐘區域中的時鐘緩存驅動到另一個時鐘區域中的 MMCM 或 PLL 時使 用。默認情況下&#xff0c; CLOCK_DEDICATED_ROUTE 約束設置為 TRUE &#xff0c;并且緩存 /MMCM 或 PLL 對必須布局在相同…

阿里:基于路由和規劃的多agent系統

&#x1f4d6;標題&#xff1a;Talk to Right Specialists: Routing and Planning in Multi-agent System for Question Answering &#x1f310;來源&#xff1a;arXiv, 2501.07813 &#x1f31f;摘要 &#x1f538;利用大型語言模型&#xff08;LLM&#xff09;&#xff0c…

數論問題77一一3x+1問題

3X 1問題&#xff0c;也被稱為考拉茲猜想、角谷猜想等&#xff0c;是數學領域一個著名的未解決問題&#xff0c;以下是關于它的介紹&#xff1a; 問題表述 對于任意一個正整數X&#xff0c;如果X是奇數&#xff0c;則將其變為3X 1&#xff1b;如果X是偶數&#xff0c;則將其變…

【Unity3D】實現2D角色/怪物死亡消散粒子效果

核心&#xff1a;這是一個Unity粒子系統自帶的一種功能&#xff0c;可將粒子生成控制在一個Texture圖片網格范圍內&#xff0c;并且粒子顏色會自動采樣圖片的像素點顏色&#xff0c;之后則是粒子編輯出消散效果。 Particle System1物體&#xff08;爆發式隨機速度擴散10000個粒…

Synology 群輝NAS安裝(10)安裝confluence

Synology 群輝NAS安裝&#xff08;10&#xff09;安裝confluence 寫在前面本著一朝鮮吃遍天的原則&#xff0c;我又去了這個github的作者那里翻車的第一次嘗試手工創建數據庫制作一個新的docker-compose of confluence 不折騰但成功啟動的版本 寫在前面 在裝完jira之后&#x…

萬字長文總結前端開發知識---JavaScriptVue3Axios

JavaScript學習目錄 一、JavaScript1. 引入方式1.1 內部腳本 (Inline Script)1.2 外部腳本 (External Script) 2. 基礎語法2.1 聲明變量2.2 聲明常量2.3 輸出信息 3. 數據類型3.1 基本數據類型3.2 模板字符串 4. 函數4.1 具名函數 (Named Function)4.2 匿名函數 (Anonymous Fun…

DeepSeek R1有什么不同

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

年度總結(盡量簡短)

一.成長 1.對于U使用更熟練&#xff0c;能應付基本的開發。幾個項目的練習和磨練&#xff0c;基本達到了我今年的目標&#xff0c;自己可以應付項目。可以過度到底層的學習。 2.堅持寫帖子&#xff0c;雖然后半年的帖子發的沒有上半年勤快。但是也在堅持學東西 3.對于職場上…

多頭潛在注意力(MLA):讓大模型“輕裝上陣”的技術革新——從DeepSeek看下一代語言模型的高效之路

多頭潛在注意力&#xff08;MLA&#xff09;&#xff1a;讓大模型“輕裝上陣”的技術革新 ——從DeepSeek看下一代語言模型的高效之路 大模型的“內存焦慮” 當ChatGPT等大語言模型&#xff08;LLM&#xff09;驚艷世界時&#xff0c;很少有人意識到它們背后隱藏的“內存焦慮”…

淺談Linux 權限、壓縮、進程與服務

概述 放假回家&#xff0c;對Linux系統的一些知識進行重新的整理&#xff0c;做到溫故而知新&#xff0c;對用戶權限管理、文件賦權、壓縮文件、進程與服務的知識進行了一次梳理和總結。 權限管理 Linux最基礎的權限是用戶和文件&#xff0c;先了解基礎的用戶權限和文件權限…

從源碼深入理解One-API框架:適配器模式實現LLM接口對接

1. 概述 one-api 是一個開源的 API 框架&#xff0c;基于go語言開發&#xff0c;旨在提供統一的接口調用封裝&#xff0c;支持多種 AI 服務平臺的集成。通過 Gin 和 GORM 等框架&#xff0c;框架簡化了多種 API 服務的調用流程。通過適配器模式實現了與多種 大模型API 服務的集…

2025神奇的數字—新年快樂

2025年&#xff0c;一個神奇的數字&#xff0c;承載著數學的奧秘與無限可能。它是45的平方&#xff08;45&#xff09;&#xff0c;上一個這樣的年份是1936年&#xff08;44&#xff09;&#xff0c;下一個則是2116年&#xff08;46&#xff09;&#xff0c;一生僅此一次。2025…

Python的列表基礎知識點(超詳細流程)

目錄 一、環境搭建 二、列表 2.1 詳情 2.2 列表定義 2.3 列表長度 2.4 列表索引 2.5 切片索引 2.6 添加 2.7 插入 2.8 剔除 2.8.1 pop方法 2.8.2 del方法 2.9 任何數據類型 2.10 拼接 2.10.1 “” 2.10.2 “*” 2.11 逆序 ?編輯 2.12 計算出現次數 2.13 排序…

人工智能如何驅動SEO關鍵詞優化策略的轉型與效果提升

內容概要 隨著數字化時代的到來&#xff0c;人工智能&#xff08;AI&#xff09;技術對各行各業的影響日益顯著&#xff0c;在搜索引擎優化&#xff08;SEO&#xff09;領域尤為如此。AI的應用不僅改變了關鍵詞研究的方法&#xff0c;而且提升了內容生成和搜索優化的效率&…

Qt Ribbon使用實例

采用SARibbon創建簡單的ribbon界面 實例代碼如下所示&#xff1a; 1、頭文件&#xff1a; #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…

CISCO路由基礎全集

第一章&#xff1a;交換機的工作原理和基本技能_交換機有操作系統嗎-CSDN博客文章瀏覽閱讀1.1k次&#xff0c;點贊24次&#xff0c;收藏24次。交換機可看成是一臺特殊的計算機&#xff0c;同樣有CPU、存儲介質和操作系統&#xff0c;只是與計算機的稍有不同。作為數據交換設備&…

計算機畢業設計Django+Tensorflow音樂推薦系統 機器學習 深度學習 音樂可視化 音樂爬蟲 知識圖譜 混合神經網絡推薦算法 大數據畢設

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…