linux是一款免費開源的操作系統,由于其自由、開放、安全、穩定等諸多特點,已被各大IT公司廣泛地應用于服務器和嵌入式設備中。
由于數據存儲的需要,Linux操作系統需要搭配一套性能優良的數據庫才能很好的滿足業務需求,但是Linux系統下可用的數據庫種類繁多,功能和性能也是各有千秋,往往我們需要根據業務場景來靈活的選擇要使用的數據庫。
但有時因為缺乏經驗,選擇了不合適的數據庫,導致業務運轉過程中出現了許多問題和瓶頸,比如后臺系統需要進行大量且頻繁的并發讀寫操作,但選擇了MySQL,導致使用過程中出現了許多不可避免的讀寫錯誤;再比如很多嵌入式系統需要支持多用戶,卻選擇了SQLite,雖說SQLite小巧輕便,遷移性好,很適合嵌入式系統,但是他并不支持多用戶管理。所以如何選擇一套適合的數據庫就是我們所面臨的一道難題。
當下Linux系統中常用的數據庫包括兩大類,一是商業型數據庫,比如Oracle、Sybase、DB2、Informix、SQL Server等;二是開源免費的數據庫,比如MySQL、PostgreSQL、SQLite等。商業數據庫的功能與性能自不必多說,它們背后還有強大的技術團隊的支持,此處我們要講的是幾種常用的開源免費數據庫。本文根據我們的日常開發經驗,簡單的對MySQL、PostgreSQL、SQLite進行比較,給大家提供一個參考。
1、SQLite數據庫
SQLite是一款輕量級的關系型數據庫,它是用C語言實現的。它是供嵌入式使用的,已廣泛地應用到各個嵌入式系統中。它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。
SQLite能夠支持windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 C++、C#、php、JAVA等,和Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統相比,它的處理速度比他們都快。
(1)SQLite的優勢
它的第一個特色是輕量級。SQLite的作者很看重這個特性,連它的Logo都是用的“羽毛”,來顯擺它的輕飄飄。和客戶端/服務器模式的數據庫又說不同,SQLite是本地數據庫,他是進程內的數據庫引擎。使用SQLite室只需要帶上它的一個動態 庫,就可以享受它的全部功能,并且這個動態庫的尺寸也挺小。
SQLite的另外一個特點是綠色。它的核心引擎本身不依賴第三方的軟件,使用它也不需要“安裝”,只需要引入動態庫即可,所以在部署的時候能夠省去不少麻煩。
跨平臺/可移植性,如果光支持主流操作系統,那就沒啥好吹噓的了。除了主流操作系統,SQLite還支持了很多冷門的操作系統。尤其是它對很多嵌入式系統支持的非常好,比如Android、Windows Mobile、Symbin、Palm、VxWorks等。
SQLite使用的是Public Domain協議,這是最爽一種,可以放心大膽地用,毫無限制的使用。
(2)SQLite的缺點
SQLite在并發(包括多進程和多線程)讀寫方面的性能一直不太理想。數據庫可能會被寫操作獨占,從而導致其它讀寫操作阻塞或出錯。
SQLite對SQL標準支持不全,在它的官方網站上,具體列舉了不支持哪些SQL92標準。特別是不支持外鍵的約束.
有時候需要訪問其它機器上的SQLite庫文件,就會把數據庫文件放置到網絡共享目錄上。這時候你就要小心了。當SQLite文件放置于NFS時,在并發讀寫的情況下可能會出問題(比如數據損壞),原因是由于某些NFS網絡文件系統的文件鎖在實現上是有Bug的。
(3)使用場景
一是嵌入式應用場景,所有需要遷移性,不需要擴展的應用,例如,單用戶的本地應用,移動應用和游戲。
二是代替磁盤訪問的場景,在很多情況下,需要頻繁直接讀/寫磁盤文件的應用,都很適合轉為使用 SQLite ,可以得益于 SQLite 使用 SQL 帶來的功能性和簡潔性。
2、MySQL數據庫
MySQL是最流行的關系型數據庫管理系統,是最好的關系數據庫管理系統應用軟件之一。MySQL所使用的 SQL 語言是用于訪問數據庫的最常用標準化語言。MySQL由于其體積小、速度快、免費開源,被IT公司廣泛的采用。
(1)MySQL的優勢
它使用的核心線程是完全多線程,速度快并支持多處理器。有多種列類型:1、2、3、4、和8字節長度自有符號/無符號整數、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、和ENUM類型。
它通過一個高度優化的類庫實現SQL函數庫并像他們能達到的一樣快速,通常在查詢初始化后不該有任何內存分配。沒有內存漏洞,支持ANSI SQL的LEFT 0UTER JOIN和ODBC。
MySQL可以工作在不同的平臺上。支持C、C++、Java、Perl、PHP、Python和TCL API。
MySQL全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函數(COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、MAX()和MIN())。你可以在同一查詢中混來自不同數據庫的表。所有列都有缺省值。你可以用INSERT插入一個表列的子集,那些沒用明確給定值的列設置為他們的決省值。
(2)MySQL的缺點
MySQL最大的缺點是其安全系統,主要是復雜而非標準,另外只有到調用mysqladmin來重讀用戶權限時才發生改變。
MySQL的另一個主要的缺陷之一是缺乏標準的RI(Referential Integrity-RI)機制;Rl限制的缺乏(在給定字段域上的一種固定的范圍限制)可以通過大量的數據類型來補償。 MySQL沒有一種存儲過程(Stored Procedure)語言,這是對習慣于企業級數據庫的程序員的最大限制。
(3)MySQL的使用場景
分布式操作場景:當你需要的比SQLite可以提供的更多時,把MySQL包括進你的部署棧,就像任何一個獨立的數據庫服務器,會帶來大量的操作自由和一些先進的功能。
高安全性場景:MySQL的安全功能,用一種簡單的方式為數據訪問(和使用)提供了可靠的保護。
Web網站和Web應用場景:絕大多數的網站(和Web應用程序)可以忽視約束性地簡單工作在MySQL上。這種靈活的和可擴展的工具是易于使用和易于管理的——這被證明非常有助于長期運行。
定制解決方案場景:如果你工作在一個高度量身定制的解決方案上,MySQL能夠很容易地尾隨和執行你的規則,這要感謝其豐富的配置設置和操作模式。
多用戶應用場景:如果你在開發的應用需要被多用戶訪問,而且這些用戶都用同一個數據庫,那么相比 SQLite,最好還是選擇一個功能完整的關系型數據庫MySQL。
3、PostgreSQL數據庫
PostgreSQL是一個功能非常強大的、源代碼開放的客戶/服務器關系型數據庫管理系統,以加州大學計算機系開發的POSTGRES,4.2版本為基礎發展起來的對象關系型數據庫管理系統。PostgresSQL憑借其經過驗證的架構,可靠性,數據完整性,強大的功能集,可擴展性以及軟件背后的開源社區的奉獻精神贏得了良好的聲譽,PostgreSQL被廣泛地應用到各大IT軟件系統中。
(1)PostgreSQL的優勢
PostgreSQL支持存儲過程,且有眾多的商業邏輯的存在,此時使用存儲過程可以在較少地增加數據庫服務器的負擔的前提下,對這樣的商業邏輯進行封裝,并可以利用數據庫服務器本身的內在機制對存儲過程的執行進行優化。此外存儲過程的存在也避免了在網絡上大量的原始的SQL語句的傳輸,這樣的優勢是顯而易見的。
PostgreSQL支持視圖,視圖的存在可以最大限度地利用數據庫服務器內在的優化機制。而且對于視圖權限的合理使用,事實上可以提供行級別的權限,這是MySQL和SQLite的權限系統所無法實現的
PostgreSQL支持觸發器,觸發器的存在不可避免的會影響數據庫運行的效率,但是與此同時,觸發器的存在也有利于對商業邏輯的封裝,可以減少應用程序中對同一商業邏輯的重復控制。合理地使用觸發器也有利于保證數據的完整性。
PostgreSQL支持R-trees這樣可擴展的索引類型,可以更方便地處理一些特殊數據,支持ODBC。
(2)PostgreSQL的缺點
PostgreSQL運行速度明顯低于MySQL和SQLite,因為MySQL使用了線程,而PostgreSQL使用的是進程。在不同線程之間的環境轉換和訪問公用的存儲區域顯然要比在不同的進程之間要快得多。
PostgreSQL目前仍不完全適應24×7小時運行,這是因為你必須每隔一段時間運行一次VACUUM。
PostgreSQL在權限系統上也不是很完善。PostgreSQL只支持對于每一個用戶在一個數據庫上或一個數據表上的INSERT、SELECT和UPDATE/DELETE的授權,而MySQL允許你定義一整套的不同的數據級、表級和列級的權限。
PostgreSQL生成每頁的速度要比MySQL慢,PostgreSQL還欠缺一些比較高端的數據庫管理系統需要的特性,比如對大對象的有效支持,以及查詢緩沖等提高數據庫性能的機制等。
(3)PostgreSQL的使用場景
數據完整性場景:當可靠性和數據完整性是絕對必要而無需理由時,PostgreSQL是更好的選擇。
復雜的自定義過程場景:如果你需要你的數據庫執行自定義過程,可擴展的PostgreSQL是更好的選擇。
整合遷移場景:在將來,如果可能要把整個數據庫系統遷移到另一個適當的解決方案(例如Oracle)中,PostgreSQL對于這種切換將是最兼容和易于操作的。
復雜的設計場景:相比其他的開源和免費的關系數據庫管理系統實現來說,對于復雜的數據庫設計,PostgreSQL提供了大部分的功能和可能性,同時并沒放棄其他有價值的地方。
4、我們項目中的數據庫使用情況
就我們目前工作中接觸到的服務器平臺而言,它需要處理大量的數據信息,需要較高的安全性,以及支持多用戶并發的需求,我們采用的是MySQL數據庫,而事實上也正好驗證了我們的預期結果。
我們項目中常用的存儲陣列,則屬于嵌入式設備,對于嵌入式設備,業內常采用的就是輕量級的數據庫,而且需要頻繁直接讀/寫磁盤文件,需要進行數據遷移,但不需要擴展等因素,所以我們的陣列設備使用了采用SQLite數據庫,這也正好符合上述的結論。
5、寫在最后
沒有最好的,只有適合的!選擇一個適合的數據庫會讓你的工作事半功倍,而一個不適合的數據庫會讓你煩擾不斷,問題頻發。
在選擇數據庫之前,必須先了解清楚設備的軟硬件環境,然后根據具體的業務需求和實用場景,針對不同數據庫的優缺點,揚長避短,選擇最合適的數據庫。