資料庫 | 001-MySQL梳理系列(一)
阿新 • • 發佈:2021-01-26
### MySQL基本組成
![](https://img2020.cnblogs.com/other/2024393/202101/2024393-20210126090312994-2023149816.png)
#### SQL執行流程
![](https://img2020.cnblogs.com/other/2024393/202101/2024393-20210126090313496-1474156385.png)
* Server 層主要包括聯結器、查詢快取、分析器、優化器、執行器,包含了MySQL主要的很多核心功能,以及所有的內建函式、儲存過程、觸發器、檢視等,其實就是所有跨儲存引擎的功能都是在這一層實現的
* 儲存引擎層,主要負責資料的儲存和讀取,是以外掛的形式存在的 ,支援如 `InnoDB` 、`MyISAM`、`Memory` 等多個儲存引擎,現在預設為 `InnoDB`
#### 查詢快取
* 當一個SQL執行時首先會進入查詢快取
* 檢視之前是否執行過該語句,如果執行過則會以key-value的形式儲存在快取中,key是查詢語句,value是查詢結果
* 如果快取命中則直接返回結果,如果查詢語句不在快取中繼續後面的流程
* **大多數情況下我們不推薦使用查詢快取**,因為快取失效非常頻繁,只要一個更新,那麼這個表上所有的快取都會失效,吐過資料的更新比較多,那麼緩衝命中的效率很低,不斷的在失效
* 在MySQL中提供了引數 `query_cache_type` 引數來設定,預設是 `DEMAND` ,表示對預設的SQL都不使用查詢快取,如果要對特的語句進行快取查詢,則可以使用 `SQL_CACHE` 來顯示的指定,如 `select SQL_CACHE * from T where ID=1;`
* 在MySQL8.0 開始,查詢快取整個功能模組已經刪除掉不再擁有
#### 分析器
* 分析器主要包含**詞法分析**與**語法分析**
* 詞法分析主要分析一條SQL中各個字串代表什麼,比如 `select` 標記出來,這就是一個查詢,在具體的表名,查詢 的欄位等等全部分析出來
* 語法分析主要是分析SQL語句是否符合MySQL的規範,如果我們SQL寫的有問題,那麼經常看到的一個異常就是 `You have an error in your SQL syntax` 的提示
#### 優化器
* 對我們的SQL進行優化,得到更高的執行計劃
* 如有多個索引時確定要用那個索引
* 當有多變聯查`join` 時,查詢表的順序
* 對查詢條件和語句的優化
#### 執行器
* 首先校驗是否有對這張表的訪問許可權,如果沒有許可權則會報錯
* 如果有,則根據引擎介面開啟表進行資料的查詢篩選
#### Buffer Pool
* 預設大小`128MB`, 偏小
* 對於16核32G機器,可以分配2G記憶體,配置檔案:`my.ini` 配置:
> [server]
> innodb_buffer_pool_size = 2147483648
#### 資料頁
* MySQL中對資料進行抽象,按照資料頁的形式來存放到檔案,當查詢時,首先定位到要查詢資料所在的資料頁,之後將整個資料頁載入到`Buffer Pool` 中,
* 資料頁預設的大小是 `16KB` , 也就是一頁資料包含`16KB`的資料
* 在`BufferPool` 中的資料頁一般我們叫快取頁,預設情況下快取頁與磁碟上的資料頁大小是對應的
* 對於每個快取頁都有一個描述資訊
* 描述資訊包括:資料頁的所屬表空間,資料頁的標號,這個快取頁在`Buffer Pool` 中的記憶體地址以及其他一些資訊
* 在 `Buffer Pool` 中,所有的描述資訊都在最前面,然後各個快取頁放在後面
![](https://img2020.cnblogs.com/other/2024393/202101/2024393-20210126090314075-1505570063.png)
* 描述資料大小相當於快取頁大小的`5%` 左右,也就是大概`800`位元組,所以當我們設定`buffer pool` 的大小為`128MB` ,但是實際上 `Buffer Pool` 的真實大小會超出一些,可能有有`130MB` 左右,這多出來的就是每個快取頁的描述資訊
#### 表空間
* 平時我們建立張表時都會在磁碟上對應著一個`表名.ibd` , 這樣的磁碟資料檔案,這就是表空間的概念和物理體現
* 對於一些系統表空間可能存在著對應多個磁碟檔案,我們自己建立的表對應的表空間一般都是對應一個 `表名.ibd` 的資料檔案
#### 資料區
* 在表空間中有太多的資料頁不好管理,這是引入了**資料區**的概念,英文:`extent`
* 一個數據區中有連續的`64`個數據頁,每個資料頁`16kb`, 所以每個資料區大小是`1MB`
* 同時`265`個數據區被劃分為一組
* 在表空間中**第一組**資料區的**第一個資料區**的**前三個資料頁**是固定的,存放一些特殊的描述性的資訊
- `FSP_HDR` 資料頁: 存放一些表空間和這一組資料區的屬性
- `IBUF——BITMAP` 資料頁:存放這組資料頁所有的 `insert buffer` 的一些資訊
- `INODE` 資料頁:存放一些特殊資訊
* 表空間中其他各組資料區的第一個資料區的頭兩個資料頁都是存放特殊資訊的
--------------------------------------------------------------------------
> 本文由AnonyStar 釋出,可轉載但需宣告原文出處。
> 歡迎關注微信公賬號 :雲棲簡碼 獲取更多優質文章
> 更多文章關注筆者部落格 :[雲棲簡碼 i-code.online](https://i-code.