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