mysql的邏輯架構(gòu)分為三層:
? ? 一、客戶端:并非mysql獨(dú)有。功能:連接處理、授權(quán)認(rèn)證、安全等
? ? 二、核心服務(wù):有查詢(xún)解析、分析、優(yōu)化、緩存、內(nèi)置函數(shù)(比如:時(shí)間、加密、截取等);所有的跨存儲(chǔ)引擎的功能都在這里實(shí)現(xiàn),如:存儲(chǔ)過(guò)程、觸發(fā)器、視圖等
? ? 三、存儲(chǔ)引擎:負(fù)責(zé)mysql中的數(shù)據(jù)存儲(chǔ)和提取
mysql的體系結(jié)構(gòu)分為兩層:
? ? 一、mysql服務(wù)層
? ? ? ? 1、連接層:客戶端或引用程序通過(guò)接口(如:ODBC、JDBC)來(lái)連接mysql時(shí)最先通過(guò)連接層
? ? ? ? ? ? 1)通訊協(xié)議:負(fù)責(zé)檢測(cè)客戶端版本是否與服務(wù)端兼容
? ? ? ? ? ? 2)線程處理:對(duì)每一個(gè)連接請(qǐng)求都分配一個(gè)獨(dú)立的線程
? ? ? ? ? ? 3)用戶名密碼認(rèn)證:輸入的賬號(hào)、密碼及主機(jī)(host)是否可以連接到mysql服務(wù)器
? ? ? ? 2、sql層
? ? ? ? ? ? 1)權(quán)限判斷:判斷登錄用戶可以訪問(wèn)到mysql中的那些庫(kù)和表
? ? ? ? ? ? 2)查詢(xún)緩存:查詢(xún)時(shí)如果數(shù)據(jù)在query cache中直接返回否則查詢(xún)數(shù)據(jù)庫(kù)(mysql8中廢棄)
? ? ? ? ? ? 3)解析器:分為詞法解析和語(yǔ)法解析。詞法解析(把sql語(yǔ)句打碎成一個(gè)一個(gè)的單詞,判斷每個(gè)符號(hào)是什么類(lèi)型,從哪兒開(kāi)始從哪兒結(jié)束);語(yǔ)法解析(對(duì)sql進(jìn)行一些語(yǔ)法檢查,比如單引號(hào)有沒(méi)有閉合,根據(jù)sql語(yǔ)句生成一個(gè)數(shù)據(jù)結(jié)構(gòu)叫做解析樹(shù))
? ? ? ? ? ? 4)預(yù)處理器:判斷解析器生成的解析樹(shù)中的表名及字段名是否存在。存在則生成一個(gè)新的解析樹(shù)
? ? ? ? ? ? 5)優(yōu)化器:根據(jù)解析樹(shù)生成不同的執(zhí)行計(jì)劃,然后選擇一條最優(yōu)的執(zhí)行
? ??????????????比如多表聯(lián)合查詢(xún)選擇拿一張表作為基準(zhǔn),有多個(gè)索引時(shí)選擇使用哪個(gè)索引,移除1=1的恒等式等等。優(yōu)化器最終會(huì)把解析樹(shù)變成一個(gè)執(zhí)行計(jì)劃,執(zhí)行計(jì)劃也是一個(gè)數(shù)據(jù)結(jié)構(gòu)。最后選擇的執(zhí)行計(jì)劃不一定是最優(yōu)的執(zhí)行計(jì)劃。我們們?cè)谡Z(yǔ)句執(zhí)行加上explain就可以查詢(xún)到執(zhí)行計(jì)劃的信息。如果想要詳細(xì)的信息,就用format=json。
比如語(yǔ)句為:explain format=json select name from user where user_id = 1
? ? 二、存儲(chǔ)引擎層(存儲(chǔ)引擎可以根據(jù)官方文檔DIY)
? ? ? ? 1、innodb:支持事物,其設(shè)計(jì)主要應(yīng)用于在線事務(wù)處理中。特點(diǎn):行鎖,支持外鍵。默認(rèn)讀取時(shí)不會(huì)產(chǎn)生鎖,5.5版本后是默認(rèn)的存儲(chǔ)引擎
? ? ? ? 2、myisam:不支持事物,支持全文檢索
? ??????????