[InnoDB]-----第1章 MySQL體系結(jié)構(gòu)和存儲(chǔ)引擎

1. 定義數(shù)據(jù)庫和實(shí)例

數(shù)據(jù)庫領(lǐng)域中"數(shù)據(jù)庫"和"實(shí)例"的概念如下:

  • 數(shù)據(jù)庫:物理操作系統(tǒng)文件或其他形式文件類型的集合.
  • 實(shí)例:MySQL數(shù)據(jù)庫有后臺(tái)線程以及一個(gè)共享內(nèi)存區(qū)組成.

? 我們通常意義上講的數(shù)據(jù)庫實(shí)際上是實(shí)例,而數(shù)據(jù)庫在本地磁盤上存儲(chǔ)的數(shù)據(jù)文件才是真正意義上的數(shù)據(jù)庫.

? MySQL數(shù)據(jù)庫實(shí)例在系統(tǒng)上的表現(xiàn)就是一個(gè)進(jìn)程.

? 當(dāng)MySQL數(shù)據(jù)庫實(shí)例啟動(dòng)時(shí),會(huì)現(xiàn)在某些默認(rèn)的位置查找配置文件,可以通過以下指令查詢這些位置.查詢出的位置有多個(gè),MySQL會(huì)以最后一個(gè)位置中的配置為準(zhǔn).

mysql --help | grep my.cnf

? 配置文件中有一個(gè)參數(shù)datadir,指定了數(shù)據(jù)庫所在的路徑,但是這個(gè)路徑只是一個(gè)鏈接,指向了/opt/mysql_data目錄,用戶必須保證該目錄的用戶和權(quán)限只有mysql用戶和組可以訪問.

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

MySQL由以下幾部分構(gòu)成:

  • 連接池組件
  • 管理服務(wù)和工具組件
  • SQL接口組件
  • 查詢分析器組件
  • 優(yōu)化器組件
  • 緩沖(Cache)組件
  • 插件式存儲(chǔ)引擎
  • 物理文件

? MySQL數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的最重要的一個(gè)特點(diǎn)就是其插件式的存儲(chǔ)引擎.MySQL插件式的存儲(chǔ)引擎架構(gòu)提供了一系列標(biāo)準(zhǔn)的管理和服務(wù)支持,這些標(biāo)準(zhǔn)與存儲(chǔ)引擎本身無關(guān),可能是每個(gè)數(shù)據(jù)庫系統(tǒng)本身必須的,而存儲(chǔ)引擎是底層物理結(jié)構(gòu)的實(shí)現(xiàn),可根據(jù)開發(fā)者的意愿進(jìn)行開發(fā).

? 需要特別注意的是,存儲(chǔ)引擎是基于表的,而不是數(shù)據(jù)庫.

3. MySQL存儲(chǔ)引擎

? 存儲(chǔ)引擎的好處是,每個(gè)存儲(chǔ)引擎都有各自的特點(diǎn),更夠genuine具體的應(yīng)用建立不同的存儲(chǔ)引擎表.

? 由于MySQL數(shù)據(jù)庫開源的特性,存儲(chǔ)引擎可以分為MySQL官方存儲(chǔ)引擎和第三方存儲(chǔ)引擎,如InnoDB.

(1). InnoDB存儲(chǔ)引擎

? InnoDB存儲(chǔ)引擎支持事務(wù),其設(shè)計(jì)主要面向聯(lián)機(jī)事務(wù)處理(OLTP)的應(yīng)用.特點(diǎn)是行鎖設(shè)計(jì),支持外鍵,并且支持類似于Oracle的非鎖定讀,也就是默認(rèn)讀取操作不會(huì)產(chǎn)生鎖.

? InnoDB存儲(chǔ)引擎將數(shù)據(jù)放在一個(gè)邏輯的表空間中,像黑盒一樣由InnoDB存儲(chǔ)引擎自身進(jìn)行管理.

? InnoDB通過多版本并發(fā)控制來獲得高并發(fā)性,并且實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的4中隔離級(jí)別,默認(rèn)為REPEATABLE.

SQL的四種隔離級(jí)別:

  1. READ UNCOMMITED(未提交讀):事務(wù)可以讀取未提交的數(shù)據(jù),這也稱為臟讀(Dirty Read)。
  2. READ COMMITED (提交讀):一個(gè)事務(wù)從開始到提交之前,所做的任何修改對(duì)其他事務(wù)都是不可見的。在同一事務(wù)中,多次讀取同一數(shù)據(jù)但是返回不同的結(jié)果,也就是有其他事務(wù)更改了這些數(shù)據(jù)。
  3. REPEATABLE READ (可重復(fù)讀):該級(jí)別保證了在同一個(gè)事務(wù)中多次讀取同樣的記錄的結(jié)果是一致的。無法解決另一個(gè)幻讀 (PhantomRead)的問題。就是說在第一個(gè)事務(wù)開始時(shí),讀取到一批數(shù)據(jù),但是伺候另一個(gè)事務(wù)又插入新數(shù)據(jù)并提交,此時(shí)第一個(gè)事務(wù)又讀取到這批數(shù)據(jù)但是發(fā)現(xiàn)多出了一條,貌似產(chǎn)生幻覺一樣。
  4. SERIALIZABLE(可串行化):它通過強(qiáng)制事務(wù)串行,避免了前面說的幻讀問題。

? 使用一種被稱為next-key locking的策略來避免幻讀現(xiàn)象的產(chǎn)生.初次之外,InnoDB存儲(chǔ)引擎還提供了插入緩存,二次寫,自適應(yīng)哈希索引,預(yù)讀等高性能和高可用的功能.

? InnoDB存儲(chǔ)引擎采用了聚集的方式,因此每張表的存儲(chǔ)都是按主鍵順序進(jìn)行存放.如果沒有顯示的定義主鍵,InnoDB會(huì)給每一行生成一個(gè)6字節(jié)的ROWID,以此為主鍵.

(2). MyISAM存儲(chǔ)引擎

? MyISAM存儲(chǔ)引擎不支持事務(wù),表鎖設(shè)計(jì),支持全文索引,主要面向一些聯(lián)機(jī)分析處理(OLAP)數(shù)據(jù)庫應(yīng)用.

? MyISAM存儲(chǔ)引擎的緩沖池只緩存索引文件,不緩沖數(shù)據(jù)文件.

? MyISAM存儲(chǔ)引擎表有MYD和MYI組成,MYD用來存放數(shù)據(jù)文件,MYI用來存放索引文件.

(3). NDB存儲(chǔ)引擎

? NDB存儲(chǔ)引擎是一個(gè)集群存儲(chǔ)引擎,其結(jié)構(gòu)是share nothing的集群架構(gòu),因此能提供更高的可用性.

? NDB存儲(chǔ)引擎的鏈接操作是在MySQL數(shù)據(jù)庫層完成的,而不是在存儲(chǔ)引擎層完成的,這意味這需要巨大的網(wǎng)絡(luò)開銷,查詢速度慢.

(4). Memory存儲(chǔ)引擎

? Memory存儲(chǔ)引擎將表中的數(shù)據(jù)放在內(nèi)存中,默認(rèn)使用哈希索引.速度較快,但是只支持表鎖,并發(fā)性較差,且存儲(chǔ)變長字段時(shí)是按照定長字段的方式進(jìn)行的,會(huì)浪費(fèi)內(nèi)存.

(5). Archive存儲(chǔ)引擎

? Archive存儲(chǔ)引擎只支持inster和select操作,使用zlib算法將數(shù)據(jù)航進(jìn)行壓縮后存儲(chǔ),非常適合存儲(chǔ)貴方數(shù)據(jù).使用行鎖來實(shí)現(xiàn)高并發(fā)的插入操作,但是本身并不是事務(wù)安全的.

(6). Federated存儲(chǔ)引擎

? Federated存儲(chǔ)引擎表并不存放數(shù)據(jù),指向一臺(tái)遠(yuǎn)程MySQL數(shù)據(jù)庫服務(wù)器上的表.

(7). Maria存儲(chǔ)引擎

? Maria存儲(chǔ)引擎可以被看做是MyISAM的后續(xù)版本.支持緩存數(shù)據(jù)和索引文件,應(yīng)用了行鎖設(shè)計(jì),提供了MVCC功能,支持事務(wù)和非事務(wù)安全的選項(xiàng),以及更好的BLOB字符類型的處理性能.

4. 連接MySQL

? 連接MySQL的操作是一個(gè)鏈接進(jìn)程和MySQL數(shù)據(jù)庫實(shí)例進(jìn)行通信,本質(zhì)上是進(jìn)程間的通信.常用的進(jìn)程通信方式有管道,命名管道,命名字,TCP/IP套接字,UNIX域套接字.

(1). TCP/IP

? TCP/IP套接字方式是MySQL數(shù)據(jù)庫在任何平臺(tái)下都提供的連接方式.這種方式在TCP/IP連接上建立一個(gè)基于網(wǎng)絡(luò)的連接請(qǐng)求,一般情況下客戶端在一臺(tái)服務(wù)器上,MySQL實(shí)例在另外一臺(tái)服務(wù)器上,兩臺(tái)機(jī)器通過一個(gè)TCP/IP網(wǎng)絡(luò)連接.

? 下面這個(gè)命令就可以通過TCP/IP方式進(jìn)行MySQL的遠(yuǎn)端連接:

mysql -h xxx.xxx.xxx.xxx -u username -p password;

? 在通過TCP/IP連接到MySQL實(shí)例時(shí),MySQL會(huì)先檢查一張權(quán)限視圖,也就是mysql.user這張表.只有擁有權(quán)限的用戶+機(jī)器才可以對(duì)數(shù)據(jù)庫進(jìn)行修改.

(2). 命名管道和共享內(nèi)存

? 兩個(gè)需要進(jìn)程通信的進(jìn)程在同一臺(tái)服務(wù)器上,使用命名管道.

? MySQL也提供了共享內(nèi)存的鏈接方式.

(3). UNIX域套接字

? 由于UNIX域套接字不是網(wǎng)絡(luò)協(xié)議,所以只能在MySQL客戶端和數(shù)據(jù)庫實(shí)例在一臺(tái)服務(wù)器上的情況下使用.

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

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

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