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í)別:
- READ UNCOMMITED(未提交讀):事務(wù)可以讀取未提交的數(shù)據(jù),這也稱為臟讀(Dirty Read)。
- READ COMMITED (提交讀):一個(gè)事務(wù)從開始到提交之前,所做的任何修改對(duì)其他事務(wù)都是不可見的。在同一事務(wù)中,多次讀取同一數(shù)據(jù)但是返回不同的結(jié)果,也就是有其他事務(wù)更改了這些數(shù)據(jù)。
- 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)生幻覺一樣。
- 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ù)器上的情況下使用.