一、MySQL的客戶端/服務器架構:
1、mysql客戶端服務端場景:
a.啟動MySQL服務器程式
b.啟動MySQL客戶端程式并連接到服務器程式,
c.在客戶端程式中輸入一些命令陳述句作為請求發送到服務器程式,服務器程式收到這些請求后,會根據請求的內容來操作具體的資料并向客戶端回傳操作結果
2、mysql行程:
我們的MySQL服務器程式和客戶端程式本質上都算是計算機上的一個行程,這個代表著MySQL服務器程式的行程也被稱為MySQL資料庫實體,簡稱資料庫實體;
我們啟動的MySQL服務器行程的默認名稱為mysqld, 而我們常用的MySQL客戶端行程的默認名稱為mysql
3、啟動mysql服務器程式:
(1)mysqld:
mysqld這個可執行檔案就代表著MySQL服務器程式,運行這個可執行檔案就可以直接啟動一個服務器行程,但這個命令不常用
(2)mysqld_safe:
mysqld_safe是一個啟動腳本,它會間接的呼叫mysqld,而且還順便啟動了另外一個監控行程,這個監控行程在服務器行程掛了的時候,可以幫助重啟它,另外,使用mysqld_safe啟動服務器程式時,它會將服務器程式的出錯資訊和其他診斷資訊重定向到某個檔案中,產生出錯日志,這樣可以方便我們找出發生錯誤的原因
(3)mysql.server:
mysql.server也是一個啟動腳本,它會間接的呼叫mysqld_safe,在呼叫mysql.server時在后邊指定start引數就可以啟動服務器程式了,例如:
mysql.server start
需要注意的是,這個 mysql.server 檔案其實是一個鏈接檔案,它的實際檔案是 …/support-files/mysql.server,我使用的macOS作業系統會幫我們在bin目錄下自動創建一個指向實際檔案的鏈接檔案
(4)mysqld_multi:
一臺計算機上也可以運行多個服務器實體,也就是運行多個MySQL服務器行程,mysql_multi可執行檔案可以對每一個服務器行程的啟動或停止進行監控
4、啟動MySQL客戶端程式:
啟動方法:mysql -h主機名 -u用戶名 -p密碼
-h 表示服務器行程所在計算機的域名或者IP地址,如果服務器行程就運行在本機的話,可以省略這個引數,或者填localhost或者127.0.0.1,也可以寫作 --host=主機名的形式,
-u 表示用戶名,也可以寫作 --user=用戶名的形式,
-p 表示密碼,也可以寫作 --password=密碼的形式,
例如:mysql -hlocalhost -uroot -p123456
5、客戶端與服務器連接的程序:
本質上是一個行程間通信的程序!MySQL支持下邊三種客戶端行程和服務器行程的通信方式:
(1)TCP/IP:
MySQL采用TCP作為服務器和客戶端之間的網路通信協議;
在網路環境下,每臺計算機都有一個唯一的IP地址,如果某個行程有需要采用TCP協議進行網路通信方面的需求,可以向作業系統申請一個埠號,這是一個整數值,它的取值范圍是0~65535,這樣在網路中的其他行程就可以通過IP地址 + 埠號的方式來與這個行程連接,這樣行程之間就可以通過網路進行通信了;
MySQL服務器會默認監聽 3306 埠
在啟動服務器程式的命令列里添加-P引數來明確指定一下埠號,
例如:mysqld -P3307
(2)命名管道和共享記憶體:
針對Windows用戶,客戶端行程和服務器行程之間可以考慮使用命名管道或共享記憶體進行通信;
在啟動服務器程式和客戶端程式時添加一些引數:
I. 使用命名管道來進行行程間通信:
需要在啟動服務器程式的命令中加上–enable-named-pipe引數,然后在啟動客戶端程式的命令中加入–pipe或者–protocol=pipe引數,
II. 使用共享記憶體來進行行程間通信:
需要在啟動服務器程式的命令中加上–shared-memory引數,在成功啟動服務器后,共享記憶體便成為本地客戶端程式的默認連接方式,不過我們也可以在啟動客戶端程式的命令中加入–protocol=memory引數來顯式的指定使用共享記憶體進行通信,
不過需要注意的是,使用共享記憶體的方式進行通信的服務器行程和客戶端行程必須在同一臺Windows主機中
(3)Unix域套接字檔案:
服務器行程和客戶端行程都運行在同一臺作業系統為類Unix的機器上的話,我們可以使用Unix域套接字檔案來進行行程間通信;
在啟動客戶端程式的時候指定的主機名為localhost,或者指定了–protocol=socket的啟動引數,那服務器程式和客戶端程式之間就可以通過Unix域套接字檔案來進行通信;
MySQL服務器程式默認監聽的Unix域套接字檔案路徑為/tmp/mysql.sock
6、服務器處理客戶端請求
處理流程:客戶端行程向服務器行程發送一段文本(MySQL陳述句),服務器行程處理后再向客戶端行程發送一段文本(處理結果)

(1)連接管理:
客戶端行程可以采用我們上邊介紹的TCP/IP、命名管道或共享記憶體、Unix域套接字這幾種方式之一來與服務器行程建立連接,每當有一個客戶端行程連接到服務器行程時,服務器行程都會創建一個執行緒來專門處理與這個客戶端的互動,當該客戶端退出時會與服務器斷開連接,服務器并不會立即把與該客戶端互動的執行緒銷毀掉,而是把它快取起來,在另一個新的客戶端再進行連接時,把這個快取的執行緒分配給該新客戶端,這樣就起到了不頻繁創建和銷毀執行緒的效果,從而節省開銷,從這一點大家也能看出,MySQL服務器會為每一個連接進來的客戶端分配一個執行緒,但是執行緒分配的太多了會嚴重影響系統性能,所以我們也需要限制一下可以同時連接到服務器的客戶端數量;
在客戶端程式發起連接的時候,需要攜帶主機資訊、用戶名、密碼,服務器程式會對客戶端程式提供的這些資訊進行認證,如果認證失敗,服務器程式會拒絕連接,另外,如果客戶端程式和服務器程式不運行在一臺計算機上,我們還可以采用使用了SSL(安全套接字)的網路連接進行通信,來保證資料傳輸的安全性,
當連接建立后,與該客戶端關聯的服務器執行緒會一直等待客戶端發送過來的請求,MySQL服務器接收到的請求只是一個文本訊息,該文本訊息還要經過各種處理
(2)決議與優化:
MySQL服務器已經獲得了文本形式的請求,后面還需要分別是查詢快取、語法決議和查詢優化;
I. 查詢快取:
如果客戶端A剛剛查詢了一個陳述句,而客戶端B之后發送了同樣的查詢請求,那么客戶端B的這次查詢就可以直接使用查詢快取中的資料;如果兩個查詢請求在任何字符上的不同(例如:空格、注釋、大小寫),都會導致快取不會命中,另外,如果查詢請求中包含某些系統函式、用戶自定義變數和函式、一些系統表,如 mysql 、information_schema、 performance_schema 資料庫中的表,那這個請求就不會被快取;
MySQL的快取系統會監測涉及到的每張表,只要該表的結構或者資料被修改,如對該表使用了INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE陳述句,那使用該表的所有高速快取查詢都將變為無效并從高速快取中洗掉;
雖然查詢快取有時可以提升系統性能,但也不得不因維護這塊快取而造成一些開銷,比如每次都要去查詢快取中檢索,查詢請求處理完需要更新查詢快取,維護該查詢快取對應的記憶體區域,從MySQL 5.7.20開始,不推薦使用查詢快取,并在MySQL 8.0中洗掉
II. 語法決議:
如果查詢快取沒有命中,接下來就需要進入正式的查詢階段了,因為客戶端程式發送過來的請求只是一段文本而已,所以MySQL服務器程式首先要對這段文本做分析,判斷請求的語法是否正確,然后從文本中將要查詢的表、各種查詢條件都提取出來放到MySQL服務器內部使用的一些資料結構上來;
III. 查詢優化:
MySQL的優化程式會對我們的陳述句做一些優化,如外連接轉換為內連接、運算式簡化、子查詢轉為連接吧啦吧啦的一堆東西,優化的結果就是生成一個執行計劃,這個執行計劃表明了應該使用哪些索引進行查詢,表之間的連接順序是啥樣的,我們可以使用EXPLAIN陳述句來查看某個陳述句的執行計劃
(3)存盤引擎:
MySQL服務器把資料的存盤和提取操作都封裝到了一個叫存盤引擎的模塊里;
連接管理、查詢快取、語法決議、查詢優化這些并不涉及真實資料存盤的功能劃分為MySQL server的功能,把真實存取資料的功能劃分為存盤引擎的功能;
在MySQL server完成了查詢優化后,只需按照生成的執行計劃呼叫底層存盤引擎提供的API,獲取到資料后回傳給客戶端
I. 常用存盤引擎.

II. 基本操作:
查看當前服務器程式支持的存盤引擎:SHOW ENGINES;
創建表時指定存盤引擎:mysql> CREATE TABLE engine_demo_table(
-> i int
-> ) ENGINE = MyISAM;
修改表的存盤引擎: ALTER TABLE 表名 ENGINE = 存盤引擎名稱
二、啟動選項和組態檔
1、
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289236.html
標籤:其他
