【Mysql技術內幕筆記--1】--Mysql體系結構和儲存引擎
前言
首先
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [Mysql技術內幕]Innodb儲存引擎MySql儲存引擎
- MySQL InnoDB儲存引擎體系結構MySql儲存引擎
- MySQL體系結構與儲存引擎MySql儲存引擎
- 第一章 MySQL體系結構和儲存引擎MySql儲存引擎
- openGauss儲存技術(二)——列儲存引擎和記憶體引擎儲存引擎記憶體
- MySQL提升筆記(4)InnoDB儲存結構MySql筆記
- mysql學習6:第三章MYSQL 體系結構與儲存引擎MySql儲存引擎
- MySQL索引及優化(1)儲存引擎和底層資料結構MySql索引優化儲存引擎資料結構
- 高階程式設計師——MySQL技術內幕 InnoDB儲存引擎(4):索引與演算法程式設計師MySql儲存引擎索引演算法
- MySQL儲存引擎MySql儲存引擎
- MySQL 儲存引擎MySql儲存引擎
- Sqlserver儲存引擎體系結構簡介_Part1SQLServer儲存引擎
- TiDB 技術內幕 - 說儲存TiDB
- MySQL的varchar儲存原理:InnoDB記錄儲存結構MySql
- MySQL 讀書筆記 (一) 體系結構MySql筆記
- MySQL InnoDB儲存引擎MySql儲存引擎
- MySQL系列-儲存引擎MySql儲存引擎
- mysql dba系統學習(20)mysql儲存引擎MyISAMMySql儲存引擎
- 《MySQL 基礎篇》十:邏輯架構和儲存引擎MySql架構儲存引擎
- MySQL-05.儲存引擎MySql儲存引擎
- MySQL入門--儲存引擎MySql儲存引擎
- 理解mysql的儲存引擎MySql儲存引擎
- MySQL之四 儲存引擎MySql儲存引擎
- MySQL兩種儲存引擎: MyISAM和InnoDB 簡單總結MySql儲存引擎
- 《MySQL 基礎篇》十二:InnoDB 儲存引擎的資料結構MySql儲存引擎資料結構
- MySQL的物理儲存結構和session過程MySqlSession
- Mysql技術內幕之InnoDB鎖探究MySql
- MySQL儲存引擎:MyISAM和InnoDB的區別MySql儲存引擎
- MySQL高階10-InnoDB引擎儲存架構MySql架構
- 【MySQL】MySQL(四)儲存引擎、索引、鎖、叢集MySql儲存引擎索引
- MySQL federated儲存引擎測試MySql儲存引擎
- 2_mysql(索引、儲存引擎)MySql索引儲存引擎
- MySQL InnoDB 儲存引擎探祕MySql儲存引擎
- 總結MySQL儲存引擎MyISAM與InnoDB區別MySql儲存引擎
- openGauss儲存技術(一)——行儲存引擎儲存引擎
- MySQL 體系結構MySql
- MYSQL排錯指南學習筆記(一)排查及儲存引擎修復MySql筆記儲存引擎
- MySQL技術內幕之“日誌檔案”MySql