MySQL深入學習-day1

大隊長11發表於2022-05-17

書名《MySQL是怎樣執行的:從根兒上理解MySQL》可自行百度

以下是知識點總結

重新認識Mysql

MySQL是一個C/S架構的軟體。

在Windows安裝後首先註冊成服務,然後會在開機後自啟動。

啟動MySQL服務端。

直接在bin目錄下執行mysqld 或者在配置檔案my.ini中設定一些預設的啟動引數。

  • 在MySQL安裝目錄的bin下使用mysqld指令啟動MySQL服務,Windows版沒有mysqld_safe這些,它會在最後呼叫mysqld,但是會在其之前啟動監控程式,本質是一樣的。
  • 定義環境變數,直接使用mysqld,就可以在隨地使用bin下的命令。比較方便。

啟動MySQL客戶端。

在bin目錄下,使用命令 mysql -uroot -p1111 即使用TCP/IP連上本地的Mysql,如果需要指定IP和埠的話 mysql -hlocalhost -P3306 -uroot -p11111

  • 一種是TCP/IP。指定IP和埠,使用TCP/IP和服務端連線和互動。
  • 其他的管道和共享記憶體,類UNIX使用socket連線。

伺服器處理客戶端請求

  1. 首先客戶端向伺服器端傳送內容。
  2. 伺服器端接收後通過連線管理,分配一個連線給當前請求的程式。
  3. 伺服器端進行解析,語句優化,快取匹配(匹配成功就會直接返回)。
  4. 伺服器端進行進行解析語句,形成一個explain,然後由儲存引擎去執行explain,然後返回結果。

常用的儲存引擎

  • InnoDB,即是mysql 的預設儲存引擎,支援事務回滾。
  • MyISAM,等等。

Mysql的調控按鈕

啟動選項的兩種方式

  • 命令列的方式
  • 配置檔案方式

一種是服務端的啟動,即mysqld 的方式啟動。

我們可以直接在命令列後面使用 --引數=引數1。具體引數可以使用mysqld --help

還有就是配置檔案的方式,配置檔案中存放了各種命令的啟動引數,在啟動時就會進行啟動引數的初始化。

舉例mysqld,mysqld配置檔案中會載入[mysqld]組和[server]組的啟動引數。當出現重複的啟動引數時,就會後續載入的引數就會直接覆蓋前面的引數。載入順序是[mysqld] -> [server] -> 命令列。

系統變數

其中呢啟動項大部分是設定一些系統變數的。系統變數就是調控mysql執行的重要引數。比如設定儲存引擎,設定最大接收的執行緒數。

同時呢系統變數也分兩類GLOBAL和SESSION。

GLOBAL的系統變數就是MySQL伺服器的系統變數,當有一個新的客戶端連線到伺服器時,就會為客戶端建立一個SESSION,並用GLOBAL初始化SESSION系統變數。客戶端可以根據自身需求來更新系統變數,如果希望更改全域性的系統變數就變更GLOBAL。

set @@GLOBAL.default-storage-engine=InnoDB  
# 這樣更新全域性後續連線都會根據此更新,已經有的連線不會變更。同時變更當前會話的就改成SESSION

狀態變數

簡而言之就是MySQL記錄當前服務端的狀態的變數,這些狀態變數只能由MySQL來設定,客戶端可以對其進行檢視來監控MySQL。

字符集和比較規則

我們舉例客戶端向服務端傳送一段SQL。

一段字串要在程式中通訊,就需要對其進行按照一定規則編碼成0101,然後傳送到伺服器端,伺服器端需要在根據其編碼規則在進行解碼,將其還原成字串。

MySQL中支援很多的字符集,可以使用 show charset; 命令進行檢視。

MySQL8.0.22中支援41種字符集。下面列舉一部分,最常見和最熟知的就是utf8了,但是在MySQL中utf8是對創始人對其進行的刪減,真正的是utf8mb4需要注意。

utf32 UTF-32 Unicode utf32_general_ci 4
utf8 UTF-8 Unicode utf8_general_ci 3
utf8mb4 UTF-8 Unicode utf8mb4_0900_ai_ci 4

每一種字符集對應著多種比較規則,但是每一種比較規則只對應著一種字符集。

字符集分為多個級別。

  1. 服務端的字符集,為最高階別的字符集。

image

  1. 資料庫的字符集,可以指定,也可以預設為服務端的字符集
  2. 表的字符集,可以指定,也可以預設為資料庫的字符集
  3. 列的字符集,同樣預設表的字符集

客戶端和伺服器端通訊中的字符集

客戶端傳送資訊到服務端的流程

  1. 首先客戶端傳送字串,先經過作業系統編碼(Windows編碼方式為gbk,類unix為uft8)後,傳送到服務端。
  2. 服務端接收到請求,根據character_set_client的字符集進行解碼,然後轉碼成character_set_connection的字符集,然後由character_set_connection交給儲存引擎。
  3. 儲存引擎得到結果後,返回根據character_set_result進行編碼傳送到客戶端。

在實際的連線中通常就是上面提到的系統變數都是和作業系統的字符集是一樣的。

比較規則

比較規則就是進行比較的規則,當出現排序預期和我們想象的不一樣,可能就是出現了比較規則的錯誤,可能需要更換比較規則。

相關文章