問題:請講下對mysql的理解
分析:該問題主要考察對mysql的理解,基本概念及sql的執行流程
回答要點:
主要從以下幾點去考慮,
1、mysql的整體架構?
2、mysql中每一個組件的作用?
3、對mysql的自己的見解?
從網上拷貝一張圖,來說明mysql的整體架構
個人認為這張圖畫的很好,
連接器
一條sql經過網絡傳輸到達mysql服務器,第一個要經過的就是連接器,負責連接的建立及權限的判定,例如經常看到的下面的錯誤,
ERROR?1045?(28000):?Access?denied?for?user?'root'@'localhost'?(using?password:?YES)
該錯誤就是經過連接器的處理,密碼不正確而返回的。
查詢緩存
查詢緩存,剛接觸mysql的可能有疑惑,mysql怎么會有查詢緩存,其實mysql就和平時開發的后端系統是一樣的,它也是一個系統,平時如果一個查詢較多的系統,發現查詢慢了,經常采取的一種方式就是增加一個緩存吧,這里也是一樣的,只不過這里mysql已經為我們做好了,就是來存儲查詢到的數據,緩存key是sql語句,緩存值是查詢到的結果,關于查詢緩存的具體介紹可以參照下方的鏈接:https://www.cnblogs.com/coshaho/p/7192343.html
分析器
分析器說的通俗點就是客戶端發送來的一條sql,分析要分析這條sql是否正確,是否符合sql的語法,如果不符合就直接返回報錯了。
優化器
經過了分析器處理的sql這時就是一條可執行的sql,但是mysql本身內置了一系列的邏輯,就是它會用它認為執行效率最高的方式去執行,并且生成執行計劃(可通過explain sql語句查看),包括如何選擇索引,是否會涉及全表掃描;
執行器
執行器就是真正執行sql的組件,并且把執行的結果返回
上面提到的幾大組件,統一屬于server層,server層之下是存儲引擎層,mysql的存儲引擎常見的有myIsam、innodb,不同的引擎對應的server層是一致的,也就是server層提供了引擎層的統一抽象和實現。為什么要有不同的存儲引擎,是因為在不同的場景下數據的存儲形式可以是不一樣的,myIsam這個引擎實現的就是適合查詢頻率高的場景,不支持事務;innodb這個引擎實現的是支持事務。也就是說不同的場景決定了不同的引擎,所以在建數據表的時候經常會讓我們指定使用的數據引擎,細心的同學可以留意下。
說完了mysql的整體架構,想說下mysql中常見的日志是怎么實現的,
binlog,做過mysql的都知道,在mysql中有binlog也叫做二進制日志,用來記錄mysql中的更新操作,可用來進行數據的恢復,既然是記錄mysql的更新操作,那么它就屬于server層
redo log和undo log,了解事務的都知道redo log和undo log是用來支持事務的,在常用的myIsam和innodb引擎中,innodb是支持事務的,那么redo log和undo log應該是在引擎層產生的;