一、關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫,是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫。
關(guān)系模型是在1970年由IBM的研究員E.F.Codd博士首先提出的,在之后的幾十年中,關(guān)系模型的概念得到了充分的發(fā)展并逐漸成為主流數(shù)據(jù)庫結(jié)構(gòu)的主流模型。
簡單來說,關(guān)系模型指的就是二維表格模型,而一個關(guān)系型數(shù)據(jù)庫就是由二維表及其之間的聯(lián)系所組成的一個數(shù)據(jù)組織。關(guān)系模型中常用的概念: 關(guān)系:可以理解為一張二維表,每個關(guān)系都具有一個關(guān)系名,就是通常說的表名 元組:可以理解為二維表中的一行,在數(shù)據(jù)庫中經(jīng)常被稱為記錄 屬性:可以理解為二維表中的一列,在數(shù)據(jù)庫中經(jīng)常被稱為字段 域:屬性的取值范圍,也就是數(shù)據(jù)庫中某一列的取值限制 關(guān)鍵字:一組可以唯一標(biāo)識元組的屬性,數(shù)據(jù)庫中常稱為主鍵,由一個或多個列組成 關(guān)系模式:指對關(guān)系的描述。其格式為:關(guān)系名(屬性1,屬性2, ... ... ,屬性N),在數(shù)據(jù)庫中成為表結(jié)構(gòu)關(guān)系型數(shù)據(jù)庫的優(yōu)點(diǎn):
容易理解:二維表結(jié)構(gòu)是非常貼近邏輯世界的一個概念,關(guān)系模型相對網(wǎng)狀、層次等其他模型來說更容易理解
使用方便:通用的SQL語言使得操作關(guān)系型數(shù)據(jù)庫非常方便
易于維護(hù):豐富的完整性(實(shí)體完整性、參照完整性和用戶定義的完整性)大大減低了數(shù)據(jù)冗余和數(shù)據(jù)不一致的概率**關(guān)系型數(shù)據(jù)庫瓶頸
1).高并發(fā)讀寫需求 網(wǎng)站的用戶并發(fā)性非常高,往往達(dá)到每秒上萬次讀寫請求,對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫來說,硬盤I/O是一個很大的瓶頸
2).海量數(shù)據(jù)的高效率讀寫 網(wǎng)站每天產(chǎn)生的數(shù)據(jù)量是巨大的,對于關(guān)系型數(shù)據(jù)庫來說,在一張包含海量數(shù)據(jù)的表中查詢,效率是非常低的
3).高擴(kuò)展性和可用性 在基于web的結(jié)構(gòu)當(dāng)中,數(shù)據(jù)庫是最難進(jìn)行橫向擴(kuò)展的,當(dāng)一個應(yīng)用系統(tǒng)的用戶量和訪問量與日俱增的時候,數(shù)據(jù)庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬件和服務(wù)節(jié)點(diǎn)來擴(kuò)展性能和負(fù)載能力。對于很多需要提供24小時不間斷服務(wù)的網(wǎng)站來說,對數(shù)據(jù)庫系統(tǒng)進(jìn)行升級和擴(kuò)展是非常痛苦的事情,往往需要停機(jī)維護(hù)和數(shù)據(jù)遷移。對網(wǎng)站來說,關(guān)系型數(shù)據(jù)庫的很多特性不再需要了:
事務(wù)一致性: 關(guān)系型數(shù)據(jù)庫在對事物一致性的維護(hù)中有很大的開銷,而現(xiàn)在很多web2.0系統(tǒng)對事物的讀寫一致性都不高
讀寫實(shí)時性: 對關(guān)系數(shù)據(jù)庫來說,插入一條數(shù)據(jù)之后立刻查詢,是肯定可以讀出這條數(shù)據(jù)的,但是對于很多web應(yīng)用來說,并不要求這么高的實(shí)時性,比如發(fā)一條消息之后,過幾秒乃至十幾秒之后才看到這條動態(tài)是完全可以接受的
復(fù)雜SQL,特別是多表關(guān)聯(lián)查詢: 任何大數(shù)據(jù)量的web系統(tǒng),都非常忌諱多個大表的關(guān)聯(lián)查詢,以及復(fù)雜的數(shù)據(jù)分析類型的復(fù)雜SQL報表查詢,特別是SNS類型的網(wǎng)站(SNS,專指社交網(wǎng)絡(luò)服務(wù),包括了社交軟件和社交網(wǎng)站。),從需求以及產(chǎn)品階級角度,就避免了這種情況的產(chǎn)生。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能極大的弱化了 在關(guān)系型數(shù)據(jù)庫中,導(dǎo)致性能欠佳的最主要原因是多表的關(guān)聯(lián)查詢,以及復(fù)雜的數(shù)據(jù)分析類型的復(fù)雜SQL報表查詢。為了保證數(shù)據(jù)庫的ACID特性,我們必須盡量按照其要求的范式進(jìn)行設(shè)計,關(guān)系型數(shù)據(jù)庫中的表都是存儲一個格式化的數(shù)據(jù)結(jié)構(gòu)。每個元組字段的組成都是一樣,即使不是每個元組都需要所有的字段,但數(shù)據(jù)庫會為每個元組分配所有的字段,這樣的結(jié)構(gòu)可以便于標(biāo)語表之間進(jìn)行鏈接等操作,但從另一個角度來說它也是關(guān)系型數(shù)據(jù)庫性能瓶頸的一個因素。
二、NoSQL
NoSQL一詞首先是Carlo Strozzi在1998年提出來的,指的是他開發(fā)的一個沒有SQL功能,輕量級的,開源的關(guān)系型數(shù)據(jù)庫。這個定義跟我們現(xiàn)在對NoSQL的定義有很大的區(qū)別,它確確實(shí)實(shí)字如其名,指的就是“沒有SQL”的數(shù)據(jù)庫。但是NoSQL的發(fā)展慢慢偏離了初衷,我們要的不是“no sql”,而是“no relational”,也就是我們現(xiàn)在常說的非關(guān)系型數(shù)據(jù)庫了。 2009年初,Johan Oskarsson舉辦了一場關(guān)于開源分布式數(shù)據(jù)庫的討論,Eric Evans在這次討論中再次提出了NoSQL一詞,用于指代那些非關(guān)系型的,分布式的,且一般不保證遵循ACID原則的數(shù)據(jù)存儲系統(tǒng)。Eric Evans使用NoSQL這個詞,并不是因?yàn)樽置嫔系摹皼]有SQL”的意思,他只是覺得很多經(jīng)典的關(guān)系型數(shù)據(jù)庫名字都叫“**SQL”,所以為了表示跟這些關(guān)系型數(shù)據(jù)庫在定位上的截然不同,就是用了“NoSQL“一詞。注:數(shù)據(jù)庫事務(wù)必須具備ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔離性,Durability持久性。
非關(guān)系型數(shù)據(jù)庫提出另一種理念,例如,以鍵值對存儲,且結(jié)構(gòu)不固定,每一個元組可以有不一樣的字段,每個元組可以根據(jù)需要增加一些自己的鍵值對,這樣就不會局限于固定的結(jié)構(gòu),可以減少一些時間和空間的開銷。使用這種方式,用戶可以根據(jù)需要去添加自己需要的字段,這樣,為了獲取用戶的不同信息,不需要像關(guān)系型數(shù)據(jù)庫中,要對多表進(jìn)行關(guān)聯(lián)查詢。僅需要根據(jù)id取出相應(yīng)的value就可以完成查詢。但非關(guān)系型數(shù)據(jù)庫由于很少的約束,他也不能夠提供像SQL所提供的where這種對于字段屬性值情況的查詢。并且難以體現(xiàn)設(shè)計的完整性。他只適合存儲一些較為簡單的數(shù)據(jù),對于需要進(jìn)行較復(fù)雜查詢的數(shù)據(jù),SQL數(shù)據(jù)庫顯的更為合適。
2-1.非關(guān)系型數(shù)據(jù)庫分類
由于非關(guān)系型數(shù)據(jù)庫本身天然的多樣性,以及出現(xiàn)的時間較短,因此,不想關(guān)系型數(shù)據(jù)庫,有幾種數(shù)據(jù)庫能夠一統(tǒng)江山,非關(guān)系型數(shù)據(jù)庫非常多,并且大部分都是開源的。
這些數(shù)據(jù)庫中,其實(shí)實(shí)現(xiàn)大部分都比較簡單,除了一些共性外,很大一部分都是針對某些特定的應(yīng)用需求出現(xiàn)的,因此,對于該類應(yīng)用,具有極高的性能。依據(jù)結(jié)構(gòu)化方法以及應(yīng)用場合的不同,主要分為以下幾類:
1).面向高性能并發(fā)讀寫的key-value數(shù)據(jù)庫:key-value數(shù)據(jù)庫的主要特點(diǎn)即使具有極高的并發(fā)讀寫性能,Redis,Tokyo Cabinet,Flare就是這類的代表
2).面向海量數(shù)據(jù)訪問的面向文檔數(shù)據(jù)庫:這類數(shù)據(jù)庫的特點(diǎn)是,可以在海量的數(shù)據(jù)中快速的查詢數(shù)據(jù),典型代表為MongoDB以及CouchDB
3).面向可擴(kuò)展性的分布式數(shù)據(jù)庫:這類數(shù)據(jù)庫想解決的問題就是傳統(tǒng)數(shù)據(jù)庫存在可擴(kuò)展性上的缺陷,這類數(shù)據(jù)庫可以適應(yīng)數(shù)據(jù)量的增加以及數(shù)據(jù)結(jié)構(gòu)的變化
三. 關(guān)系型數(shù)據(jù)庫 V.S. 非關(guān)系型數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫的最大特點(diǎn)就是事務(wù)的一致性:傳統(tǒng)的關(guān)系型數(shù)據(jù)庫讀寫操作都是事務(wù)的,具有ACID的特點(diǎn),這個特性使得關(guān)系型數(shù)據(jù)庫可以用于幾乎所有對一致性有要求的系統(tǒng)中,如典型的銀行系統(tǒng)。
但是,在網(wǎng)頁應(yīng)用中,尤其是SNS應(yīng)用中,一致性卻不是顯得那么重要,用戶A看到的內(nèi)容和用戶B看到同一用戶C內(nèi)容更新不一致是可以容忍的,或者說,兩個人看到同一好友的數(shù)據(jù)更新的時間差那么幾秒是可以容忍的,因此,關(guān)系型數(shù)據(jù)庫的最大特點(diǎn)在這里已經(jīng)無用武之地,起碼不是那么重要了。
相反地,關(guān)系型數(shù)據(jù)庫為了維護(hù)一致性所付出的巨大代價就是其讀寫性能比較差,而像微博、facebook這類SNS的應(yīng)用,對并發(fā)讀寫能力要求極高,關(guān)系型數(shù)據(jù)庫已經(jīng)無法應(yīng)付(在讀方面,傳統(tǒng)上為了克服關(guān)系型數(shù)據(jù)庫缺陷,提高性能,都是增加一級memcache來靜態(tài)化網(wǎng)頁,而在SNS中,變化太快,memchache已經(jīng)無能為力了),因此,必須用新的一種數(shù)據(jù)結(jié)構(gòu)存儲來代替關(guān)系數(shù)據(jù)庫。
關(guān)系數(shù)據(jù)庫的另一個特點(diǎn)就是其具有固定的表結(jié)構(gòu),因此,其擴(kuò)展性極差,而在SNS中,系統(tǒng)的升級,功能的增加,往往意味著數(shù)據(jù)結(jié)構(gòu)巨大變動,這一點(diǎn)關(guān)系型數(shù)據(jù)庫也難以應(yīng)付,需要新的結(jié)構(gòu)化數(shù)據(jù)存儲。
于是,非關(guān)系型數(shù)據(jù)庫應(yīng)運(yùn)而生,由于不可能用一種數(shù)據(jù)結(jié)構(gòu)化存儲應(yīng)付所有的新的需求,因此,非關(guān)系型數(shù)據(jù)庫嚴(yán)格上不是一種數(shù)據(jù)庫,應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲方法的集合。
必須強(qiáng)調(diào)的是,數(shù)據(jù)的持久存儲,尤其是海量數(shù)據(jù)的持久存儲,還是需要一種關(guān)系數(shù)據(jù)庫這員老將。
oracle與mysql的區(qū)別
一、并發(fā)性
并發(fā)性是數(shù)據(jù)庫最重要的特性,但并發(fā)涉及到資源的獲取、共享與鎖定。
MySQL:mysql以表級鎖為主,對資源鎖定的粒度很大,如果一個session對一個表加鎖時間過長,會讓其他session無法更新此表中的數(shù)據(jù)。雖然InnoDB引擎的表可以用行級鎖,但這個行級鎖的機(jī)制依賴于表的索引,如果表沒有索引,或者sql語句沒有使用索引,那么仍然使用表級鎖。
Oracle:oracle使用行級鎖,對資源鎖定的粒度要小很多,只是鎖定sql需要的資源,并且加鎖是在數(shù)據(jù)庫中的數(shù)據(jù)行上,不依賴與索引。所以oracle對并發(fā)性的支持要好很多。
二、一致性
oracle:oracle支持serializable的隔離級別,可以實(shí)現(xiàn)最高級別的讀一致性。每個session提交后其他session才能看到提交的更改。oracle通過在undo表空間中構(gòu)造多版本數(shù)據(jù)塊來實(shí)現(xiàn)讀一致性,每個session查詢時,如果對應(yīng)的數(shù)據(jù)塊發(fā)生變化,oracle會在undo表空間中為這個session構(gòu)造它查詢時的舊的數(shù)據(jù)塊。
mysql:mysql沒有類似oracle的構(gòu)造多版本數(shù)據(jù)塊的機(jī)制,只支持read commited的隔離級別。一個session讀取數(shù)據(jù)時,其他session不能更改數(shù)據(jù),但可以在表最后插入數(shù)據(jù)。session更新數(shù)據(jù)時,要加上排它鎖,其他session無法訪問數(shù)據(jù)。
三、事務(wù)
oracle很早就完全支持事務(wù)。
mysql在innodb存儲引擎的行級鎖的情況下才支持事務(wù)。
四、數(shù)據(jù)持久性
oracle:保證提交的數(shù)據(jù)均可恢復(fù),因?yàn)閛racle把提交的sql操作線寫入了在線聯(lián)機(jī)日志文件中,保持到了磁盤上,如果出現(xiàn)數(shù)據(jù)庫或主機(jī)異常重啟,重啟后oracle可以考聯(lián)機(jī)在線日志恢復(fù)客戶提交的數(shù)據(jù)。
mysql:默認(rèn)提交sql語句,但如果更新過程中出現(xiàn)db或主機(jī)重啟的問題,也許會丟失數(shù)據(jù)。
五、提交方式
oracle默認(rèn)不自動提交,需要用戶手動提交。
mysql默認(rèn)是自動提交。
六、邏輯備份
oracle邏輯備份時不鎖定數(shù)據(jù),且備份的數(shù)據(jù)是一致的。
mysql邏輯備份時要鎖定數(shù)據(jù),才能保證備份的數(shù)據(jù)是一致的,影響業(yè)務(wù)正常的dml使用。
七、熱備份
oracle有成熟的熱備工具rman,熱備時,不影響用戶使用數(shù)據(jù)庫。即使備份的數(shù)據(jù)庫不一致,也可以在恢復(fù)時通過歸檔日志和聯(lián)機(jī)重做日志進(jìn)行一致的回復(fù)。
mysql:myisam的引擎,用mysql自帶的mysqlhostcopy熱備時,需要給表加讀鎖,影響dml操作。innodb的引擎,它會備份innodb的表和索引,但是不會備份.frm文件。用ibbackup備份時,會有一個日志文件記錄備份期間的數(shù)據(jù)變化,因此可以不用鎖表,不影響其他用戶使用數(shù)據(jù)庫。但此工具是收費(fèi)的。innobackup是結(jié)合ibbackup使用的一個腳本,他會協(xié)助對.frm文件的備份。
八、sql語句的擴(kuò)展和靈活性
mysql對sql語句有很多非常實(shí)用而方便的擴(kuò)展,比如limit功能,insert可以一次插入多行數(shù)據(jù),select某些管理數(shù)據(jù)可以不加from。
oracle在這方面感覺更加穩(wěn)重傳統(tǒng)一些。
九、復(fù)制
oracle:既有推或拉式的傳統(tǒng)數(shù)據(jù)復(fù)制,也有dataguard的雙機(jī)或多機(jī)容災(zāi)機(jī)制,主庫出現(xiàn)問題是,可以自動切換備庫到主庫,但配置管理較復(fù)雜。
mysql:復(fù)制服務(wù)器配置簡單,但主庫出問題時,叢庫有可能丟失一定的數(shù)據(jù)。且需要手工切換叢庫到主庫。
十、性能診斷
oracle有各種成熟的性能診斷調(diào)優(yōu)工具,能實(shí)現(xiàn)很多自動分析、診斷功能。比如awr、addm、sqltrace、tkproof等
mysql的診斷調(diào)優(yōu)方法較少,主要有慢查詢?nèi)罩尽?br>
十一、權(quán)限與安全
mysql的用戶與主機(jī)有關(guān),感覺沒有什么意義,另外更容易被仿冒主機(jī)及ip有可乘之機(jī)。 oracle的權(quán)限與安全概念比較傳統(tǒng),中規(guī)中矩。十二、分區(qū)表和分區(qū)索引
oracle的分區(qū)表和分區(qū)索引功能很成熟,可以提高用戶訪問db的體驗(yàn)。
mysql的分區(qū)表還不太成熟穩(wěn)定。
十三、管理工具
oracle有多種成熟的命令行、圖形界面、web管理工具,還有很多第三方的管理工具,管理極其方便高效。
mysql管理工具較少,在Linux下的管理工具的安裝有時要安裝額外的包(phpmyadmin, etc),有一定復(fù)雜性。
轉(zhuǎn)自http://blog.csdn.net/ochangwen/article/details/53423301 感謝!