MySQL 原理(1)之整體架構(gòu)

一剖效、開篇

本系列文章主要目的是為了個(gè)人學(xué)習(xí)總結(jié)嫉入。如果你正在學(xué)習(xí),也歡迎閱讀交流璧尸,指正不足咒林。

本系列文章將介紹 MySQL 相關(guān)原理,將從 MySQL 的架構(gòu)爷光、日志垫竞、索引、鎖蛀序、事務(wù)欢瞪、高可用,以及客戶端技術(shù)徐裸,如 JDBC 等方面進(jìn)行介紹遣鼓。本文是系列文章第一篇,將介紹 MySQL 的架構(gòu)重贺。

MySQL 原理思維導(dǎo)圖

二骑祟、MySQL 整體架構(gòu)

MySQL 的架構(gòu)大致分為 Server 層和存儲(chǔ)引擎層。Server 層包含了連接器气笙、分析器次企、優(yōu)化器、執(zhí)行器等幾部分潜圃,提供了所有跨存儲(chǔ)引擎的功能缸棵。而存儲(chǔ)引擎則負(fù)責(zé)實(shí)際的數(shù)據(jù)存儲(chǔ)和查詢功能。MySQL 存儲(chǔ)引擎層是插件化設(shè)計(jì)谭期,早期版本 MySQL 使用 MyISAM 作為默認(rèn)存儲(chǔ)引擎堵第,從 5.5.5 版本開始,使用支持事務(wù)的 InnoDB 作為存儲(chǔ)引擎崇堵。另外比較常用的存儲(chǔ)引擎還有 Toku型诚,用于提供高數(shù)據(jù)壓縮比的場(chǎng)景,如數(shù)據(jù)歸檔鸳劳。

MySQL 整體架構(gòu)

圖片來(lái)源:MySQL 實(shí)戰(zhàn)45講

三狰贯、MySQL 各組件功能

3.1 連接器

連接器負(fù)責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接涵紊。連接命令一般是這么寫的:

mysql -h$ip -P$port -u$user -p

輸完命令之后傍妒,你就需要在交互對(duì)話里面輸入密碼。

除了直接使用 mysql 客戶端工具以外摸柄,應(yīng)用服務(wù)嘗試用相應(yīng)語(yǔ)言的客戶端工具颤练,如 Java 的 JDBC。當(dāng)使用 JDBC 時(shí)驱负,連接 URL 示例如下:

jdbc:mysql://[host:port]/[database][?參數(shù)名1][=參數(shù)值1][&參數(shù)名2][=參數(shù)值2]...

這里列出一些重要的 JDBC 連接 MySQL 時(shí)的參數(shù)嗦玖,以及建議的設(shè)置:

  1. useUnicode 建議設(shè)置為 true。
  2. characterEncoding 建議設(shè)置為 utf8(另外數(shù)據(jù)庫(kù)默認(rèn)字符最好配置為 utf8mb4)跃脊。
  3. autoReconnect 是否自動(dòng)連接宇挫。建議設(shè)置為 true,避免因緩存等原因?qū)е麻L(zhǎng)時(shí)間未使用連接而導(dǎo)致需要重連酪术。
  4. failOverReadOnly 重連后連接是否設(shè)置為只讀器瘪。建議設(shè)置為 false。

在完成經(jīng)典的 TCP 握手后绘雁,連接器就要開始認(rèn)證你的身份橡疼,這個(gè)時(shí)候用的就是你輸入的用戶名和密碼。

  • 如果用戶名或密碼不對(duì)庐舟,你就會(huì)收到一個(gè) "Access denied for user" 的錯(cuò)誤欣除,然后客戶端程序結(jié)束執(zhí)行。
  • 如果用戶名密碼認(rèn)證通過(guò)继阻,連接器會(huì)到權(quán)限表里面查出你擁有的權(quán)限耻涛。之后,這個(gè)連接里面的權(quán)限判斷邏輯瘟檩,都將依賴于此時(shí)讀到的權(quán)限抹缕。

這就意味著,一個(gè)用戶成功建立連接后墨辛,即使你用管理員賬號(hào)對(duì)這個(gè)用戶的權(quán)限做了修改卓研,也不會(huì)影響已經(jīng)存在連接的權(quán)限。修改完成后睹簇,只有再新建的連接才會(huì)使用新的權(quán)限設(shè)置奏赘。

客戶端如果太長(zhǎng)時(shí)間沒(méi)動(dòng)靜,連接器就會(huì)自動(dòng)將它斷開太惠。這個(gè)時(shí)間是由 MySQL 的 wait_timeout 參數(shù)控制的磨淌,默認(rèn)值是8小時(shí)。因此凿渊,對(duì)于一些批處理的應(yīng)用梁只,需要注意避免應(yīng)用長(zhǎng)時(shí)間沒(méi)有動(dòng)作導(dǎo)致連接斷開缚柳。當(dāng)使用 Java 開發(fā)應(yīng)用時(shí),一些數(shù)據(jù)庫(kù)連接池框架也有超時(shí)配置搪锣,如 HikariCP 的 idleTimeout 參數(shù)秋忙,此參數(shù)需要配置的小于 MySQL 的 wait_timeout 參數(shù)。

如果在連接被斷開之后构舟,客戶端再次發(fā)送請(qǐng)求的話灰追,就會(huì)收到一個(gè)錯(cuò)誤提醒:Lost connection to MySQL server during query。這時(shí)候如果你要繼續(xù)狗超,就需要重連弹澎,然后再執(zhí)行請(qǐng)求了。

數(shù)據(jù)庫(kù)里面抡谐,長(zhǎng)連接是指連接成功后裁奇,如果客戶端持續(xù)有請(qǐng)求桐猬,則一直使用同一個(gè)連接麦撵。短連接則是指每次執(zhí)行完很少的幾次查詢就斷開連接,下次查詢?cè)僦匦陆⒁粋€(gè)溃肪。

建立連接的過(guò)程通常是比較復(fù)雜的免胃,所以建議在使用中要盡量減少建立連接的動(dòng)作,也就是盡量使用長(zhǎng)連接惫撰。Java 有很多連接池可以使用羔沙,如 HikariCP、阿里的 Druid厨钻。

3.2 分析器

分析器的作用是解析 SQL 語(yǔ)句扼雏、驗(yàn)證語(yǔ)法、找出語(yǔ)句中各元素含義夯膀,最終生成 SQL 語(yǔ)法樹诗充。簡(jiǎn)單來(lái)說(shuō),分析器的作用就是讓 MySQL 知道做什么诱建?

3.3 優(yōu)化器

優(yōu)化器的作用是制定最高效的 SQL 執(zhí)行方案蝴蜓,比如當(dāng)涉及多個(gè)索引時(shí),要使用哪些索引俺猿、join 查詢時(shí)各表關(guān)聯(lián)順序茎匠。簡(jiǎn)單來(lái)說(shuō),優(yōu)化器的作用就是讓 MySQL 知道如何做押袍?

3.4 執(zhí)行器

MySQL 在知道做什么以及如何做之后诵冒,就需要正式執(zhí)行 SQL 語(yǔ)句了,這就是執(zhí)行器的功能谊惭。

執(zhí)行器首先會(huì)檢查權(quán)限汽馋。在權(quán)限檢查通過(guò)后否过,執(zhí)行器就會(huì)根據(jù)表定義的存儲(chǔ)引擎,調(diào)用相應(yīng)接口惭蟋,進(jìn)行 SQL 語(yǔ)句實(shí)際執(zhí)行苗桂。對(duì)于查詢操作 select * from T where ID=10,如果 ID 不是索引列告组,流程大致如下:

  1. 調(diào)用 InnoDB 引擎接口取這個(gè)表的第一行煤伟,判斷 ID 值是不是10,如果不是則跳過(guò)木缝,如果是則將這行存在結(jié)果集中便锨;
  2. 調(diào)用引擎接口取“下一行”,重復(fù)相同的判斷邏輯我碟,直到取到這個(gè)表的最后一行放案。
  3. 執(zhí)行器將上述遍歷過(guò)程中所有滿足條件的行組成的記錄集作為結(jié)果集返回給客戶端。

對(duì)于 ID 是索引時(shí)的查詢流程矫俺,將在后續(xù)介紹索引的文章中介紹吱殉。

對(duì)于更新操作,查找數(shù)據(jù)過(guò)程與 select 語(yǔ)句一樣厘托,但更新操作涉及到 MySQL 的多種日志結(jié)構(gòu)友雳,將在后續(xù)介紹日志的文章中詳細(xì)介紹。

3.5 存儲(chǔ)引擎

存儲(chǔ)引擎的作用是向 Server 的執(zhí)行器提供接口铅匹,滿足相應(yīng)查詢押赊、存儲(chǔ)功能。本系列主要介紹 InnoDB 引擎包斑,具體原理將分散在日志流礁、索引、鎖罗丰、事務(wù)等篇章內(nèi)神帅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丸卷,隨后出現(xiàn)的幾起案子枕稀,更是在濱河造成了極大的恐慌,老刑警劉巖谜嫉,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萎坷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沐兰,警方通過(guò)查閱死者的電腦和手機(jī)哆档,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)住闯,“玉大人瓜浸,你說(shuō)我怎么就攤上這事澳淑。” “怎么了插佛?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵杠巡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雇寇,道長(zhǎng)氢拥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任锨侯,我火速辦了婚禮嫩海,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囚痴。我一直安慰自己叁怪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布深滚。 她就那樣靜靜地躺著奕谭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪成箫。 梳的紋絲不亂的頭發(fā)上展箱,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音蹬昌,去河邊找鬼。 笑死攀隔,一個(gè)胖子當(dāng)著我的面吹牛皂贩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昆汹,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼明刷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了满粗?” 一聲冷哼從身側(cè)響起辈末,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎映皆,沒(méi)想到半個(gè)月后挤聘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捅彻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年组去,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步淹。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡从隆,死狀恐怖诚撵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情键闺,我是刑警寧澤寿烟,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站辛燥,受9級(jí)特大地震影響韧衣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜购桑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一畅铭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勃蜘,春花似錦硕噩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阳惹,卻和暖如春谍失,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莹汤。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工快鱼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纲岭。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓抹竹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親止潮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窃判,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345