一、MySQL的客戶端/服務器架構
前言
之前對MySQL的認知只限於會寫些SQL,本篇算是筆記,記錄和整理下自己對MySQL不熟悉的地方。
大致邏輯:
MySQL的服務器程序直接和我們存儲的數據打交道,客戶端程序連接服務器,發送增刪改查的請求,服務器操作維護的數據響應請求。
MySQL服務器程序的進程也被稱為MySQL數據庫實例。我們啟動的MySQL服務器進程的默認名稱是mysqld
,而常用的MySQL客戶端進程默認名稱為mysql
。
安裝
不論通過哪種方式安裝,MySQL的服務器程序和客戶端都會被安裝到我們的機器上。
不過在Linux下使用RPM包時會有單獨的服務器RPM包和客戶端RPM包,需要分別安裝。
啟動服務器程序
mysqld
代表着mysql服務器程序,運行這個可執行文件就可以直接啟動一個服務器進程。
mysqld_safe
-
是一個啟動腳本,會間接的調用mysqld。
-
還順便啟動了另外一個監控進程,這個監控進程在服務器進程掛了的時候,可以幫助重啟它。
-
會將服務器程序的出錯信息和其他診斷信息重定向到某個文件中,產生出錯日志。
mysql.server
也是一個啟動腳本,會間接的調用mysqld_safe,使用時跟上start/stop參數就OK。
不過這個文件其實是一個鏈接文件,實際文件是../support-files/mysql.server.
mysqld_multi
一台計算機上可以運行多個MySQL服務器進程,這個可執行文件可以對每一個服務器進程的啟動或停止進行監控。
啟動客戶端程序
格式:
mysql -h主機名 -u用戶名 -p密碼
小貼士: 像 h、u、p 這樣名稱只有一個英文字母的參數稱為短形式的參數,使用時前邊需要加單短划線,像 host、user、password 這樣大於一個英文字母的參數稱為長形式的參數,使用時前邊需要加雙短划線。
客戶端與服務器連接的過程
本質上進程間通信的過程,MySQL支持以下的通信方式
TCP/IP
MySQL服務器默認監聽3306端口。
命名管道和共享內存
這種通信方式是windows操作系統中的
Unix域套接字文件
這種方式要求客戶端和服務器運行在同一台類Unix的操作系統上。
MySQL服務器程序默認監聽的套接字文件路徑是/tmp/mysql.sock
,客戶端也默認監聽這個文件。
改變文件:
# 服務器改變套接字文件
mysqld --socket=/tmp/a.txt
# 客戶端改變
mysql -hlocalhost -uroot --socket=/tmp/a.txt -p
架構
連接管理
客戶端與服務器進程建立連接,每當有一個客戶端進程連接到服務器進程時,服務器進程都會創建一個線程
來專門處理與這個客戶端的交互,當該客戶端退出時會與服務器斷開連接,服務器會把線程緩存起來。
解析與優化
查詢緩存
如果兩個查詢請求在任何字符上的不同都會導致緩存不命中。請求中包含某些系統函數、用戶自定義變量和函數、一些系統表也不會被緩存。
只要該表的結構或者數據被修改,則該表的所有高速緩存查詢都將無效並刪除。
PS:8.0中查詢緩存已經刪除了
語法解析
如果查詢緩存沒有命中,就進入查詢階段,服務器先對文本做分析,判斷語法是否正確,然后從文本中將要查詢的表、各種查詢條件都提取出來放到內部使用的一些數據結構上。
算是一個編譯過程,涉及詞法解析、語法分析、語義分析等階段。
查詢優化
對SQL做優化,生成一個執行計划,表明了應該使用哪些索引進行查詢,表之間的連接順序是怎樣的。
這塊可以使用explain
profile
來查看。
存儲引擎
數據的存儲和提取操作都封裝到了這個模塊里。不同的存儲引擎使用不同的存儲方式。
參考
本文主要參考小孩子寫的《MySQL是怎樣運行的:從根兒上理解MySQL》
想學習的同學可以通過以下方式購買,絕對超值!