上圖為MySQL的簡易架構(gòu)圖,給您有一個大概的概念,下面我將為您進行進一步的分析。 連接器: 當連接MySQL數(shù)據(jù)庫時,等待的將是MySQL服務端的連接器;連接器的職責是和客戶端建立連接、獲取權(quán)限、維持和管理連接??蛻舳诉B接命令一般是如下所示(建議:不要在命令中顯示添加登入密碼): mysql -h$ip -p$port -u$user -p$password
查詢緩存: 建立完連接后,就可執(zhí)行select語句。執(zhí)行就會走向查詢緩存。 MySQL拿到這個查詢請求后,就會先到緩存中看看,之前是不是執(zhí)行了該語句。在查詢緩存中數(shù)據(jù)是以key-value形式存在的,key為執(zhí)行的查詢請求,value為查詢結(jié)果。如果執(zhí)行了就直接從緩存中把結(jié)果返回給客戶端,請求結(jié)束。如果語句不在緩存中,就執(zhí)行后續(xù)復雜操作。 在大多數(shù)情況下不建議使用查詢緩存,為什么呢?因為查詢緩存往往弊大于利。 查詢緩存的失效非常頻繁,只要對表進行了更新,該表的中查詢緩存全部清除。所以往往很多時候,緩存還沒使用就被清除了。對于更新壓力很大的數(shù)據(jù)庫來說,查詢緩存的命中率很低。如果你的業(yè)務中存在一張靜態(tài)表,很長時間才會更新一次。比如,系統(tǒng)配置表,那這張表的查詢才適合查詢緩存。 該功能是自動配置的??梢詫?shù) query_cache_type 設置成 DEMAND ,這樣對于默認的SQL語句就不會使用查詢緩存。而對于確定的查詢語句,可以使用 SQL_CACHE 顯示指定,比如如下語句: select SQL_CACHE * from t where id = 1;
注意:在MySQL8.0之后的版本,把查詢緩存模塊移除了。 分析器 在沒有命中查詢緩存后,MySQL開始真正執(zhí)行語句了。這時MySQL對該語句進行解析。 分析器首先進行詞法分析,一條sql由多個字符串和空格組成,MySQL需要分析出這些字符串是什么,代表什么。 做完識別之后,進行語法分析。根據(jù)詞法分析的結(jié)果,語法分析器會根據(jù)語法規(guī)則對sql語句進行分析,是否符合MySQL的語法規(guī)則。 優(yōu)化器 執(zhí)行完分析器后,MySQL就知道該sql語句要干什么了。在開始執(zhí)行之前,要經(jīng)過優(yōu)化器的處理。 優(yōu)化器在表里存在多個索引時,選擇執(zhí)行哪個索引;或者一個語句有多表關(guān)聯(lián)時(join),選擇各表的連接順序。 執(zhí)行器 MySQL通過分析器知道了該語句要做什么,通過優(yōu)化器知道該怎么做,于是進入到了執(zhí)行器階段,開始執(zhí)行語句。 開始執(zhí)行之前,首先會判斷用戶是否有對表的執(zhí)行權(quán)限(如果是在查詢緩存得到結(jié)果,會在返回結(jié)果之前進行權(quán)限校驗),如果沒有會報錯.。如果有權(quán)限,就打開表繼續(xù)執(zhí)行語句。打開表的時候,執(zhí)行器會根據(jù)表的引擎定義,去使用引擎提供的接口。 存儲引擎 MySQL區(qū)別于其他數(shù)據(jù)的最具有點的是存儲引擎接口模塊,MySQL可進行插拔存儲引擎。 MySQL的存儲引擎有很多種,比如:InnoDB、MyISAM、ISAM、Memory等。在MySQL5.6之前,默認存儲引擎是MyISAM,而在該版本之后默認的是InnoDB。下表是兩者之前的區(qū)別:
近期在學習MySQL數(shù)據(jù)庫, 后續(xù)將會持續(xù)更新學習隨筆。
|
|