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