【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的
文章目錄
- 1 一條SQL查詢語句是如何執(zhí)行的
- 2 mysql體系結(jié)構(gòu)
- 3 InnoDB存儲引擎
- 4 總結(jié)
1 一條SQL查詢語句是如何執(zhí)行的
? 通常我們使用數(shù)據(jù)庫,都是將數(shù)據(jù)庫看成一個整體,我們的應(yīng)用與數(shù)據(jù)庫完全就是通過SQL語句進行交互。大多數(shù)開發(fā)者很少去了解數(shù)據(jù)庫的內(nèi)部實現(xiàn)原理,這樣也可以完成我們的應(yīng)用。但是如果遇到一些疑難問題,如查詢變慢、死鎖、數(shù)據(jù)庫宕機需要恢復(fù)數(shù)據(jù)時,我們就需要對數(shù)據(jù)庫的實現(xiàn)原理有一定的了解,才能解決這些問題。了解一個東西,先鳥瞰其全貌,再一步步深入到內(nèi)部。
? 想要了解mysql的基礎(chǔ)架構(gòu),從最簡單的SQL查詢語句來分析,當(dāng)了解了mysql是如何執(zhí)行一條SQL查詢語句后,就基本了解了mysql的基礎(chǔ)體系結(jié)構(gòu)。
? 下面是一條最簡單的SQL查詢語句:
select * from T where id = 2;? 對于應(yīng)用開發(fā)者來說,看到的就是輸入一條語句,返回一個結(jié)果。下面是mysql的基本架構(gòu)簡單示意圖,這條語句會經(jīng)過這些過程。
? 大體來說,mysql可以分為server層和存儲引擎層。
- server層包括
連接器:連接器負責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接等。
查詢緩存:建立連接后就應(yīng)該進行數(shù)據(jù)的查詢。在真正進行數(shù)據(jù)查詢之前,mysql會先到緩存查看,之前是否執(zhí)行過這條語句,如果執(zhí)行過,會在緩存中緩存這條查詢對應(yīng)的返回數(shù)據(jù),此時可以直接從緩存中獲取。如果不在緩存中,則繼續(xù)后面的流程。
2.1 大多數(shù)情況下不建議使用查詢緩存的功能,因為查詢緩存弊大于利。查詢緩存失效非常頻繁,只要有對表的更新操作,這個表上所有的查詢緩存就會被清空,因此很有肯能你很費勁地把結(jié)果存起來,還沒使用就被一個更新操作清空了。對于更新壓力大的數(shù)據(jù)庫來說,查詢緩存的命中率非常低。mysql8.0以后直接將查詢緩存的功能刪掉了。
分析器:如果沒有命中緩存,就開始這正的執(zhí)行查詢了。mysql首先會需要對你提交的SQL語句進行校驗與分析,看是否是正確的SQL語句。分析器主要包括詞法分析、語法分析,后面的文章會對其進行詳細的分析。
優(yōu)化器:當(dāng)SQL語句校驗成功,沒有語法錯誤,會進行優(yōu)化器優(yōu)化,優(yōu)化器主要是在表里有多個索引的時候決定使用哪個索引,或者在一個語句有多表關(guān)聯(lián)(jion)的時候,決定各個表的連接順序。
執(zhí)行器:mysql通過分析器知道了要做什么,通過優(yōu)化器知道了要怎么做。于是就進入了執(zhí)行階段,開始執(zhí)行語句。
? 上面就是一條SQL查詢語句的簡單執(zhí)行過程,只是加單的描述了大概的流程,當(dāng)然里面的細節(jié)非常負責(zé),這在后面的文章中會進行一一拆解。
2 mysql體系結(jié)構(gòu)
? 在了解了上面的一條SQL查詢語句的執(zhí)行流程后,我們再來看下,mysql完整的體系結(jié)構(gòu)是什么樣。
? 從以上mysql的體系結(jié)構(gòu)中可以看出,主要有以下幾個部分組成。
- 連接池組件
- 管理服務(wù)和工具組件
- SQL接口組件
- 查詢分析器組件
- 優(yōu)化器組件
- 緩沖組件插件式存儲引擎
- 物理文件
? mysql數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的最重要的一個特點就是其插件式的表存儲引擎。mysq插件式的存儲引擎架構(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ā)者可以按照自己的意愿來進行開發(fā)。
? 需要特別注意的是,存儲引擎是基于表的,而非數(shù)據(jù)庫的。我們最好牢記上面的mysql體系結(jié)構(gòu),對我們后面深入理解mysql數(shù)據(jù)庫有很大的幫助。
3 InnoDB存儲引擎
? 我們已經(jīng)大致了解了mysql數(shù)據(jù)庫獨有的插件式體系結(jié)構(gòu),病了解到存儲引擎是mysql數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的一個最重要的特性。存儲引擎的好處是,每個存儲引擎都有各自的特點,能夠根據(jù)具體的應(yīng)用建立不同的存儲引擎表。我們業(yè)務(wù)應(yīng)用開發(fā)平時所說的事務(wù)、鎖、B+樹索引等,也都是在存儲引擎層實現(xiàn)的。其中InnoDB存儲引擎是目前最常用的一種存儲引擎,所以我們總是圍繞著InnoDB的原理進行講解。
?
? InnoDB存儲引擎支持事務(wù),其設(shè)計的主要目標(biāo)是面向在線事務(wù)處理的應(yīng)用(OLTP),其特點是行鎖設(shè)計、支持外鍵、并通過使用多版本并發(fā)控制支持一致性非鎖定讀。并且實現(xiàn)了SQL的四種隔離級別。默認為RR(REPEATABLE READ)隔離級別,同時使用next-key locking 的策略來避免幻讀(phantom)現(xiàn)象的產(chǎn)生。除此之外,InnoDB存儲引擎還提供了插入緩沖(insert buffer)、二次寫(double write)、自適應(yīng)哈希索引、預(yù)讀(read ahead)等高性能和高可用的功能。
? 對于標(biāo)準(zhǔn)紅數(shù)據(jù)的存儲,InnoDB采用聚集(clustered)的方式,因此每張表的存儲都是按照主鍵的順序進行存放。
4 總結(jié)
? 本文是接下來對mysql數(shù)據(jù)庫拆解,并深入分析的基礎(chǔ),我們主要掌握mysql體系結(jié)構(gòu)的圖,把上面的圖背下來也行,對后面理解索引、鎖、以及mysql優(yōu)化都有莫大的好處。
總結(jié)
以上是生活随笔為你收集整理的【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机如何打开无线网络适配器,win7系
- 下一篇: linux cmake编译源码,linu