開(kāi)源數(shù)據(jù)庫(kù)SQLite、MySQL和PostgreSQL比較
Linux是一款免費(fèi)開(kāi)源的操作系統(tǒng),由于其自由、開(kāi)放、安全、穩(wěn)定等諸多特點(diǎn),已被各大IT公司廣泛地應(yīng)用于服務(wù)器和嵌入式設(shè)備中。
由于數(shù)據(jù)存儲(chǔ)的需要,Linux操作系統(tǒng)需要搭配一套性能優(yōu)良的數(shù)據(jù)庫(kù)才能很好的滿足業(yè)務(wù)需求,但是Linux系統(tǒng)下可用的數(shù)據(jù)庫(kù)種類繁多,功能和性能也是各有千秋,往往我們需要根據(jù)業(yè)務(wù)場(chǎng)景來(lái)靈活的選擇要使用的數(shù)據(jù)庫(kù)。

但有時(shí)因?yàn)槿狈?jīng)驗(yàn),選擇了不合適的數(shù)據(jù)庫(kù),導(dǎo)致業(yè)務(wù)運(yùn)轉(zhuǎn)過(guò)程中出現(xiàn)了許多問(wèn)題和瓶頸,比如后臺(tái)系統(tǒng)需要進(jìn)行大量且頻繁的并發(fā)讀寫(xiě)操作,但選擇了MySQL,導(dǎo)致使用過(guò)程中出現(xiàn)了許多不可避免的讀寫(xiě)錯(cuò)誤;再比如很多嵌入式系統(tǒng)需要支持多用戶,卻選擇了SQLite,雖說(shuō)SQLite小巧輕便,遷移性好,很適合嵌入式系統(tǒng),但是他并不支持多用戶管理。所以如何選擇一套適合的數(shù)據(jù)庫(kù)就是我們所面臨的一道難題。
當(dāng)下Linux系統(tǒng)中常用的數(shù)據(jù)庫(kù)包括兩大類,一是商業(yè)型數(shù)據(jù)庫(kù),比如Oracle、Sybase、DB2、Informix、SQL Server等;二是開(kāi)源免費(fèi)的數(shù)據(jù)庫(kù),比如MySQL、PostgreSQL、SQLite等。商業(yè)數(shù)據(jù)庫(kù)的功能與性能自不必多說(shuō),它們背后還有強(qiáng)大的技術(shù)團(tuán)隊(duì)的支持,此處我們要講的是幾種常用的開(kāi)源免費(fèi)數(shù)據(jù)庫(kù)。本文根據(jù)我們的日常開(kāi)發(fā)經(jīng)驗(yàn),簡(jiǎn)單的對(duì)MySQL、PostgreSQL、SQLite進(jìn)行比較,給大家提供一個(gè)參考。
1、SQLite數(shù)據(jù)庫(kù)

SQLite是一款輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù),它是用C語(yǔ)言實(shí)現(xiàn)的。它是供嵌入式使用的,已廣泛地應(yīng)用到各個(gè)嵌入式系統(tǒng)中。它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。
SQLite能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語(yǔ)言相結(jié)合,比如 C++、C#、PHP、Java等,和Mysql、PostgreSQL這兩款開(kāi)源的世界著名數(shù)據(jù)庫(kù)管理系統(tǒng)相比,它的處理速度比他們都快。
(1)SQLite的優(yōu)勢(shì)
它的第一個(gè)特色是輕量級(jí)。SQLite的作者很看重這個(gè)特性,連它的Logo都是用的“羽毛”,來(lái)顯擺它的輕飄飄。和客戶端/服務(wù)器模式的數(shù)據(jù)庫(kù)又說(shuō)不同,SQLite是本地?cái)?shù)據(jù)庫(kù),他是進(jìn)程內(nèi)的數(shù)據(jù)庫(kù)引擎。使用SQLite室只需要帶上它的一個(gè)動(dòng)態(tài) 庫(kù),就可以享受它的全部功能,并且這個(gè)動(dòng)態(tài)庫(kù)的尺寸也挺小。
SQLite的另外一個(gè)特點(diǎn)是綠色。它的核心引擎本身不依賴第三方的軟件,使用它也不需要“安裝”,只需要引入動(dòng)態(tài)庫(kù)即可,所以在部署的時(shí)候能夠省去不少麻煩。
跨平臺(tái)/可移植性,如果光支持主流操作系統(tǒng),那就沒(méi)啥好吹噓的了。除了主流操作系統(tǒng),SQLite還支持了很多冷門(mén)的操作系統(tǒng)。尤其是它對(duì)很多嵌入式系統(tǒng)支持的非常好,比如Android、Windows Mobile、Symbin、Palm、VxWorks等。
SQLite使用的是Public Domain協(xié)議,這是最爽一種,可以放心大膽地用,毫無(wú)限制的使用。
(2)SQLite的缺點(diǎn)
SQLite在并發(fā)(包括多進(jìn)程和多線程)讀寫(xiě)方面的性能一直不太理想。數(shù)據(jù)庫(kù)可能會(huì)被寫(xiě)操作獨(dú)占,從而導(dǎo)致其它讀寫(xiě)操作阻塞或出錯(cuò)。
SQLite對(duì)SQL標(biāo)準(zhǔn)支持不全,在它的官方網(wǎng)站上,具體列舉了不支持哪些SQL92標(biāo)準(zhǔn)。特別是不支持外鍵的約束.
有時(shí)候需要訪問(wèn)其它機(jī)器上的SQLite庫(kù)文件,就會(huì)把數(shù)據(jù)庫(kù)文件放置到網(wǎng)絡(luò)共享目錄上。這時(shí)候你就要小心了。當(dāng)SQLite文件放置于NFS時(shí),在并發(fā)讀寫(xiě)的情況下可能會(huì)出問(wèn)題(比如數(shù)據(jù)損壞),原因是由于某些NFS網(wǎng)絡(luò)文件系統(tǒng)的文件鎖在實(shí)現(xiàn)上是有Bug的。
(3)使用場(chǎng)景
一是嵌入式應(yīng)用場(chǎng)景,所有需要遷移性,不需要擴(kuò)展的應(yīng)用,例如,單用戶的本地應(yīng)用,移動(dòng)應(yīng)用和游戲。
二是代替磁盤(pán)訪問(wèn)的場(chǎng)景,在很多情況下,需要頻繁直接讀/寫(xiě)磁盤(pán)文件的應(yīng)用,都很適合轉(zhuǎn)為使用 SQLite ,可以得益于 SQLite 使用 SQL 帶來(lái)的功能性和簡(jiǎn)潔性。
2、MySQL數(shù)據(jù)庫(kù)

MySQL是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),是最好的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)應(yīng)用軟件之一。MySQL所使用的 SQL 語(yǔ)言是用于訪問(wèn)數(shù)據(jù)庫(kù)的最常用標(biāo)準(zhǔn)化語(yǔ)言。MySQL由于其體積小、速度快、免費(fèi)開(kāi)源,被IT公司廣泛的采用。
(1)MySQL的優(yōu)勢(shì)
它使用的核心線程是完全多線程,速度快并支持多處理器。有多種列類型:1、2、3、4、和8字節(jié)長(zhǎng)度自有符號(hào)/無(wú)符號(hào)整數(shù)、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、和ENUM類型。
它通過(guò)一個(gè)高度優(yōu)化的類庫(kù)實(shí)現(xiàn)SQL函數(shù)庫(kù)并像他們能達(dá)到的一樣快速,通常在查詢初始化后不該有任何內(nèi)存分配。沒(méi)有內(nèi)存漏洞,支持ANSI SQL的LEFT 0UTER JOIN和ODBC。
MySQL可以工作在不同的平臺(tái)上。支持C、C++、Java、Perl、PHP、Python和TCL API。
MySQL全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函數(shù)(COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、MAX()和MIN())。你可以在同一查詢中混來(lái)自不同數(shù)據(jù)庫(kù)的表。所有列都有缺省值。你可以用INSERT插入一個(gè)表列的子集,那些沒(méi)用明確給定值的列設(shè)置為他們的決省值。
(2)MySQL的缺點(diǎn)
- MySQL最大的缺點(diǎn)是其安全系統(tǒng),主要是復(fù)雜而非標(biāo)準(zhǔn),另外只有到調(diào)用mysqladmin來(lái)重讀用戶權(quán)限時(shí)才發(fā)生改變。
- MySQL的另一個(gè)主要的缺陷之一是缺乏標(biāo)準(zhǔn)的RI(Referential Integrity-RI)機(jī)制;Rl限制的缺乏(在給定字段域上的一種固定的范圍限制)可以通過(guò)大量的數(shù)據(jù)類型來(lái)補(bǔ)償。 MySQL沒(méi)有一種存儲(chǔ)過(guò)程(Stored Procedure)語(yǔ)言,這是對(duì)習(xí)慣于企業(yè)級(jí)數(shù)據(jù)庫(kù)的程序員的最大限制。
(3)MySQL的使用場(chǎng)景
- 分布式操作場(chǎng)景:當(dāng)你需要的比SQLite可以提供的更多時(shí),把MySQL包括進(jìn)你的部署棧,就像任何一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)器,會(huì)帶來(lái)大量的操作自由和一些先進(jìn)的功能。
- 高安全性場(chǎng)景:MySQL的安全功能,用一種簡(jiǎn)單的方式為數(shù)據(jù)訪問(wèn)(和使用)提供了可靠的保護(hù)。
- Web網(wǎng)站和Web應(yīng)用場(chǎng)景:絕大多數(shù)的網(wǎng)站(和Web應(yīng)用程序)可以忽視約束性地簡(jiǎn)單工作在MySQL上。這種靈活的和可擴(kuò)展的工具是易于使用和易于管理的——這被證明非常有助于長(zhǎng)期運(yùn)行。
- 定制解決方案場(chǎng)景:如果你工作在一個(gè)高度量身定制的解決方案上,MySQL能夠很容易地尾隨和執(zhí)行你的規(guī)則,這要感謝其豐富的配置設(shè)置和操作模式。
- 多用戶應(yīng)用場(chǎng)景:如果你在開(kāi)發(fā)的應(yīng)用需要被多用戶訪問(wèn),而且這些用戶都用同一個(gè)數(shù)據(jù)庫(kù),那么相比 SQLite,最好還是選擇一個(gè)功能完整的關(guān)系型數(shù)據(jù)庫(kù)MySQL。
3、PostgreSQL數(shù)據(jù)庫(kù)

PostgreSQL是一個(gè)功能非常強(qiáng)大的、源代碼開(kāi)放的客戶/服務(wù)器關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),以加州大學(xué)計(jì)算機(jī)系開(kāi)發(fā)的POSTGRES,4.2版本為基礎(chǔ)發(fā)展起來(lái)的對(duì)象關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。PostgresSQL憑借其經(jīng)過(guò)驗(yàn)證的架構(gòu),可靠性,數(shù)據(jù)完整性,強(qiáng)大的功能集,可擴(kuò)展性以及軟件背后的開(kāi)源社區(qū)的奉獻(xiàn)精神贏得了良好的聲譽(yù),PostgreSQL被廣泛地應(yīng)用到各大IT軟件系統(tǒng)中。
(1)PostgreSQL的優(yōu)勢(shì)
- PostgreSQL支持存儲(chǔ)過(guò)程,且有眾多的商業(yè)邏輯的存在,此時(shí)使用存儲(chǔ)過(guò)程可以在較少地增加數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān)的前提下,對(duì)這樣的商業(yè)邏輯進(jìn)行封裝,并可以利用數(shù)據(jù)庫(kù)服務(wù)器本身的內(nèi)在機(jī)制對(duì)存儲(chǔ)過(guò)程的執(zhí)行進(jìn)行優(yōu)化。此外存儲(chǔ)過(guò)程的存在也避免了在網(wǎng)絡(luò)上大量的原始的SQL語(yǔ)句的傳輸,這樣的優(yōu)勢(shì)是顯而易見(jiàn)的。
- PostgreSQL支持視圖,視圖的存在可以最大限度地利用數(shù)據(jù)庫(kù)服務(wù)器內(nèi)在的優(yōu)化機(jī)制。而且對(duì)于視圖權(quán)限的合理使用,事實(shí)上可以提供行級(jí)別的權(quán)限,這是MySQL和SQLite的權(quán)限系統(tǒng)所無(wú)法實(shí)現(xiàn)的
- PostgreSQL支持觸發(fā)器,觸發(fā)器的存在不可避免的會(huì)影響數(shù)據(jù)庫(kù)運(yùn)行的效率,但是與此同時(shí),觸發(fā)器的存在也有利于對(duì)商業(yè)邏輯的封裝,可以減少應(yīng)用程序中對(duì)同一商業(yè)邏輯的重復(fù)控制。合理地使用觸發(fā)器也有利于保證數(shù)據(jù)的完整性。
- PostgreSQL支持R-trees這樣可擴(kuò)展的索引類型,可以更方便地處理一些特殊數(shù)據(jù),支持ODBC。
(2)PostgreSQL的缺點(diǎn)
- PostgreSQL運(yùn)行速度明顯低于MySQL和SQLite,因?yàn)镸ySQL使用了線程,而PostgreSQL使用的是進(jìn)程。在不同線程之間的環(huán)境轉(zhuǎn)換和訪問(wèn)公用的存儲(chǔ)區(qū)域顯然要比在不同的進(jìn)程之間要快得多。
- PostgreSQL目前仍不完全適應(yīng)24×7小時(shí)運(yùn)行,這是因?yàn)槟惚仨毭扛粢欢螘r(shí)間運(yùn)行一次VACUUM。
- PostgreSQL在權(quán)限系統(tǒng)上也不是很完善。PostgreSQL只支持對(duì)于每一個(gè)用戶在一個(gè)數(shù)據(jù)庫(kù)上或一個(gè)數(shù)據(jù)表上的INSERT、SELECT和UPDATE/DELETE的授權(quán),而MySQL允許你定義一整套的不同的數(shù)據(jù)級(jí)、表級(jí)和列級(jí)的權(quán)限。
- PostgreSQL生成每頁(yè)的速度要比MySQL慢,PostgreSQL還欠缺一些比較高端的數(shù)據(jù)庫(kù)管理系統(tǒng)需要的特性,比如對(duì)大對(duì)象的有效支持,以及查詢緩沖等提高數(shù)據(jù)庫(kù)性能的機(jī)制等。
(3)PostgreSQL的使用場(chǎng)景
- 數(shù)據(jù)完整性場(chǎng)景:當(dāng)可靠性和數(shù)據(jù)完整性是絕對(duì)必要而無(wú)需理由時(shí),PostgreSQL是更好的選擇。
- 復(fù)雜的自定義過(guò)程場(chǎng)景:如果你需要你的數(shù)據(jù)庫(kù)執(zhí)行自定義過(guò)程,可擴(kuò)展的PostgreSQL是更好的選擇。
- 整合遷移場(chǎng)景:在將來(lái),如果可能要把整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)遷移到另一個(gè)適當(dāng)?shù)慕鉀Q方案(例如Oracle)中,PostgreSQL對(duì)于這種切換將是最兼容和易于操作的。
- 復(fù)雜的設(shè)計(jì)場(chǎng)景:相比其他的開(kāi)源和免費(fèi)的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)現(xiàn)來(lái)說(shuō),對(duì)于復(fù)雜的數(shù)據(jù)庫(kù)設(shè)計(jì),PostgreSQL提供了大部分的功能和可能性,同時(shí)并沒(méi)放棄其他有價(jià)值的地方。
4、我們項(xiàng)目中的數(shù)據(jù)庫(kù)使用情況
就我們目前工作中接觸到的服務(wù)器平臺(tái)而言,它需要處理大量的數(shù)據(jù)信息,需要較高的安全性,以及支持多用戶并發(fā)的需求,我們采用的是MySQL數(shù)據(jù)庫(kù),而事實(shí)上也正好驗(yàn)證了我們的預(yù)期結(jié)果。
我們項(xiàng)目中常用的存儲(chǔ)陣列,則屬于嵌入式設(shè)備,對(duì)于嵌入式設(shè)備,業(yè)內(nèi)常采用的就是輕量級(jí)的數(shù)據(jù)庫(kù),而且需要頻繁直接讀/寫(xiě)磁盤(pán)文件,需要進(jìn)行數(shù)據(jù)遷移,但不需要擴(kuò)展等因素,所以我們的陣列設(shè)備使用了采用SQLite數(shù)據(jù)庫(kù),這也正好符合上述的結(jié)論。
5、寫(xiě)在最后
沒(méi)有最好的,只有適合的!選擇一個(gè)適合的數(shù)據(jù)庫(kù)會(huì)讓你的工作事半功倍,而一個(gè)不適合的數(shù)據(jù)庫(kù)會(huì)讓你煩擾不斷,問(wèn)題頻發(fā)。
在選擇數(shù)據(jù)庫(kù)之前,必須先了解清楚設(shè)備的軟硬件環(huán)境,然后根據(jù)具體的業(yè)務(wù)需求和實(shí)用場(chǎng)景,針對(duì)不同數(shù)據(jù)庫(kù)的優(yōu)缺點(diǎn),揚(yáng)長(zhǎng)避短,選擇最合適的數(shù)據(jù)庫(kù)。