1. 程式人生 > 其它 >【MySQL學習筆記(一)】之MySQL架構,啟動方式,C/S連線方式,處理請求流程

【MySQL學習筆記(一)】之MySQL架構,啟動方式,C/S連線方式,處理請求流程

技術標籤:MYSQL資料庫mysql

本文章由公號【開發小鴿】釋出!歡迎關注!!!


老規矩–妹妹鎮樓:

一. MYSQL介紹

(一) 架構

MYSQL採用C/S架構,伺服器程式直接與儲存的資料互動,多個客戶端程式可以連線到這個伺服器程式,向伺服器傳送增刪改查的請求,然後伺服器程式對資料進行處理。

(二) 伺服器程式的啟動

1. 類UNIX系統

(1) mysqld

mysqld可執行檔案表示MYSQL的伺服器程式,執行這個可執行檔案就可以啟動一個MYSQL伺服器程序,不常用。

(2) mysqld_safe

一個啟動指令碼,間接地呼叫mysqld並持續監控伺服器的執行狀態,將出錯資訊和其他診斷資訊輸出到錯誤日誌中。


(3) mysqld.server

一個啟動指令碼,會間接地呼叫mysqld_safe,在後面新增start引數就可以啟動伺服器程式:

mysqld.server start

該檔案其實是一個連結檔案,對應的實際檔案是 …/supportfiles/mysql.server。也可以使用該指令碼來關閉伺服器程式:

mysqld.server stop

(4) mysqld_multi

執行多個伺服器例項,啟動或停止多個伺服器程序,同時報告它們的執行狀態。

2. Windows系統

(1) 手動啟動

直接單擊mysqld可執行檔案。

(2) 服務方式啟動

如果要長時間執行某程式,就可以將它註冊為一個Windows服務,由作業系統來管理。註冊服務如下所示:

“完整可執行檔案路徑” –install [-manual] [服務名]

-manual 表示手動啟動該服務,預設的服務名是MYSQL。接下來就可以啟動MYSQL伺服器服務了:

net start MYSQL

關閉服務:

net stop MYSQL

(三) 客戶端程式的啟動

通過mysql可執行檔案,客戶端可以與伺服器程式進行互動,不過需要通過傳遞一些引數來,如-h 伺服器程式的IP,-u登入的使用者名稱,-p該使用者的密碼,-P伺服器程式監聽的埠號,注意密碼與p之間是沒有空格的,不然會報錯。

(四) 客戶端與伺服器的連線

MYSQL客戶端程式與服務端程式的通訊實質上是一個程序間通訊的過程。


1. TCP/IP

客戶端和伺服器可能在不同的主機中,因此必須通過網路進行通訊,MySQL採用TCP作為網路通訊協議,伺服器預設監聽3306埠號,埠的範圍為 0 – 65535。

2. 命名管道和共享記憶體

Windows使用者可以使用命名管道和共享記憶體進行程序間的通訊。

命名管道啟動:在啟動伺服器程式的命令中加上 –enablee-named-pipe引數,在啟動客戶端中加上 –pipe引數。

共享記憶體啟動:伺服器程式啟動加上—shared-memory引數,客戶端程式啟動加上—protocol=memory引數。

3. UNIX域套接字

C/S都執行在類Unix系統中,可使用UNIX域套接字進行通訊。啟動客戶端時指定—protocol=socket引數,伺服器程式預設監聽的Unix域套接字檔案為/tmp/mysql.sock,客戶端程式也預設連線到這個Unix域套接字檔案。


二. MySQL處理請求流程

(一) 概述

伺服器程式在處理來自客戶端的查詢請求時,分為三步:連線管理,解析與優化,儲存引擎。

(二) 連線管理

每當有一個客戶端程序連線到伺服器程序時,伺服器程序都會建立一個執行緒專門處理與這個客戶端的互動,當該客戶端退出時會與伺服器斷開連線,而伺服器會將該執行緒快取起來,等待另一個新的客戶端的連線。客戶端傳送的連線請求是需要驗證的,如果認證失敗會拒絕連線。如果C/S執行在不同機器上,會採用傳輸層安全性(TLS)協議對連線進行加密。

(三) 解析與優化

1. 查詢快取

MySQL伺服器程式處理請求時會首先查詢之前的快取,如果有相同的請求就會直接從快取中返回,這個查詢快取可以在不同的客戶端之間共享。如果查詢請求有任何字元上的不同,都會導致快取不命中,且如果查詢請求中包含有某些系統函式,使用者自定義變數和函式,系統表,則這個請求不會被快取。如系統函式NOW查詢最新的當前時間,該函式兩次呼叫肯定是不同的結果,因此不會被快取。

MySQL的快取系統會監控涉及的每張表,只要該表的結構或資料被修改,則所有相關的查詢快取都會變為無效並從查詢緩衝中刪除。雖然查詢快取能夠提高系統性能,但是為了維護這塊快取也會有一些開銷,從MySQL5.7.20開始不推薦使用,到了8.0直接刪除了。

2. 語法解析

查詢快取沒有命中,就會進入正式的查詢中,客戶端傳送過來一個SQL語句,首先要對這個語句進行分析,判斷語法是否正確,然後從文字中將要查詢的表,各種查詢條件都提取出來放到MySQL伺服器內部使用的一些資料結構上。

這個過程類似編譯器的 詞法解析->語法分析->語義分析。

3. 查詢優化

語法解析後,伺服器程式獲得了需要的資訊,但是為了使SQL語句查詢效率更高,需要優化SQL語句,如將外連線轉換為內連線,表示式簡化等等。優化的結果是生成一個執行計劃,這個執行計劃表明了應該使用哪些索引執行查詢,以及表之間的連線順序是什麼樣的。我們可以使用EXPLAIN語句來檢視某個語句的執行計劃。

(四) 儲存引擎

MySQL伺服器將資料的儲存和提取操作都封裝到了儲存引擎中,表是由一行一行的記錄組成的,這只是邏輯概念,儲存引擎負責真正資料在物理上的儲存,讀取。不同的儲存引擎負責不同的功能,不同儲存引擎管理的表可能有不同的儲存結構,存取演算法。

為了方便管理,MySQL伺服器處理請求的過程被劃分為了server層和儲存引擎層,各種不同的儲存請求為server層提供統一的呼叫介面,其中包含了不同用途的底層函式,如讀取索引第一條記錄等等。

server層在判斷某條記錄符合要求之後,首先將其傳送到一個緩衝區中,待到該緩衝區滿了,才會向客戶端傳送真正的記錄。

(五) 常用的儲存引擎

MySQL在5.5.5之前預設的儲存引擎為MyISAM,之後改為了InnoDB,InnoDB支援事務,分散式事務以及事務的部分回滾,這些大部分引擎都沒有。

查詢當前伺服器程式支援的儲存引擎:

SHOW ENGINES;

我們可以為不同的表設定不同的儲存引擎,不同的表可以有不同的物理儲存結構,不同的讀取和寫入方式。在建表時直接指定引擎:

CREATE TABLE()ENGINE =;

修改表的儲存引擎:

ALTER TABLE 表名 ENGINE=;