執行一條 select 語句,期間發生了什么? | 小林coding
目錄
1、連接MySQL服務器
2、查詢緩存
3、解析SQL語句
4、執行SQL語句
5、MySQL一行記錄的存儲結構
- Server 層負責建立連接、分析和執行 SQL
- 存儲引擎層負責數據的存儲和提取。支持InnoDB、MyISAM、Memory 等多個存儲引擎,不同的存儲引擎共用一個 Server 層。最常用的存儲引擎是 InnoDB,我們常說的索引數據結構,就是由存儲引擎層實現的,不同的存儲引擎支持的索引類型也不相同,比如InnoDB 支持索引類型是 B+樹
1、連接MySQL服務器
2、查詢緩存
3、解析SQL語句
在正式執行 SQL 查詢語句之前, MySQL 會先對 SQL語句做解析,這個工作交由「解析器」來完成。
如果我們輸入的 SQL語句語法不對,就會在解析器這個階段報錯。比如,查詢語句把 from寫成了 form,這時 MySQL 解析器就會給報錯。但是注意,表不存在或者字段不存在,并不是在解析器里做的。
4、執行SQL語句
5、MySQL一行記錄的存儲結構
MySQL 存儲的行為是由存儲引擎實現的,MySQL支持多種存儲引擎,不同的存儲引擎保存文件的方式自然也不同。InnoDB 是我們常用的存儲引擎,也是 MySQL默認的存儲引擎。所以,本文主要以 InnoDB?存儲引擎展開討論。
數據庫表中的記錄都是按行(row)進行存放的,每行記錄根據不同的行格式,有不同的存儲結構。記錄是按照行來存儲的,但是數據庫的讀取并不以「行」為單位,否則一次讀取(一次 I/O?操作)只能處理一行數據,效率會非常低。因此,InnoDB 的數據是按「頁」為單位來讀寫的,也就是說,當需要讀一條記錄的時候,并不是將這個行記錄從磁盤讀出來,而是以頁為單位,將其整體讀入內存。默認每個頁的大小為 16KB,也就是最多能保證 16KB 的連續存儲空間。頁是 InnoDB?存儲引擎磁盤管理的最小單元,意味著數據庫每次讀寫都是以 16KB 為單位的,一次最少從磁盤中讀取 16K 的內容到內存中,一次最少把內存中的 16K 內容刷新到磁盤中。