初識 MySQL
通信介紹
MySQL 也是典型的 C / S 模型,分為客戶端及服務端,服務端一般部署在遠端服務器中,也可以部署至本地,然后客戶端跟服務端通信則可以使用依賴網絡的 TCP 長連接或 Unix-like 的系統下可以使用 Socket文件的形式通信
連接階段
客戶端跟服務器端通信,MySQL 服務器會維護為每個客戶端請求建立一個線程專門處理請求
連接可以通過 SSL 保證傳輸安全性,實際情況一般都是通過 SSL 訪問跳板機再通過內網地址訪問到 MySQL 服務器
MySQL 服務器也會通過用戶名,密碼,主機信息來做認證,判斷是否提供對應權限的服務
查詢緩存階段
MySQL 服務器為提供查詢效率,所以加入了全局緩存,當緩存命中時可以直接返回結果。但是實際兩個請求只要有任何字符上的不一樣,都會導致緩存不能命中,同時對于讀寫相差不多或寫多讀少的表,每次寫操作都會導致緩存失效造成不必要的開銷,所以在 MySQL 5.7+ 版本中該功能以及被廢棄,MySQL 8.0+ 版本中被移除
語法解析階段
如果緩存沒有命中,MySQL 服務接下去就會開始解析 SQL 語句,如果有語法錯誤則直接返回至客戶端,沒有問題則會將 SQL 語句轉換為 MySQL 內部的數據結構(解析樹)
查詢優化
語法解析之后,MySQL 服務器已經知道客戶端想如何去獲取數據,接下來服務器會對語句的執行進行優化,例如外連接轉換為內連接,表達式簡化,子查詢轉換為連接之類的,這部分優化不會對查詢結果有影響,類似于數學上的因式分解,但是執行效率更高。完成優化后,生成的結果就是執行計劃,這時根據執行計劃就可以知道該從哪個表,使用哪個索引,查詢哪些數據等所有的具體操作。
我們可以使用 EXPLAIN 語句查詢某個 SQL 的執行計劃,然后對 SQL 進行優化
存儲引擎
當擁有執行計劃后,MySQL 服務接下去就要真正的去持久化的區域,將數據取出來交給客戶端,這里為了能支持各種各樣的持久化策略,MySQL 對下層的所有控制都依賴于統一的存儲引擎 API,然后不同的存儲引擎提供各自的具體實現
不同的存儲引擎,目標場景不同,實現方式與特性也不同,可以根據實際場景進行選擇,場景的存儲引擎如下:
存儲引擎
描述
ARCHIVE
用于數據存檔 (行插入后不能再被修改)
CSV
在存儲數據時,以逗號分隔各個數據項
InnoDB
具備外鍵功能的事務存儲引擎
MERGE
用來管理多個 MyISAM 表構成的表集合
NDB
MySQL 集群專用存儲引擎
BLACKHOLE
丟棄寫操作,讀操作會返回空內容
FEDERATED
用來遠程訪問表
MEMORY
置于內存的表
MyISAM
主要的非事務處理存儲引擎
數據庫可以配置一個默認的存儲引擎,而每個表還可以單獨指定一個不同的存儲引擎,例如:
MySQL 調控
MySQL 服務器正常運行,會有非常多的配置參數,并且這些參數是支持根據實際場景進行修改的,主要有 **啟動選項 ** 和 配置文件 的方式
啟動選項
常規在命令行下使用一個命令,為了讓這個命令根據用戶不同的需求產生不能的行為,都會傳遞一個這個命令支持的選項參數,然后命令解析到這個參數后,就會按固定的行為來工作
比如 ls 表示將當前目錄下的文件信息都展示出來,而 ls -l 通過傳遞一個 -l 的選項,表示修改展示的內容及方式,這種類似的操作就是傳遞啟動選項,MySQL 服務器在啟動時也支持大量的啟動選項
啟動選項一般包含長形式和短形式,比如 MySQL 服務器配置監聽主機名的選項,長形式就是 –host,而短形式就是 -h,他們的作用是相同的,相當于短地址數量有限,所有只有一些常用的選項有短形式
注意:選項名區分大小寫,所以 -p 與 -P 完全不一樣,而短形式指定選項時,可以跟空格,也可以不跟(-p有些特殊,-p和密碼值之間是不能用空格的),所以 -P 3306 和 -P3306 是一樣的
配置文件
啟動選項僅針對單次啟動生效,也就是不會將配置進行持久化,而配置文件是持久化到本地的,所以不需要每次啟動時都輸入,所以非常方便
Unix like 操作系統下,默認 MySQL 服務器會從以下路徑來尋找配置文件:
路徑
備注
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf
特定于服務器的選項
defaults-extra-file
命令行指定的額外配置文件路徑
~/.my.cnf
用戶特定選項
~/.mylogin.cnf
用戶特定的登錄路徑選項(僅限客戶端)
說明:
1、 SYSCONFDIR 表示在使用 CMake 構建時使用 SYSCONFDIR 選項指定的目錄,通常情況下,默認配置是編譯安裝目錄下的 etc 目錄
2、 MYSQL_HOME 是自定義的環境變量,可配可不配,僅代表可以自定義放置配置文件的路徑
3、 ~ 表示跟當前登錄用戶相關,也就是根據用戶不同的配置方式,放置到每個用戶自己的目錄下
4、 defaults-extra-file 表示在啟動 MySQL 服務是,指定的編譯文件的目錄,例如:
`mysqld --defaults-extra-file=/tmp/my.cnf` 這樣啟動,則會訪問 /tmp/my.cnf 這個路徑下的配置文件
配置文件的內容
配置文件的啟動選項被分為若干個組,每個組有個組名,用中括號包裹
對應到啟動選項中,配置的這兩個選項的使用方式應該類似于:
mysqld --option1 --option2=value2
其次是分組的適用范圍:
1、 server 分組表示所有 MySQL 服務器程序都會讀取使用
2、 client 分組表示所有 MySQL 客戶端程序都會讀取使用
3、 mysqld 命令啟動 MySQL 服務器程序會讀取 [mysqld],[server]
4、 mysqld_safe 命令啟動 MySQL 服務器程序會讀取 [mysqld],[server],[mysqld_safe]
5、 mysql.server 命令啟動 MySQL 服務器程序會讀取 [mysqld],[server],[mysql.server]
6、 mysql 命令啟動客戶端程序會讀取 [mysql],[client]
7、 mysqladmin 命令啟動客戶端程序會讀取 [mysqladmin],[client]
8、 mysqldump 命令啟動客戶端程序會讀取 [mysqldump ],[client]
注意:同一個配置文件中,多個組都修改了同一個選項,并且這幾個組都能被讀取,則按從上到下的順序進行讀取,也就是最后一個配置會覆蓋之前的配置項
系統變量
除了監聽的端口ip等參數以外,MySQL 服務還有大量的系統變量,能影響 MySQL 服務程序的行為,跟之前的區別在于,這些系統變量除了配置文件和啟動選項能修改外,還支持通過 SQL 動態的更改
例如 default_storage_engine 表示 MySQL 服務默認的儲存引擎,max-connections 表示 MySQL 服務默認的儲存引擎,通過啟動選項的方式配置如下:
通過配置文件的方式配置參考如下:
而通過 SQL 語句配置參考如下:
變量作用范圍
與一般編程語言相似,MySQL 的系統系統變量也有作用范圍的說法,不過不是全局和局部,而是全局跟用戶,如果是 GLOBAL 下修改了這個參數,則對所有 MySQL 用戶而言,都以最新的參數進行工作,而在 SESSION 下修改了這個參數,則僅對當前的 MySQL 用戶生效
另外,不是所有的系統變量都有兩種作用范圍的,比如 max-connections 只具有 GLOBAL 的作用范圍,而 insert_id 只具有 SESSION 的作用范圍,像 version 這種變量更為特殊,屬于只讀的系統變量,不可更改
系統變量跟啟動選項的區別
啟動選項是程序啟動時傳遞的參數,而系統變量是程序在運行時,控制程序行為的變量,關系如下:
大部分的系統變量都可以通過啟動選項的方式進行配置
部分系統變量是程序自動生成,不可通過啟動選項的方式進行配置,例如:auto_increment_offset
部分啟動選項也不是系統變量,例如:defaults-file
狀態變量
為了更好的了解 MySQL 服務的運行狀況,服務提供了大量的關于運行狀態的變量,稱為狀態變量。例如:Threads_connected 表示當前已經連接的數量
狀態變量用于顯示服務器的狀態信息,他們的值只能由 MySQL 服務程序自己維護,而不能手動配置