【Mysql技術內幕筆記--1】--Mysql體系結構和儲存引擎

船頭尺發表於2021-09-09

前言

首先Mysql是一個可移植的資料庫,幾乎在當前所有系統上都能執行,比如Mac/Linux/Windowns。儘管各個平臺在底層實現方面各有不同,但是Mysql基本上能保證各個平臺上的物理體系結構的一致性

1. Mysql的體系結構

1.1 Mysql的資料庫與資料庫例項

資料庫(也就是常說的database)和資料庫例項(instance這個說的比較少,但是用的多)之間的區別如下:

  • 資料庫:物理作業系統檔案或者其它形式檔案的集合,Mysql中的資料庫檔案有好幾種,比如frm、MYD、MYI等等結尾的,當然也可能根據儲存引擎的不同檔案存放位置有可能在記憶體中。

  • 例項:Mysql資料庫由後臺執行緒及一個共享記憶體區組成。共享記憶體可以被執行的後臺執行緒共享,資料庫例項才是真正用於運算元據庫檔案的。

二者的名字可能在平時經常弄錯,但是它們的職責卻是完全不同的,在Mysql資料庫中,例項與資料庫的關係一般是一一對應的,也就是一個例項對應一個資料庫,但是在叢集情況下,一個資料庫可能被多個資料庫例項使用。Msyql是一個單程式多執行緒架構的資料庫,Mysql資料庫例項從系統的角度來看就是一個程式。從概念上來說,資料庫是檔案的集合,是依照某種資料模型組織起來並存放於二級儲存器的資料集合。資料庫例項是程式,是位於使用者與作業系統之間的一層資料管理軟體,使用者對資料庫的任何操作包括資料庫定義、查詢、維護都是在資料庫例項下進行的。應用程式只有透過資料庫例項才能和資料庫打交道。

1.2 Mysql的啟動過程

當啟動例項時,Mysql會去讀取配置檔案,根據配置檔案的引數來啟動資料庫例項。在mysql資料庫中,啟動例項的時候按照/etc/my.cinf --> /etc/mysql/my.cnf-->/usr/local/mysql/etc/my.cnf --> ~/.my.cnf這個順序來載入配置檔案的,並且後來者的配置會覆蓋掉前面的配置,之所以這麼搞是因為在不同的平臺下這個配置檔案的預設位置是不一樣的。關於配置檔案的內容,暫時只關注datadir這個引數,從名字就能看出來,這個引數制定了資料庫所在的路徑,這個路徑可以修改的,在Linux下預設是/usr/local/mysql/data,要注意的是這個路經只是一個連結,指向了/opt/mysql_data這個目錄,所以使用者必須保證有這個目錄的讀寫許可權才能訪問。

1.3 Mysql體系結構

話不多說,先上個官方給的圖:


圖片描述

中文版架構圖.jpg

圖片描述

Mysql資料庫的體系結構.png

從圖裡可以知道,Mysql由以下幾個部分組成的:

  • Connectors連線池元件,不同語言與SQL進行互動的元件,比如Java使用JDBC與SQL進行互動

  • Management Serveices & Utilities:系統管理和控制工具,用來管理服務和工具元件

  • SQL Interface:這東西見名知意了,SQL介面元件,接收使用者的SQL命令,並且返回使用者需要查詢的結果,比如select * from就是呼叫SQL Interface介面的

  • Parser解析器,SQL命令傳遞到解析器的時候會被解析器解析和驗證。解析器是由Lex 和 YACC實現的,是一個很長的指令碼。主要功能是將SQL語句分解成資料結構,並將這個結構傳遞到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的,如果再分解過程中遇到錯誤那麼久說明這個SQL語句是不合理的。

  • Optimizer查詢最佳化器:SQL語句在查詢之前會使用查詢最佳化器對查詢進行最佳化,這個過程使用"選取->投影->聯接"策略進行查詢。比如select name from user where id = 1這個select查詢先根據where語句進行選取,而不是先把表全部查詢出來以後再過濾.這個select會先根據name屬性進行投影而不是將屬性全部查出來過濾,將這2個查詢條件聯接起來最終生成查詢結果。

  • Cache & Buffer:查詢快取 :,如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料,這個快取機制由很多快取組成的,比如表快取、記錄快取、key快取、許可權快取等等

  • Engine:儲存引擎,它是Mysql中具體與檔案打交道的子系統也是Mysql最具特色的一部分,儲存引擎是外掛式的,它根據Mysql公司提供的檔案訪問層的一個抽象介面來定製一種檔案訪問機制(這種訪問機制其實就叫儲存引擎),現在有很多儲存引擎,各具有各自的特性,比如InnoDB MyISAM等等。需要注意的是,儲存引擎是基於表的而不是基於資料庫的,我們建立表的時候有時候會顯示指定這個表所使用的儲存引擎。

  • File system和Files Logs:這部分是資料庫的層面,有許多格式的檔案儲存在硬碟上,又分為資料庫檔案和資料庫的日誌檔案

1.4 Mysql的儲存引擎

Mysql的外掛式的儲存引擎結構可以說是Mysql很大的一個特性,好處是每個儲存儲存引擎都有各自的特點,能夠根據具體的應用建立不同儲存引擎表。又因為Mysql是開源的,所以有能力需求的公司可以根據自己的需要進行編寫自己定義的引擎,比如大名鼎鼎的InnoDB最開始就是第三方公司寫的,後來被官方收購了。簡單說下2種常見的儲存引擎:

  • InnoDB儲存引擎將資料放在一個邏輯的表空間中,這個表空間就像一個黑盒一樣由InnoDB儲存引擎自身進行管理。它透過多版本併發控制MVCC來獲得高併發性,並且實現了SQL標準的四種隔離級別,除此之外還提供了插入緩衝、二次寫、自適應雜湊索引、預讀等高效能和高可用的功能。對於表中資料的儲存,InnoDB採用了聚集的方式,因此每張表的儲存都是按照主鍵的順序進行存放的。如果沒有顯示定義指定主鍵,InnoDB儲存引擎會為每一行生成一個6位元組的ROWID,以此為主鍵,具備高可用、高效能、高擴充套件性。

  • MyISAM:它的名氣和InnoDB一樣大,在5.6之前它作為官方預設的儲存引擎使用的。MyISAM儲存引擎表由MYD/MYI組成的,MYD用來存放資料檔案,MYI用來存放索引檔案,對於MyISAM儲存引擎表,mysql資料庫只快取其索引檔案,資料檔案的快取交由作業系統本身來完成,這與其它使用LRU演算法快取資料的大怒分資料庫不相同的。

每種儲存引擎的實現都不相同的,可以透過SHOW ENGINES檢視當前的mysql版本所支援的儲存引擎。

1.5 Mysql的連線
1.5.1 TCP/IP方式

連線Mysql操作是一個連線程式和Mysql資料庫例項進行通訊,從程式設計的角度來說,本質上是程式通訊。TCP/IP套接字方式是Mysql在任何平臺下都提供的連線方式,也是網路中使用的最多的一種方式。這種方式在TCP/IP連線上建立一個基於網路的連線請求,一般情況下客戶端在一臺伺服器上,而Mysql例項(server)在另一臺伺服器上,他們透過TCP/IP網路連線。在透過TCP/IP連線到MYSQL例項時,Mysql資料庫會先檢查一張許可權檢視,用來判斷髮起請求的客戶端IP是否允許連線到Mysql例項,該檢視在Mysql架構下,表名為user。這個表控制了某主機連線mysql的許可權。

1.5.2 UNIX套接字

在Linux和UNIX環境下,還可以使用UNIX套接字連線,而UNIX套接字不是網路協議,所以就要求資料庫例項和客戶端在同一臺伺服器上,也就是本機安裝的時候在配置檔案中指定套接字檔案的路徑,--socket=/tmp/mysql.sock。在知道了它的路徑之後,就可以使用套接字進行連線,mysql -udavid -S /tmp/mysql.sock

小結

  • 資料庫例項和資料庫是不一樣的,資料庫通常指的是各種儲存的二進位制檔案的集合,資料庫例項是一個程式專門用來和資料庫進行操作的程式

  • 資料庫的引擎是外掛式的,現在有很多引擎,他們各有各的特性並且使用者可以根據自己的需求利用Mysql的介面自己擴充套件功能的引擎。

  • Mysql伺服器的結構並沒有想象中的太複雜,自上而下各個元件各有各自的功能,都是為了讓MYSQL更好的執行的。

  • 儲存引擎是和表關聯的,不是和資料庫關聯的,在建立表的時候可以執行儲存引擎,如果沒指定5.5以上預設InnoDB



作者:忐忑忑忑忐忑
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3016/viewspace-2821136/,如需轉載,請註明出處,否則將追究法律責任。

相關文章