1. 定義數(shù)據(jù)庫和實例
數(shù)據(jù)庫領(lǐng)域中"數(shù)據(jù)庫"和"實例"的概念如下:
- 數(shù)據(jù)庫:物理操作系統(tǒng)文件或其他形式文件類型的集合.
- 實例:MySQL數(shù)據(jù)庫有后臺線程以及一個共享內(nèi)存區(qū)組成.
? 我們通常意義上講的數(shù)據(jù)庫實際上是實例,而數(shù)據(jù)庫在本地磁盤上存儲的數(shù)據(jù)文件才是真正意義上的數(shù)據(jù)庫.
? MySQL數(shù)據(jù)庫實例在系統(tǒng)上的表現(xiàn)就是一個進程.
? 當(dāng)MySQL數(shù)據(jù)庫實例啟動時,會現(xiàn)在某些默認(rèn)的位置查找配置文件,可以通過以下指令查詢這些位置.查詢出的位置有多個,MySQL會以最后一個位置中的配置為準(zhǔn).
mysql --help | grep my.cnf
? 配置文件中有一個參數(shù)datadir,指定了數(shù)據(jù)庫所在的路徑,但是這個路徑只是一個鏈接,指向了/opt/mysql_data目錄,用戶必須保證該目錄的用戶和權(quán)限只有mysql用戶和組可以訪問.
2. MySQL體系結(jié)構(gòu)
MySQL由以下幾部分構(gòu)成:
- 連接池組件
- 管理服務(wù)和工具組件
- SQL接口組件
- 查詢分析器組件
- 優(yōu)化器組件
- 緩沖(Cache)組件
- 插件式存儲引擎
- 物理文件
? MySQL數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的最重要的一個特點就是其插件式的存儲引擎.MySQL插件式的存儲引擎架構(gòu)提供了一系列標(biāo)準(zhǔn)的管理和服務(wù)支持,這些標(biāo)準(zhǔn)與存儲引擎本身無關(guān),可能是每個數(shù)據(jù)庫系統(tǒng)本身必須的,而存儲引擎是底層物理結(jié)構(gòu)的實現(xiàn),可根據(jù)開發(fā)者的意愿進行開發(fā).
? 需要特別注意的是,存儲引擎是基于表的,而不是數(shù)據(jù)庫.
3. MySQL存儲引擎
? 存儲引擎的好處是,每個存儲引擎都有各自的特點,更夠genuine具體的應(yīng)用建立不同的存儲引擎表.
? 由于MySQL數(shù)據(jù)庫開源的特性,存儲引擎可以分為MySQL官方存儲引擎和第三方存儲引擎,如InnoDB.
(1). InnoDB存儲引擎
? InnoDB存儲引擎支持事務(wù),其設(shè)計主要面向聯(lián)機事務(wù)處理(OLTP)的應(yīng)用.特點是行鎖設(shè)計,支持外鍵,并且支持類似于Oracle的非鎖定讀,也就是默認(rèn)讀取操作不會產(chǎn)生鎖.
? InnoDB存儲引擎將數(shù)據(jù)放在一個邏輯的表空間中,像黑盒一樣由InnoDB存儲引擎自身進行管理.
? InnoDB通過多版本并發(fā)控制來獲得高并發(fā)性,并且實現(xiàn)了SQL標(biāo)準(zhǔn)的4中隔離級別,默認(rèn)為REPEATABLE.
SQL的四種隔離級別:
- READ UNCOMMITED(未提交讀):事務(wù)可以讀取未提交的數(shù)據(jù),這也稱為臟讀(Dirty Read)。
- READ COMMITED (提交讀):一個事務(wù)從開始到提交之前犀农,所做的任何修改對其他事務(wù)都是不可見的。在同一事務(wù)中粹湃,多次讀取同一數(shù)據(jù)但是返回不同的結(jié)果,也就是有其他事務(wù)更改了這些數(shù)據(jù)泉坐。
- REPEATABLE READ (可重復(fù)讀):該級別保證了在同一個事務(wù)中多次讀取同樣的記錄的結(jié)果是一致的为鳄。無法解決另一個幻讀 (PhantomRead)的問題。就是說在第一個事務(wù)開始時腕让,讀取到一批數(shù)據(jù)孤钦,但是伺候另一個事務(wù)又插入新數(shù)據(jù)并提交,此時第一個事務(wù)又讀取到這批數(shù)據(jù)但是發(fā)現(xiàn)多出了一條,貌似產(chǎn)生幻覺一樣纯丸。
- SERIALIZABLE(可串行化):它通過強制事務(wù)串行偏形,避免了前面說的幻讀問題。
? 使用一種被稱為next-key locking的策略來避免幻讀現(xiàn)象的產(chǎn)生.初次之外,InnoDB存儲引擎還提供了插入緩存,二次寫,自適應(yīng)哈希索引,預(yù)讀等高性能和高可用的功能.
? InnoDB存儲引擎采用了聚集的方式,因此每張表的存儲都是按主鍵順序進行存放.如果沒有顯示的定義主鍵,InnoDB會給每一行生成一個6字節(jié)的ROWID,以此為主鍵.
(2). MyISAM存儲引擎
? MyISAM存儲引擎不支持事務(wù),表鎖設(shè)計,支持全文索引,主要面向一些聯(lián)機分析處理(OLAP)數(shù)據(jù)庫應(yīng)用.
? MyISAM存儲引擎的緩沖池只緩存索引文件,不緩沖數(shù)據(jù)文件.
? MyISAM存儲引擎表有MYD和MYI組成,MYD用來存放數(shù)據(jù)文件,MYI用來存放索引文件.
(3). NDB存儲引擎
? NDB存儲引擎是一個集群存儲引擎,其結(jié)構(gòu)是share nothing的集群架構(gòu),因此能提供更高的可用性.
? NDB存儲引擎的鏈接操作是在MySQL數(shù)據(jù)庫層完成的,而不是在存儲引擎層完成的,這意味這需要巨大的網(wǎng)絡(luò)開銷,查詢速度慢.
(4). Memory存儲引擎
? Memory存儲引擎將表中的數(shù)據(jù)放在內(nèi)存中,默認(rèn)使用哈希索引.速度較快,但是只支持表鎖,并發(fā)性較差,且存儲變長字段時是按照定長字段的方式進行的,會浪費內(nèi)存.
(5). Archive存儲引擎
? Archive存儲引擎只支持inster和select操作,使用zlib算法將數(shù)據(jù)航進行壓縮后存儲,非常適合存儲貴方數(shù)據(jù).使用行鎖來實現(xiàn)高并發(fā)的插入操作,但是本身并不是事務(wù)安全的.
(6). Federated存儲引擎
? Federated存儲引擎表并不存放數(shù)據(jù),指向一臺遠程MySQL數(shù)據(jù)庫服務(wù)器上的表.
(7). Maria存儲引擎
? Maria存儲引擎可以被看做是MyISAM的后續(xù)版本.支持緩存數(shù)據(jù)和索引文件,應(yīng)用了行鎖設(shè)計,提供了MVCC功能,支持事務(wù)和非事務(wù)安全的選項,以及更好的BLOB字符類型的處理性能.
4. 連接MySQL
? 連接MySQL的操作是一個鏈接進程和MySQL數(shù)據(jù)庫實例進行通信,本質(zhì)上是進程間的通信.常用的進程通信方式有管道,命名管道,命名字,TCP/IP套接字,UNIX域套接字.
(1). TCP/IP
? TCP/IP套接字方式是MySQL數(shù)據(jù)庫在任何平臺下都提供的連接方式.這種方式在TCP/IP連接上建立一個基于網(wǎng)絡(luò)的連接請求,一般情況下客戶端在一臺服務(wù)器上,MySQL實例在另外一臺服務(wù)器上,兩臺機器通過一個TCP/IP網(wǎng)絡(luò)連接.
? 下面這個命令就可以通過TCP/IP方式進行MySQL的遠端連接:
mysql -h xxx.xxx.xxx.xxx -u username -p password;
? 在通過TCP/IP連接到MySQL實例時,MySQL會先檢查一張權(quán)限視圖,也就是mysql.user這張表.只有擁有權(quán)限的用戶+機器才可以對數(shù)據(jù)庫進行修改.
(2). 命名管道和共享內(nèi)存
? 兩個需要進程通信的進程在同一臺服務(wù)器上,使用命名管道.
? MySQL也提供了共享內(nèi)存的鏈接方式.
(3). UNIX域套接字
? 由于UNIX域套接字不是網(wǎng)絡(luò)協(xié)議,所以只能在MySQL客戶端和數(shù)據(jù)庫實例在一臺服務(wù)器上的情況下使用.