一、mysql 的分層邏輯架構(gòu)
1.和其它數(shù)據(jù)庫相比扶歪,MySQL有點與眾不同理肺,它的架構(gòu)可以在多種不同場景中應(yīng)用并發(fā)揮良好作用。主要體現(xiàn)在存儲引擎的架構(gòu)上善镰。
2.插件式的存儲引擎架構(gòu)將查詢處理和其它的系統(tǒng)任務(wù)以及數(shù)據(jù)的存儲提取相分離妹萨。這種架構(gòu)可以根據(jù)業(yè)務(wù)的需求和實際需要選擇合適的存儲引擎。
mysql 四層架構(gòu)
1.連接層:最上層是一些客戶端和連接服務(wù)炫欺,包含本地sock通信和大多數(shù)基于客戶端/服務(wù)端工具實現(xiàn)的類似于tcp/ip的通信乎完。主要完成一些類似于連接處理、授權(quán)認(rèn)證品洛、及相關(guān)的安全方案树姨。在該層上引入了線程池的概念,為通過認(rèn)證安全接入的客戶端提供線程桥状。同樣在該層上可以實現(xiàn)基于SSL的安全鏈接帽揪。服務(wù)器也會為安全接入的每個客戶端驗證它所具有的操作權(quán)限。
2.服務(wù)層:第二層架構(gòu)主要完成大多數(shù)的核心服務(wù)功能辅斟,如SQL接口台丛,并完成緩存的查詢,SQL的分析和優(yōu)化及部分內(nèi)置函數(shù)的執(zhí)行。所有跨存儲引擎的功能也在這一層實現(xiàn)挽霉,如過程防嗡、函數(shù)等。在該層侠坎,服務(wù)器會解析查詢并創(chuàng)建相應(yīng)的內(nèi)部解析樹蚁趁,并對其完成相應(yīng)的優(yōu)化如確定查詢表的順序,是否利用索引等实胸,最后生成相應(yīng)的執(zhí)行操作他嫡。如果是select語句,服務(wù)器還會查詢內(nèi)部的緩存庐完。如果緩存空間足夠大钢属,這樣在解決大量讀操作的環(huán)境中能夠很好的提升系統(tǒng)的性能。
Management Serveices & Utilities | 系統(tǒng)管理和控制工具 |
---|---|
SQL Interface | SQL 接口门躯。 接受用戶的 SQL 命令淆党, 并且返回用戶需要查詢的結(jié)果。 比如 select from 就是調(diào)用 SQL Interface |
Parser | 解析器讶凉。 SQL 命令傳遞到解析器的時候會被解析器驗證和解析 |
Optimizer | 查詢優(yōu)化器染乌。 SQL 語句在查詢之前會使用查詢優(yōu)化器對查詢進(jìn)行優(yōu)化, 比如有 where 條件時懂讯, 優(yōu)化器來決定先投影還是先過濾荷憋。 |
Cache 和 Buffer | 查詢緩存。 如果查詢緩存有命中的查詢結(jié)果褐望, 查詢語句就可以直接去查詢緩存中取 數(shù)據(jù)勒庄。 這個緩存機制是由一系列小緩存組成的。 比如表緩存瘫里, 記錄緩存实蔽, key 緩存, 權(quán)限緩存等 |
3.引擎層:存儲引擎層减宣,存儲引擎真正的負(fù)責(zé)了MySQL中數(shù)據(jù)的存儲和提取盐须,服務(wù)器通過APl與存儲引擎進(jìn)行通信玩荠。不同的存儲引擎具有的功能不同漆腌,這樣我們可以根據(jù)自己的實際需要進(jìn)行選取。后面介紹MyISAM和InnoDB
4.存儲層:數(shù)據(jù)存儲層阶冈,主要是將數(shù)據(jù)存儲在運行于裸設(shè)備的文件系統(tǒng)之上闷尿,并完成與存儲引擎的交互。
二女坑、MySQL 部件
Connectors
指的不同語言中與SQL的交互
Management Serveices & Utilities
系統(tǒng)管理和控制工具
Connection Pool:連接池
管理緩沖用戶連接填具,線程處理等需要緩存的需求。負(fù)責(zé)監(jiān)聽對 MySQL Server 的各種請求,接收連接請求劳景,轉(zhuǎn)發(fā)所有連接請求到線程管理模塊誉简。
每一個連接上 MySQL Server 的客戶端請求都會被分配(或創(chuàng)建)一個連接線程為其單獨服務(wù)。而連接線程的主要工作就是負(fù)責(zé) MySQL Server 與客戶端的通信盟广。接受客戶端的命令請求闷串,傳遞 Server 端的結(jié)果信息等。線程管理模塊則負(fù)責(zé)管理維護(hù)這些連接線程筋量。包括線程的創(chuàng)建烹吵,線程的 cache 等。
SQL Interface:SQL接口
接受用戶的SQL命令桨武,并且返回用戶需要查詢的結(jié)果肋拔。比如select from就是調(diào)用SQL Interface
Parser:解析器
SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現(xiàn)的呀酸,是一個很長的腳本凉蜂。
在 MySQL中我們習(xí)慣將所有 Client 端發(fā)送給 Server 端的命令都稱為 Query,在 MySQL Server 里面七咧,連接線程接收到客戶端的一個 Query 后跃惫,會直接將該 Query 傳遞給專門負(fù)責(zé)將各種 Query 進(jìn)行分類然后轉(zhuǎn)發(fā)給各個對應(yīng)的處理模塊。
解析器的主要功能:
將SQL語句進(jìn)行語義和語法的分析艾栋,分解成數(shù)據(jù)結(jié)構(gòu)爆存,然后按照不同的操作類型進(jìn)行分類,然后做出針對性的轉(zhuǎn)發(fā)到后續(xù)步驟蝗砾,以后SQL語句的傳遞和處理就是基于這個結(jié)構(gòu)的先较。
如果在分解構(gòu)成中遇到錯誤,那么就說明這個sql語句是不合理的
Optimizer:查詢優(yōu)化器
SQL語句在查詢之前會使用查詢優(yōu)化器對查詢進(jìn)行優(yōu)化悼粮。就是優(yōu)化客戶端發(fā)送過來的 sql 語句 闲勺,根據(jù)客戶端請求的 query 語句,和數(shù)據(jù)庫中的一些統(tǒng)計信息扣猫,在一系列算法的基礎(chǔ)上進(jìn)行分析菜循,得出一個最優(yōu)的策略,告訴后面的程序如何取得這個 query 語句的結(jié)果
他使用的是“選取-投影-聯(lián)接”策略進(jìn)行查詢申尤。
用一個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據(jù)where 語句進(jìn)行選取癌幕,而不是先將表全部查詢出來以后再進(jìn)行g(shù)ender過濾,這個select查詢先根據(jù)uid和name進(jìn)行屬性投影昧穿,而不是將屬性全部取出以后勺远,再進(jìn)行過濾將這兩個查詢條件聯(lián)接起來生成最終查詢結(jié)果
Cache和Buffer:查詢緩存
他的主要功能是將客戶端提交給MySQL 的 Select 類 query 請求的返回結(jié)果集 cache 到內(nèi)存中,與該 query 的一個 hash 值 做一個對應(yīng)时鸵。該 Query 所取數(shù)據(jù)的基表發(fā)生任何數(shù)據(jù)的變化之后胶逢, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應(yīng)用系統(tǒng)中, Query Cache 對性能的提高是非常顯著的初坠。當(dāng)然它對內(nèi)存的消耗也是非常大的和簸。
如果查詢緩存有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)碟刺。這個緩存機制是由一系列小緩存組成的比搭。比如表緩存,記錄緩存南誊,key緩存身诺,權(quán)限緩存等
buffer與cache的區(qū)別?
緩存那里實際上有buffer和cache兩個抄囚,那它們之間是否有什么不同呢霉赡?簡單的說就是,buffer是寫緩存幔托,cache是讀緩存穴亏。
存儲引擎接口
存儲引擎接口模塊可以說是 MySQL 數(shù)據(jù)庫中最有特色的一點了。目前各種數(shù)據(jù)庫產(chǎn)品中重挑,基本上只有 MySQL 可以實現(xiàn)其底層數(shù)據(jù)存儲引擎的插件式管理嗓化。這個模塊實際上只是 一個抽象類,但正是因為它成功地將各種數(shù)據(jù)處理高度抽象化谬哀,才成就了今天 MySQL 可插拔存儲引擎的特色刺覆。
從上圖還可以看出,MySQL區(qū)別于其他數(shù)據(jù)庫的最重要的特點就是其插件式的表存儲引擎史煎。MySQL插件式的存儲引擎架構(gòu)提供了一系列標(biāo)準(zhǔn)的管理和服務(wù)支持谦屑,這些標(biāo)準(zhǔn)與存儲引擎本身無關(guān),可能是每個數(shù)據(jù)庫系統(tǒng)本身都必需的篇梭,如SQL分析器和優(yōu)化器等氢橙,而存儲引擎是底層物理結(jié)構(gòu)的實現(xiàn),每個存儲引擎開發(fā)者都可以按照自己的意愿來進(jìn)行開發(fā)恬偷。
注意:存儲引擎是基于表的悍手,而不是數(shù)據(jù)庫。
三袍患、SQL SELECT語句執(zhí)行過程
MySQL 整個查詢執(zhí)行過程坦康,總的來說分為 6 個步驟 :
SQL執(zhí)行步驟:請求、緩存协怒、SQL解析涝焙、優(yōu)化SQL查詢卑笨、調(diào)用引擎執(zhí)行孕暇,返回結(jié)果
1、連接:客戶端向 MySQL 服務(wù)器發(fā)送一條查詢請求,與connectors交互:連接池認(rèn)證相關(guān)處理妖滔。
2隧哮、緩存:服務(wù)器首先檢查查詢緩存,如果命中緩存座舍,則立刻返回存儲在緩存中的結(jié)果沮翔,否則進(jìn)入下一階段
3、解析:服務(wù)器進(jìn)行SQL解析(詞法語法)曲秉、預(yù)處理采蚀。
4、優(yōu)化:再由優(yōu)化器生成對應(yīng)的執(zhí)行計劃承二。
5榆鼠、執(zhí)行:MySQL 根據(jù)執(zhí)行計劃,調(diào)用存儲引擎的 API來執(zhí)行查詢亥鸠。
6妆够、結(jié)果:將結(jié)果返回給客戶端,同時緩存查詢結(jié)果负蚊。
mysql 的查詢流程大致是:
1.首先mysql 客戶端通過協(xié)議與 mysql 服務(wù)器建連接神妹, 發(fā)送查詢語句, 先檢查查詢緩存家妆, 如果命中鸵荠, 直接返回結(jié)果,否則進(jìn)行語句解析,也就是說伤极, 在解析查詢之前腰鬼, 服務(wù)器會先訪問查詢緩存(query cache)——它存儲 SELECT 語句以及相應(yīng)的查詢結(jié)果集。 如果某個查詢結(jié)果已經(jīng)位于緩存中塑荒, 服務(wù)器就不會再對查詢進(jìn)行解析熄赡、 優(yōu)化、 以及執(zhí)行齿税。 它僅僅將緩存中的結(jié)果返回給用戶即可彼硫, 這將大大提高系統(tǒng)的性能。
2.語法解析器和預(yù)處理: 首先 mysql 通過關(guān)鍵字將 SQL 語句進(jìn)行解析凌箕, 并生成一顆對應(yīng)的“解析樹”拧篮。 mysql 解析器將使用 mysql 語法規(guī)則驗證和解析查詢; 預(yù)處理器則根據(jù)一些 mysql 規(guī)則進(jìn)一步檢查解析數(shù)是否合法牵舱。
3.查詢優(yōu)化器當(dāng)解析樹被認(rèn)為是合法的了串绩, 并且由優(yōu)化器將其轉(zhuǎn)化成執(zhí)行計劃。 一條查詢可以有很多種執(zhí)行方式芜壁,最后都返回相同的結(jié)果礁凡。 優(yōu)化器的作用就是找到這其中最好的執(zhí)行計劃高氮。
SQL 語句的執(zhí)行順序
四、MySQL 存儲引擎
查看 mysql 存儲引擎
-
查看 mysql 支持的存儲引擎
show engines;
查看 mysql 支持的存儲引擎 -
查看 mysql 默認(rèn)的存儲引擎
show variables like '%storage_engine%';
查看 mysql 默認(rèn)的存儲引擎