我們經(jīng)常說,看一個事兒千萬不要直接陷入細(xì)節(jié)里,你應(yīng)該先鳥瞰其全貌,這樣能夠幫助你從高維度理解問題。同樣,對于 MySQL 的學(xué)習(xí)也是這樣。平時我們使用數(shù)據(jù)庫,看到的通常都是一個整體。比如,你有個最簡單的表,表里只有一個 ID 字段,在執(zhí)行下面這個查詢語句時:
? 復(fù)制代碼
mysql> select * from T where ID= 10 ;
我們看到的只是輸入一條語句,返回一個結(jié)果,卻不知道這條語句在 MySQL 內(nèi)部的執(zhí)行過程。
所以今天我想和你一起把 MySQL 拆解一下,看看里面都有哪些“零件”,希望借由這個拆解過程,讓你對 MySQL 有更深入的理解。這樣當(dāng)我們碰到 MySQL 的一些異常或者問題時,就能夠直戳本質(zhì),更為快速地定位并解決問題。
下面我給出的是 MySQL 的基本架構(gòu)示意圖,從中你可以清楚地看到 SQL 語句在 MySQL 的各個功能模塊中的執(zhí)行過程。
當(dāng)我們輸入一條 SQL 查詢語句時,發(fā)生了什么?
大體來說,MySQL 可以分為 Server 層和存儲引擎層兩部分。
Server 層包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,涵蓋 MySQL 的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時間、數(shù)學(xué)和加密函數(shù)等),所有跨存儲引擎的功能都在這一層實(shí)現(xiàn),比如存儲過程、觸發(fā)器、視圖等。
而存儲引擎層負(fù)責(zé)數(shù)據(jù)的存儲和提取。其架構(gòu)模式是插件式的,支持 InnoDB、MyISAM、Memory 等多個存儲引擎。現(xiàn)在最常用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始成為了默認(rèn)存儲引擎。
但是全部使用長連接后,你可能會發(fā)現(xiàn),有些時候 MySQL 占用內(nèi)存漲得特別快,這是因?yàn)?MySQL 在執(zhí)行過程中臨時使用的內(nèi)存是管理在連接對象里面的。這些資源會在連接斷開的時候才釋放。所以如果長連接累積下來,可能導(dǎo)致內(nèi)存占用太大,被系統(tǒng)強(qiáng)行殺掉(OOM),從現(xiàn)象看就是 MySQL 異常重啟了。