mysql 1 基礎架構

2021-10-04 01:12:52 字數 2815 閱讀 3411

我們可以將mysql分為兩大層server層儲存引擎層

1.聯結器

聯結器:負責和客戶端建立連線,獲取許可權,維持和管理連線

連線命令示例:

mysql -h 127.0.0.1 -p 3306 -u root -p
上面的命令,其實就是我們通過客戶端工具mysql去連線服務端,也就是建立連線。

連線建立成功後會提示我們輸入密碼,如果密碼輸入正確,聯結器會去許可權表查詢你所擁有的許可權。之後,這個連線裡面的許可權判斷邏輯,都是依賴此時讀到的許可權。

這就意味著,乙個使用者成功建立連線後,即使你用管理員賬號對這個使用者的許可權做了修改,也不會影響已經存在連線的許可權。修改完成後,只有再新建的連線才會使用新的許可權設定。

連線完成後,你可以通過命令show processlist;檢視連線,我們可以看到目前有兩條連線,其中一條是sleep空閒狀態,客戶端如果太長時間沒有動靜,聯結器就會掐斷這個連線。這個時間是由引數 wait_timeout 控制的,預設值是 8 小時

tips:希望大家能對預設的wait_timeout=8小時,這個引數比較敏感。如果遇到服務每隔一段時間連不上mysql,並且時間大概是8小時左右,可以往是不是連線超時,導致連線被乾掉的原因。筆者是有遇到過相同的問題的。

長連線:連線成功後,如果客戶端持續有請求,則一直使用同乙個連線。

短連線:每次執行完很少的幾次查詢就斷開連線,下次查詢再重新建立乙個。

我們盡量使用長連線,因為建立連線都是很耗資源的。這就好比我們開發過程中推薦使用連線池一樣。

mysql異常重啟:全部使用長連線後,你可能會發現,有些時候 mysql 占用記憶體漲得特別快,這是因為 mysql 在執行過程中臨時使用的記憶體是管理在連線物件裡面的。這些資源會在連線斷開的時候才釋放。所以如果長連線累積下來,可能導致記憶體占用太大,被系統強行殺掉(oom),從現象看就是 mysql 異常重啟了。

解決方案:

定期斷開長連線。使用一段時間,或者程式裡面判斷執行過乙個占用記憶體的大查詢後,斷開連線,之後要查詢再重連。

如果你用的是 mysql 5.7 或更新版本,可以在每次執行乙個比較大的操作後,通過執行 mysql_reset_connection 來重新初始化連線資源。這個過程不需要重連和重新做許可權驗證,但是會將連線恢復到剛剛建立完時的狀態。

2.查詢快取

在執行一條查詢語句時候,會首先到查詢快取看看,之前是不是執行過這條語句。(之前執行過的查詢語句和結果會已key-value形式快取在查詢快取中)。

查詢快取優點和缺點:

優點:後續的查詢如果能命重快取就能很大提高效率

缺點:查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。

結論:通常情況下並不建議使用查詢快取,查詢快取太容易失效,弊大於例。除非對於一些靜態表,資料幾乎不更新,可以使用。(mysql8.0 廢除了查詢快取功能)

3.分析器

客戶端發起的sql請求沒有命重查詢快取,那麼後面就要開始執行這條查詢語句了。

首先,詞法分析,分析這條語句具體是要幹什麼。例如:select * from a where id=1,mysql 從你輸入的"select"這個關鍵字識別出來,這是乙個查詢語句。它也要把字串「a」識別成「表名 a」,把字串「id」識別成「列 id」。

然後,語法分析,根據詞法分析的結果,語法分析器會根據語法規則,判斷你輸入的這個 sql 語句是否滿足 mysql 語法。

4.優化器

經過分析器後,mysql就知道你要做什麼了。在開始執行sql前,會先經過優化器處理,獲得最優的執行方案。

5.執行器

mysql 通過分析器知道了你要做什麼,通過優化器知道了該怎麼做(最優方案),於是就進入了執行器階段,開始執行語句。

1.開始執行時候,會先判斷客戶端是否擁有該錶的許可權,沒有許可權,就會返回沒有許可權錯誤。

2.如果有許可權,那就開啟表繼續執行。執行器會去呼叫這張表儲存引擎提供的介面,呼叫引擎介面獲取到所有符合條件的資料。

例如select * from a where id=1innodb引擎:

呼叫引擎介面獲取表a的第一行,判斷id是不是1,如果是就放入結果集中,如果不是就跳過;

呼叫介面獲取下一行,重複相同邏輯到表最後一行

返回滿足條件的結果集給客戶端

對於有索引的表,執行的邏輯也差不多。第一次呼叫的是「取滿足條件的第一行」這個介面,之後迴圈取「滿足條件的下一行」這個介面,這些介面都是引擎中已經定義好的。

tips:慢查日誌中的rows_examined字段表示的是執行器呼叫儲存引擎獲取資料的次數;引擎掃瞄行數是引擎實際掃瞄了多少行。因此引擎掃瞄行數跟 rows_examined 並不是完全相同的

下一章:日誌系統:redo log和binlo

MySQL 1(基礎配置及DDL操作)

要將預設字符集設定為utf 8,防止插入中文資料報錯 第一步 關閉mysql服務 service mysql stop 第二步 修改配置檔案 vi usr my.cnf 第三步 啟動mysql服務 service mysql start 現在的預設字符集就是utf 8了 首先修改配置 將資料庫切換為...

Mysql (1)簡單認識Mysql

mysql 是一種關係型資料庫,預設埠號是3306 在5.5版之前,mysql的預設資料庫引擎是myisam,雖然效能極佳,而且提供了大量的特性,包括全文索引 壓縮 空間函式等,但myisam不支援事務和行級鎖,而且最大的缺陷就是崩潰後無法安全恢復。不過,5.5版本之後,mysql引入了innodb...

MySQL(1) 儲存引擎

儲存引擎就是如何儲存資料 如何為儲存的資料建立索引 如何更新 查詢資料等技術的實現方法。因為在關聯式資料庫中資料是以表的形式儲存的,所以儲存引擎也可以稱為表型別 即儲存和操作此表的型別 在oracle和sqlserver等資料庫中只有一種儲存引擎,所有的資料儲存管理機制都是一樣的 而mysql資料庫...