MySQL可以分為Server層和存儲引擎層兩部分错维。
Server層包含連接器(管理鏈接,權(quán)限驗(yàn)證)、查詢緩存(命中則直接返回結(jié)果)、分析器(詞法分析,語法分析)、
優(yōu)化器(執(zhí)行計(jì)劃生成,索引選擇)诱桂、執(zhí)行器等(執(zhí)行引擎,返回結(jié)果)。
存儲引擎層負(fù)責(zé)數(shù)據(jù)的存儲和提取呈昔。其架構(gòu)模式是插件式的挥等,支持InnoDB、MyISAM堤尾、Memory等多個存儲引擎肝劲。
從MySQL 5.5.5版本之后,InnoDB成為默認(rèn)引擎。
SQL的執(zhí)行順序: 通過mysql連接到服務(wù)器-->執(zhí)行select(查詢緩存),如果命中,直接返回,如果沒有命中,往下執(zhí)行-->分析器-->優(yōu)化器-->執(zhí)行器哀峻。
連接器
MySQL客戶端連接到服務(wù)端,如果長時間沒有指令,連接器就會自動將它斷開涡相。wait_timeout 默認(rèn)值為9小時。
建立長連接,長時間不斷,會導(dǎo)致OOM,如何解決:
- 定期斷開長鏈接剩蟀。
- 如果使用MySQL 5.7或更新版本,在執(zhí)行一個比較大的操作后,通過執(zhí)行mysql_reset_connection來重新初始化連接資源。
查詢緩存
MySQL拿到一個查詢請求后,會先到查詢緩存,之前是不是執(zhí)行過這條語句切威。如果直接在命中,直接返回;如果不在查詢緩存中,就會繼續(xù)后面執(zhí)行階段育特。
查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。
MySQL提供了"按需使用"的方式先朦。將參數(shù)query_cache_type設(shè)置為DEMAND,對于默認(rèn)SQL的語句都不使用查詢緩存缰冤。
MySQL 8.0版本直接將查詢緩存的整塊功能刪除。
分析器
對語句進(jìn)行詞法分析和語法分析喳魏。
優(yōu)化器
優(yōu)化器是在表里面有多個索引的時候,決定使用那個索引;或者在一個語句有多表關(guān)聯(lián)的時候,決定各個表的連接順序棉浸。
執(zhí)行器
執(zhí)行器的流程:
- 調(diào)用InnoDB引擎接口取這個表的第一行,進(jìn)行判斷,如果符合條件,存儲在結(jié)果集中,如果不符合條件,跳過;
- 調(diào)用引擎接口取下一個,重復(fù)相同的判斷邏輯,直到取到這個表的最后一行。
- 執(zhí)行器將上述遍歷過程中所有滿足條件的行組成的記錄集作為結(jié)果集返回給客戶端刺彩。
查詢慢查詢?nèi)罩?rows_examined表示掃描了多少行.