MySQL 體系架構(gòu) (一)

1.MySQL體系結(jié)構(gòu)

由圖,可以看出MySQL最上層是連接組件。下面服務(wù)器是由連接池、管理工具和服務(wù)、SQL接口、解析器、優(yōu)化器、緩存、存儲(chǔ)引擎、文件系統(tǒng)組成。

連接池:由于每次建立建立需要消耗很多時(shí)間,連接池的作用就是將這些連接緩存下來,下次可以直接用已經(jīng)建立好的連接,提升服務(wù)器性能。

管理工具和服務(wù):系統(tǒng)管理和控制工具,例如備份恢復(fù)、Mysql復(fù)制、集群等

SQL接口:接受用戶的SQL命令,并且返回用戶需要查詢的結(jié)果。比如select from就是調(diào)用SQL Interface

解析器:?SQL命令傳遞到解析器的時(shí)候會(huì)被解析器驗(yàn)證和解析。解析器是由Lex和YACC實(shí)現(xiàn)的,是一個(gè)很長的腳本, 主要功能:

a . 將SQL語句分解成數(shù)據(jù)結(jié)構(gòu),并將這個(gè)結(jié)構(gòu)傳遞到后續(xù)步驟,以后SQL語句的傳遞和處理就是基于這個(gè)結(jié)構(gòu)的

b. 如果在分解構(gòu)成中遇到錯(cuò)誤,那么就說明這個(gè)sql語句是不合理的

優(yōu)化器:查詢優(yōu)化器,SQL語句在查詢之前會(huì)使用查詢優(yōu)化器對(duì)查詢進(jìn)行優(yōu)化。他使用的是“選取-投影-聯(lián)接”策略進(jìn)行查詢。

用一個(gè)例子就可以理解: select uid,name from user where gender = 1;

這個(gè)select 查詢先根據(jù)where 語句進(jìn)行選取,而不是先將表全部查詢出來以后再進(jìn)行g(shù)ender過濾

這個(gè)select查詢先根據(jù)uid和name進(jìn)行屬性投影,而不是將屬性全部取出以后再進(jìn)行過濾

將這兩個(gè)查詢條件聯(lián)接起來生成最終查詢結(jié)果

緩存器:?查詢緩存,如果查詢緩存有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)。

通過LRU算法將數(shù)據(jù)的冷端溢出,未來得及時(shí)刷新到磁盤的數(shù)據(jù)頁,叫臟頁。

這個(gè)緩存機(jī)制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權(quán)限緩存等

2.MySQL內(nèi)存結(jié)構(gòu)

MySQL中內(nèi)存大致分為:全局內(nèi)存(Global buffer)、線程內(nèi)存(Thread buffer)?兩大部分。

全局內(nèi)存:緩沖池里面有數(shù)據(jù)緩存、索引緩存、鎖信息、插入緩存等等。此外還有重做日志緩存、額外的內(nèi)存池。

線程內(nèi)存:Master Thread、IO Thread、Purage Thread、Page Cleaner Thread。

CheckPoint技術(shù):緩沖池的設(shè)計(jì)目的為了協(xié)調(diào)CPU速度與磁盤速度的鴻溝。因此跟新或者刪除的時(shí)候直接操作的是內(nèi)存的數(shù)據(jù),先寫入重做日志,然后再修改內(nèi)存池里面的數(shù)據(jù),最后定時(shí)刷新到磁盤上。

3、MySQL文件結(jié)構(gòu)

(1) 參數(shù)文件:啟動(dòng)MySQL實(shí)例的時(shí)候,指定一些初始化參數(shù),比如:緩沖池大小、數(shù)據(jù)庫文件路徑、用戶名密碼等。

(2) 日志文件:比如:錯(cuò)誤日志、二進(jìn)制日志、慢查詢?nèi)罩?、查詢?nèi)罩镜鹊取?/p>

通過show variables like "error_log"來查看錯(cuò)誤日志存放內(nèi)容。

通過show variables like "long_query_time"來查看慢查詢?nèi)罩居涗浀拈撝?。默認(rèn)的慢查詢?nèi)罩镜拈y值是10秒,也就是查詢時(shí)長超過10秒就會(huì)記錄到慢查詢?nèi)罩疚募?/p>

(3) socket文件:當(dāng)用UNIX域套接字方式進(jìn)行連接的時(shí)候需要的文件。

(4) pid文件:MySQL實(shí)例的進(jìn)程ID文件。

(5) 表結(jié)構(gòu)文件:用來存放MySQL表結(jié)構(gòu)定義文件。

.frm后綴命名的文件都是表結(jié)構(gòu)文件,和存儲(chǔ)引擎類型無關(guān)。所有的表都會(huì)生成一個(gè).frm文件;

(6) 存儲(chǔ)引擎文件:存儲(chǔ)引擎正在存儲(chǔ)了記錄和索引等數(shù)據(jù)。

(1)共享表空間:共享表空間文件以.ibdata*來命名; 共享表空間下,innodb所有數(shù)據(jù)保存在一個(gè)單獨(dú)的表空間里面,而這個(gè)表空間可以由很多個(gè)文件組成,一個(gè)表可以跨多個(gè)文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當(dāng)然這個(gè)大小是包括這個(gè)表的所有索引等其他相關(guān)數(shù)據(jù)。

共享表空間主要存放double write、undo log(undo log沒有獨(dú)立的表空間,需要存放在共享表空間)

(2)獨(dú)立表空間:每個(gè)表擁有自己獨(dú)立的表空間用來存儲(chǔ)數(shù)據(jù)和索引。

(3)查看數(shù)據(jù)庫是否啟用獨(dú)立表空間:

show variables like ‘innodb_file_per_table’;查看,innodb_file_per_table=ON,表示啟用了獨(dú)立表空間;

(4)使用獨(dú)立表空間的優(yōu)點(diǎn):

如果使用軟鏈接將大表分配到不同的分區(qū)上,易于管理數(shù)據(jù)文件

易于監(jiān)控解決IO資源使用的問題;

易于修復(fù)和恢復(fù)損壞的數(shù)據(jù);

相互獨(dú)立的,不會(huì)影響其他innodb表;

導(dǎo)出導(dǎo)入只針對(duì)單個(gè)表,而不是整個(gè)共享表空間;

解決單個(gè)文件大小的限制;

對(duì)于大量的delete操作,更易于回收磁盤空間;

碎片較少,易于整理optimize table;

易于安全審計(jì);

易于備份

如果在innodb表已創(chuàng)建后設(shè)置innodb_file_per_table,那么數(shù)據(jù)將不會(huì)遷移到單獨(dú)的表空間上,而是續(xù)集使用之前的共享表空間。只有新創(chuàng)建的表才會(huì)分離到自己的表空間文件。

(5)共享表空間的數(shù)據(jù)文件配置:

innodb_data_file_path參數(shù):設(shè)置innoDB共享表空間數(shù)據(jù)文件的名字和大小,例如innodb_data_file_path=ibdata1:12M:autoextend(初始大小12M,不足自增)

innodb_data_home_dir參數(shù):innodb引擎的共享表空間數(shù)據(jù)文件的存放目錄

目前主要是使用獨(dú)立表空間,但是共享表空間也是需要的,共享表空間主要存放double write、undo log等

4、InnoDB表存儲(chǔ)結(jié)構(gòu)

(1)每頁=16Kb(頁類型:數(shù)據(jù)頁、undo頁、系統(tǒng)頁、事務(wù)數(shù)據(jù)頁、插入緩沖位圖頁、插入緩沖空閑列表頁、未壓縮的二進(jìn)制大對(duì)象頁、壓縮的二進(jìn)制大對(duì)象頁)

(2)區(qū)=64個(gè)連續(xù)的頁=64*16Kb=1MB

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一. MySQL體系結(jié)構(gòu) 1、Connectors指的是不同語言中與SQL的交互 2、Management Ser...
    PennLi閱讀 819評(píng)論 0 2
  • 學(xué)習(xí) MySQL 的整體架構(gòu)之前,我們先了解一下如何設(shè)計(jì)一個(gè)關(guān)系型數(shù)據(jù);我們設(shè)計(jì)數(shù)據(jù)庫的時(shí)候,主要需要考慮兩個(gè)核心...
    lframe閱讀 914評(píng)論 0 0
  • 基礎(chǔ)概念 數(shù)據(jù)庫實(shí)例是由數(shù)據(jù)庫后臺(tái)進(jìn)程/線程以及一個(gè)共享內(nèi)存區(qū)組成。共享內(nèi)存可以被運(yùn)行的后臺(tái)進(jìn)程/線程所共享。需要...
    LANSHENGYANG閱讀 116評(píng)論 0 0
  • 基礎(chǔ)概念 數(shù)據(jù)庫實(shí)例是由數(shù)據(jù)庫后臺(tái)進(jìn)程/線程以及一個(gè)共享內(nèi)存區(qū)組成。共享內(nèi)存可以被運(yùn)行的后臺(tái)進(jìn)程/線程所共享。需要...
    GrooveWind閱讀 2,400評(píng)論 0 1
  • 2. mysql 體系架構(gòu) 連接方式TCP/IPSocket mysqld程序結(jié)構(gòu)mysqld程序結(jié)構(gòu)mysql程...
    田村君閱讀 212評(píng)論 0 0

友情鏈接更多精彩內(nèi)容