mysql伺服器架構

来源:https://www.cnblogs.com/killianxu/archive/2018/12/12/10110730.html
-Advertisement-
Play Games

mysql是使用最廣泛的開源關係資料庫之一,大多數開發人員只會簡單的用sql語句操作數據,而不理解服務端架構和sql查詢語句在服務端的執行過程,本文會從sql語句執行路徑來介紹mysql服務端架構,包括連接器,查詢緩存,分析器,優化器等。 ...


  mysql是最廣泛使用的開源資料庫之一,作為後端開發人員,或多或少都會和mysql打交道,本篇文章會從sql查詢語句的執行過程,來介紹mysql的伺服器架構,

查詢的過程大致分為從客戶端到伺服器,在伺服器上解析,生成執行計劃,執行,並返回結果給客戶端。如下圖1.1所示。

          圖1.1 sql查詢執行路徑

1.1 連接器

  連接器對客戶端的連接請求進行用戶名和密碼的驗證,並會管理連接池。客戶端和伺服器為“半雙工”通信協議,客戶端和伺服器無法同時發送消息,當伺服器向客戶端發送查詢結果時,必須全部返回,客戶端不能主動停止,mysql需要等所有的數據都發送給了客戶端才會釋放本次查詢所占用的資源,因此大多數庫函數都會接收結果並緩存在客戶端,以使查詢早點結束,減輕服務端壓力。

  對於連接到mysql的客戶端,可以用show full processlist查看連接狀態,該狀態表示了mysql當前在做什麼,一個查詢完整的生命周期,狀態會變很多次。

  在show full processlist中,欄位command表示線程正在執行的命令類型,The type of command the thread is executing,一般就是休眠(sleep),查詢(query),連接 (connect),含義如下:

  • sleep,線程正在等待客戶端發送新的請求。
  • query,線程正在執行查詢或將結果返回客戶端。
  • connect,正在建立連接。

  show full processlist最重要的欄位是state,Most states correspond to very quick operations. If a thread stays in a given state for many seconds,there might be a problem that needs to be investigated.An action, event, or state that indicates what the thread is doing,表示線程處於某一狀態下具體正在做什麼,值的含義如下:

  • Locked,在Mysql伺服器層,線程正在等待鎖,這裡不包括innodb存儲引擎實現的行鎖
  • Analyzing and statistics,線程正在收集存儲引擎的統計信息,並生成查詢的執行計劃。
  • Copying to tmp table [on disk],線程正在執行查詢,並將結果放在臨時表,帶有on disk,表示mysql在將記憶體臨時表存入磁碟。
  • Sorting result,線程正在對結果集排序。
  • Sending data,線程正在多個狀態間傳送數據,或者在生成結果集,或者向客戶端返回數據。

1.2 查詢緩存

  在解析sql語句之前,mysql會從查詢緩存中獲取數據,具體是一個大小寫敏感的哈希查找,sql語句必須和緩存中的sql語句完全匹配,否則不會命中,對於更新比較頻繁的資料庫,經常會導致緩存失效,建議將查詢緩存關閉。

1.3 分析器

  假如查詢緩存沒有命中,則會進入分析器,對sql語句進行詞法和語法分析,並會進行預處理,以便知道此sql語句是要做什麼。它會驗證是否使用錯誤的關鍵字,關鍵字順序是否正確等。並且,預處理會根據一些規則對解析樹的合法性進行進一步校驗,比如檢查數據表和列是否存在,解析名字和別名,看看是否有歧義等,如下圖1.2經常遇到的語法錯誤就在這一階段

圖1.2 sql語法錯誤提示

1.4 優化器

  sql語句經過分析器分析合法,需要經過查詢優化器轉化成執行計劃,查詢優化器解決的是怎麼做的問題,相同的sql語句,返回相同的結果集,有很多種執行方式,查詢優化器就是要選擇性能較好的一種。

  mysql是基於成本的優化器,會預測一個查詢使用某種計劃時的成本,並選擇其中成本最小的一種,可以通過Last_query_cost值查詢到當前會話查詢的成本。很多原因會導致mysql優化器選擇錯誤的執行計劃,比如:統計信息不准、不考慮其他併發執行的查詢,執行計劃太多,無法估算所有的計劃等。

1.5 查詢執行引擎

  查詢執行引擎根據優化器生成的執行計劃(執行計劃是一種數據結構,而不是位元組碼),調用存儲引擎介面,完成執行計劃中的所有操作。mysql將查詢結果返回客戶端是一個增量、逐步返回的過程。開始生成第一條結果,mysql就可以開始向客戶端返回數據。這樣做服務端無需存儲太多結果,減小了服務端記憶體的消耗壓力,另外,客戶端也可以第一時間獲得返回的結果。  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 mktemp命令用於創建一個臨時的文件或者目錄。 語法格式 示例 不帶選項和參數的mktemp用於創建臨時文件,帶-d選項用於創建臨時目錄。 創建完成後,會輸出臨時文件的絕對路徑。 當僅運行mktemp命令的時候,其等同於 這裡的XXX就表示隨機數,至少需要3個X。 -p DIR, --tmp ...
  • php7連接mysql測試代碼 ...
  • 簡介 從命令的名字上來看,會讓人誤以為這是一個和安裝相關的命令。 其實不然,install命令用於複製文件(cp)或創建空目錄(mkdir)並設置相關的屬性(chown、chmod)。 這裡的屬性包含了ownership、許可權以及時間戳(保留時間戳,而不是修改)。 語法格式 單源複製。一般省略掉-T ...
  • 在上章學習33.Linux-實現U盤自動掛載(詳解)後,只是講解了普通U盤掛載,並沒有涉及到多分區U盤,接下來本章來繼續學習 1.多分區U盤和普通U盤區別 1)U盤插上只會創建一個/dev/sda文件,這種一般表示該U盤沒有分區,這個sda文件便代表該U盤總大小,我們只需要掛載/dev/sda即可 ...
  • ubuntu16.4系統查看自啟服務: 需要自行安裝一個sysv-rc-conf的工具來查看: 查看自啟命令: Gentos6.8系統查看自啟服務:(註意這個只是查看用RPM包安裝的預設的獨立服務) 查看基於Xinetd的服務: 需要安裝Xinetd: 查詢系統中開啟的服務: ...
  • SQL Server系統表sysobjects 介紹 sysobjects 表結構: 列名 數據類型 描述 name sysname 對象名,常用列 id int 對象標識號 xtype char(2) 對象類型。常用列。xtype可以是下列對象類型中的一種: C = CHECK 約束 D = 預設 ...
  • 一. 概述 上一篇我們介紹瞭如何將數據從 mysql 拋到 kafka,這次我們就專註於利用 storm 將數據寫入到 hdfs 的過程,由於 storm 寫入 hdfs 的可定製東西有些多,我們先不從 kafka 讀取,而先自己定義一個 Spout 數據充當數據源,下章再進行整合。這裡預設你是擁有 ...
  • 刪除數據分為兩種:一種是刪除索引(數據和表結構同時刪除,作用同SQLSERVER 中 DROP TABLE "表格名" ),另一種是刪除數據(不刪除表結構,作用同SQLSERVER中Delete 語句)。 一:刪除索引: 刪除單個索引可以使用命令 【DELETE /索引名稱】 刪除多個索引可以使用命 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...