本篇已收錄在 MySQL 是怎樣運行的 學習筆記系列
MySql 屬於 C/S 架構
我們日常使用MySQL的情景一般是這樣的:
- 啟動MySQL服務器程序
- 啟動MySQL客戶端程序並連接到服務器程序
- 在客戶端程序中輸入一些命令語句作為請求發送到服務器程序,服務器程序收到這些請求后,會根據請求的內容來操作具體的數據並向客戶端返回操作結果
Windows操作系統上的安裝目錄:
C:\Program Files\MySQL\MySQL Server x.x
啟動MySQL服務器程序
UNIX里啟動服務器程序:
mysqld
mysqld這個可執行文件就代表着MySQL服務器程序,運行這個可執行文件就可以直接啟動一個服務器進程
mysqld_safe
mysqld_safe是一個啟動腳本,它會間接的調用mysqld,而且還順便啟動了另外一個監控進程,這個監控進程在服務器進程掛了的時候,可以幫助重啟它。另外,使用mysqld_safe啟動服務器程序時,它會將服務器程序的出錯信息和其他診斷信息重定向到某個文件中,產生出錯日志,這樣可以方便我們找出發生錯誤的原因
mysql.server [start/stop]
mysql.server也是一個啟動腳本,它會間接的調用mysqld_safe,在調用mysql.server時在后邊指定start參數就可以啟動服務器程序了
Windows里啟動服務器程序:
mysqld
當然更多時候是通過服務service啟動.
啟動 MySQL 客戶端
mysql -hlocalhost -uroot -p123456
服務器處理客戶端請求
連接管理
每當有一個客戶端進程連接到服務器進程時,服務器進程都會創建一個線程來專門處理與這個客戶端的交互,當該客戶端退出時會與服務器斷開連接,服務器並不會立即把與該客戶端交互的線程銷毀掉,而是把它緩存起來,在另一個新的客戶端再進行連接時,把這個緩存的線程分配給該新客戶端
查詢緩存
從MySQL 5.7.20開始,不推薦使用查詢緩存,並在MySQL 8.0中刪除。
MySQL服務器程序會把剛剛處理過的查詢請求和結果緩存起來,如果下一次有一模一樣的請求過來,直接從緩存中查找結果就好了,就不用再傻呵呵的去底層的表中查找了。這個查詢緩存可以在不同客戶端之間共享,也就是說如果客戶端A剛剛查詢了一個語句,而客戶端B之后發送了同樣的查詢請求,那么客戶端B的這次查詢就可以直接使用查詢緩存中的數據。如果兩個查詢請求在任何字符上的不同(例如:空格、注釋、大小寫),都會導致緩存不會命中。如果查詢請求中包含某些系統函數、用戶自定義變量和函數、一些系統表,如 mysql 、information_schema、 performance_schema 數據庫中的表,那這個請求就不會被緩存。不過既然是緩存,那就有它緩存失效的時候。MySQL的緩存系統會監測涉及到的每張表,只要該表的結構或者數據被修改,如對該表使用了INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE語句,那使用該表的所有高速緩存查詢都將變為無效並從高速緩存中刪除
語法解析
這個從指定的文本中提取出我們需要的信息本質上算是一個編譯過程,涉及詞法解析、語法分析、語義分析等階段,這些問題不屬於我們討論的范疇,大家只要了解在處理請求的過程中需要這個步驟就好了
查詢優化
語法解析之后,服務器程序獲得到了需要的信息,比如要查詢的列是哪些,表是哪個,搜索條件是什么等等,但光有這些是不夠的,因為我們寫的MySQL語句執行起來效率可能並不是很高,MySQL的優化程序會對我們的語句做一些優化
存儲引擎
截止到服務器程序完成了查詢優化為止,還沒有真正的去訪問真實的數據表,MySQL服務器把數據的存儲和提取操作都封裝到了一個叫存儲引擎的模塊里。我們知道表是由一行一行的記錄組成的,但這只是一個邏輯上的概念,物理上如何表示記錄,怎么從表中讀取數據,怎么把數據寫入具體的物理存儲器上,這都是存儲引擎負責的事情。為了實現不同的功能,MySQL提供了各式各樣的存儲引擎,不同存儲引擎管理的表具體的存儲結構可能不同,采用的存取算法也可能不同。
其實我們最常用的就是InnoDB和MyISAM
, 不同引擎支持的功能不一樣.
-
查看當前服務器程序支持的存儲引擎
SHOW ENGINES;
- Transactions列代表該存儲引擎是否支持事務處理。XA列代表着該存儲引擎是否支持分布式事務。Savepoints代表着該存儲引擎是否支持部分事務回滾。
-
設置表的存儲引擎
CREATE TABLE 表名( 建表語句; ) ENGINE = 存儲引擎名稱;
-
修改表的存儲引擎
ALTER TABLE 表名 ENGINE = 存儲引擎名稱;
總結
為了管理方便,人們把連接管理、查詢緩存、語法解析、查詢優化
這些並不涉及真實數據存儲的功能划分為MySQL server
的功能,把真實存取數據的功能划分為存儲引擎
的功能。各種不同的存儲引擎向上邊的MySQL server層提供統一的調用接口(也就是存儲引擎API)
,包含了幾十個底層函數,像"讀取索引第一條內容"、"讀取索引下一條內容"、"插入記錄"等等。