MySQL可以分為Server層和存儲(chǔ)引擎層兩部分器净。
Server層包含連接器(管理鏈接,權(quán)限驗(yàn)證)糕殉、查詢緩存(命中則直接返回結(jié)果)颈将、分析器(詞法分析,語(yǔ)法分析)、
優(yōu)化器(執(zhí)行計(jì)劃生成,索引選擇)饥脑、執(zhí)行器等(執(zhí)行引擎,返回結(jié)果)恳邀。
存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提取。其架構(gòu)模式是插件式的灶轰,支持InnoDB谣沸、MyISAM、Memory等多個(gè)存儲(chǔ)引擎框往。
從MySQL 5.5.5版本之后,InnoDB成為默認(rèn)引擎鳄抒。
SQL的執(zhí)行順序: 通過(guò)mysql連接到服務(wù)器-->執(zhí)行select(查詢緩存),如果命中,直接返回,如果沒(méi)有命中,往下執(zhí)行-->分析器-->優(yōu)化器-->執(zhí)行器闯捎。
連接器
MySQL客戶端連接到服務(wù)端,如果長(zhǎng)時(shí)間沒(méi)有指令,連接器就會(huì)自動(dòng)將它斷開椰弊。wait_timeout 默認(rèn)值為9小時(shí)。
建立長(zhǎng)連接,長(zhǎng)時(shí)間不斷,會(huì)導(dǎo)致OOM,如何解決:
- 定期斷開長(zhǎng)鏈接瓤鼻。
- 如果使用MySQL 5.7或更新版本,在執(zhí)行一個(gè)比較大的操作后,通過(guò)執(zhí)行mysql_reset_connection來(lái)重新初始化連接資源秉版。
查詢緩存
MySQL拿到一個(gè)查詢請(qǐng)求后,會(huì)先到查詢緩存,之前是不是執(zhí)行過(guò)這條語(yǔ)句。如果直接在命中,直接返回;如果不在查詢緩存中,就會(huì)繼續(xù)后面執(zhí)行階段茬祷。
查詢緩存的失效非常頻繁,只要有對(duì)一個(gè)表的更新,這個(gè)表上所有的查詢緩存都會(huì)被清空清焕。
MySQL提供了"按需使用"的方式。將參數(shù)query_cache_type設(shè)置為DEMAND,對(duì)于默認(rèn)SQL的語(yǔ)句都不使用查詢緩存祭犯。
MySQL 8.0版本直接將查詢緩存的整塊功能刪除秸妥。
分析器
對(duì)語(yǔ)句進(jìn)行詞法分析和語(yǔ)法分析。
優(yōu)化器
優(yōu)化器是在表里面有多個(gè)索引的時(shí)候,決定使用那個(gè)索引;或者在一個(gè)語(yǔ)句有多表關(guān)聯(lián)的時(shí)候,決定各個(gè)表的連接順序沃粗。
執(zhí)行器
執(zhí)行器的流程:
- 調(diào)用InnoDB引擎接口取這個(gè)表的第一行,進(jìn)行判斷,如果符合條件,存儲(chǔ)在結(jié)果集中,如果不符合條件,跳過(guò);
- 調(diào)用引擎接口取下一個(gè),重復(fù)相同的判斷邏輯,直到取到這個(gè)表的最后一行粥惧。
- 執(zhí)行器將上述遍歷過(guò)程中所有滿足條件的行組成的記錄集作為結(jié)果集返回給客戶端。
查詢慢查詢?nèi)罩?rows_examined表示掃描了多少行.