學習筆記-mysql的基礎架構

mysql,是我們經常用到的數據庫,而我們平時所用到的操作,大多是輸入一條sql,然后獲取返回結果。例如:

select * from t where id = 1;

基本上不會關注mysql內部的執行流程。

基礎架構:

下面我們就簡單的說一下mysql的基本架構,從而簡單的窺探一番sql的基本流程。
下面是mysql的基本架構圖:


mysql邏輯架構.png

mysql大體上可以分為Server層和存儲引擎。
server層包含連接器、查詢緩存、解析器、優化器、執行器等,涵蓋了mysql的基本核心功能和所有內置函數(日期、時間、數學和加密函數等),所有跨存儲引擎的功能都在這一層實現,比如存儲過程、觸發器、視圖等。

存儲引擎負責數據的存儲和提取,架構是插件式的,支持InnoDB、MyISAM、Memory等。目前最常用的是InnoDB,從mysql5.5開始成為了默認引擎。創建表時,可以通過指定引擎類型來選擇引擎,比如

CREATE TABLE t
(
   id    VARCHAR(40)
) ENGINE=INNODB  DEFAULT CHARSET=utf8 ;#指定引擎和存儲字符類型

下面簡單介紹一下server層各個組件的作用。

連接器

連接器是你連接到數據庫的第一個接待者。連接器負責跟客戶端建立連接、獲取權限、維持和管理連接。連接命令如下:

mysql -h$ip -P$port -u$user -p;

密碼可以寫在-p后面的命令行中,為安全起見,強烈建議不要這么做。
mysql客戶端和服務端建立連接,完成經典的TCP握手協議后,連接器就開始驗證身份,這時候就需要輸入密碼。

  • 如果用戶名密碼不匹配,返回"Access denied for user"的錯誤。
  • 如果密碼驗證通過,連接器會去權限表查詢你所擁有的權限。之后這個連接里的權限判斷邏輯,都會依賴于此時讀到的邏輯。這意味著,如果更改了這個用戶的權限,是不會影響到已經建立的連接。新的連接才會讀取到新的權限

連接完成后,如果你沒有后續的動作,這個連接就處于空閑狀態可以使用show processlist命令查看。其中Command顯示Sleep的這一行表示的有多少個空閑的連接。
如果客戶端太長時間沒有動作,連接器會自動斷開連接,這個時間默認是8小時,可以進行配置。

建立連接的過程是有一定開銷的,會因此建議在使用中盡量使用長連接。
但全部使用長連接后,有時候會發現mysql的內存占用漲的特別快。
這是因為mysql在執行過程中的臨時內存是管理在連接對象里面的,這些資源在連接斷開的時候才會釋放(不太理解,待后續查證)

查詢緩存

建立連接之后,就可以執行select語句了,執行邏輯第二步:查詢緩存。
但是這個緩存使用往往弊大于利。因為緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的緩存都會被清空。mysql8.0之后已經徹底刪除這塊功能了。不再贅述。

解析器

執行語句,首先要知道語句要做什么,因此需要對語句做解析。如果你的語句語法不正確,會受到You have an error in your SQL syntax的錯誤提醒。

優化器

在開始執行sql之前,mysql還會對語句進行優化處理。

  • 優化器在表里有多個索引的時候,決定使用哪個索引
  • 多表關聯的時候,決定表的連接順序
    例如join語句:
select * from t1 join t2  using(id) where t1.c = 10 and t2.d = 20;

既可以先從t1中取出c=10的記錄,在根據id關聯t2,然后再判斷t2.d是否等于20;也可以先從t2中取出d=20的記錄關聯t1,再判讀t1.c是否滿足。
優化器決定使用哪一種方案。

執行器

開始執行的時候,優先要判斷是否對這個表有權限,如果沒有們就會返回錯誤。
查詢流程中,如果id沒有索引,那么順序是這樣的:
1. 調用InnoDB引擎接口獲取表的第一行,然后判斷id是否是1,如果不是則跳過,如果是則將結果存在結果集中;
2. 調用引擎接口獲取“下一行”,重復判斷邏輯,直至最后一行。
3. 執行器將遍歷結果組成的記錄集返回給客戶端。
對于有索引的表,執行邏輯類似,第一次調用“取滿足條件的第一行”,之后循環取“滿足條件的下一行”這個接口。

在慢查詢語句中有個rows_examined的字段,這個值是執行器調用引擎獲取數據行的時候累加的。有些場景下,執行器調用一次,引擎內部會掃描多行,因此引擎掃描行數跟rows_examined并不是完全相同的。


(注:部分內容來源于網路和一些學習資料,并非本人原著)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378