一個完整的IT系統一般少不了數據庫系統的支撐,大量的數據需要保存到數據庫中。不同的數據庫在使用場景和性能上,有一定的差異。IT系統需要根據運行環境、數據量的大小以及業務需求,選擇合適的數據庫。今天我們就來講講三個常用的免費開源的關系型數據庫SQLite、MySQL和PostgreSQL,大概地了解一下這三個數據庫的差異與應用場景。
Part1 概述
數據庫可以分商業數據庫和免費數據庫,常見的商業數據庫有Microsoft SQL Server、Oracle、Sybase、DB2和Informix,普遍使用的免費數據庫則有SQLite、MySQL和PostgreSQL。商業數據庫的性能和功能強大全面,而且他們還有強大的技術團隊支持。免費開源數據庫的穩定性和性能也不遜色,有著活躍開源社區的支撐。
一些政府和銀行的項目,使用商業數據庫比較多,比如Microsoft SQL Server、Oracle、Sybase、DB2和Informix等。但對于大部分IT廠商,出于成本的考慮,會選用免費開源的數據庫,開源的數據庫也更可控。
本文我們主要來討論一下SQLite、MySQL和PostgreSQL這三個免費開源數據庫。輕量級數據庫SQLite主要用于客戶端和嵌入式設備中,存放一些輕量級的數據。MySQL和PostgreSQL主要用于服務端,存放一些大量或海量的數據。
此外,國內的一線大廠在數據庫領域進行了深入的研究和布局,在MySQL和PostgreSQL等開源數據庫的基礎上進行深度優化和創新,開發出了滿足他們大型業務系統海量數據存儲需求的新型數據庫以及應用于云計算領域的云數據庫,比如騰訊的TBase數據庫、阿里的OceanBase數據庫以及華為的GaussDB數據庫。并且這些大廠,根據自身業務系統的需求,開發出了用于不同業務場景的多種數據庫。
這些大廠之所以能將自主創新的數據庫玩起來,主要有以下幾個原因:
- 他們有雄厚的資金與人才儲備,可以投入大量的人力和資源去做深度的研究和布局;
- 他們有自家的大型業務系統(比如騰訊有微信、阿里有淘寶、華為有龐大的電信運營支撐系統,這些產品系統中深度地融入了云計算和大數據技術),為了滿足自家系統的海量數據高效存儲與查詢需求,他們必須要在現有技術的基礎上進行持續的技術創新;
- 新產品和技術應用到自家的大型業務系統之后,可以會遇到這樣或那樣的問題或瓶頸,這能持續地推動產品和技術的優化與改進。
近十年來,也誕生了很多國產數據庫廠商,比如瀚高公司的瀚高數據庫(基于開源的PostgreSQL數據庫)、達夢公司的達夢數據庫、人大金倉的Kingbase數據庫。
Part2SQLite數據庫
2.1 SQLite簡介
SQLite,是一款輕量級的關系型數據庫,是一個用C語言開發庫。它的設計目標是用于嵌入式系統中的,很多嵌入式產品中使用了它,它占用資源很低,可能只需要幾百K的內存就夠了。它支持Windows、Linux、Unix等主流的操作系統,因為它是用C語言開發的,可以和很多程序語言相結合,比如 C++、C#、PHP、Java、Python、Ruby等:
- C/C++:由于SQLite本身是C寫的,它自帶的API也是C接口的。所以C/C++用起來最直接了。假如你不喜歡面向過程的C API風格,可以另外找個C++的包裝庫。想重新發明輪子的同學,也可以自己包裝一個;
- JAVA:如果要用Java訪問SQLite,可以通過SQLite的JDBC驅動,或者通過專門的SQLite包裝庫。個人建議走JDBC方式,萬一將來要換數據庫,代碼就不用大改;
- Python:pysqlite是Python操作SQLite的首選。從Python 2.5開始,它已經被整合到Python的標準庫中。看來Python社區還是蠻喜歡SQLite嘛;
- .Net:對于喜歡dotNet的同學,可以通過SQLite的ADO.NET驅動來訪問;
- Ruby:Ruby可以通過SQLite-Ruby操作SQLite數據庫。
SQLite第一個Alpha版本誕生于2000年5月。至2023年已經接近有23個年頭,SQLite也迭代到了3.0版本。不像常見的客戶 - 服務器數據庫范例,SQLite引擎不是一個與數據庫服務器通信的獨立進程,而是直接鏈接到程序中成為程序的一部分(可以直接將.h和.c添加到目標工程中,也可以封裝成dll供目標程序調用)。
使用SQLite數據庫的方式很簡單,只需要將之集成到程序中,直接調用SQLite提供的API接口即可完成數據庫和表的創建、數據的增刪改查等操作。整個數據庫(定義、表、索引和數據本身)都是存儲在宿主主機上的一個或多個db文件。
2.2 SQLite優缺點
SQLite是完全免費開源的,是一種輕量級的數據,運行時占用很少的內存資源,只需要集成到程序中即可使用。支持多個操作系統,支持C、C++、Java和Python多種開發語言。SQLite支持大部分SQL語句和數據庫特性。
SQLite有以下的缺點:
- 并發訪問的鎖機,SQLite在并發(包括多進程和多線程)讀寫方面的性能一直不太理想。數據庫可能會被寫操作獨占,從而導致其它讀寫操作阻塞或出錯;
- SQL標準支持不全,在它的官方網站上,具體列舉了不支持哪些SQL92標準。我個人感覺比較不爽的是不支持外鍵約束;
- 有時候需要訪問其它機器上的SQLite庫文件,就會把數據庫文件放置到網絡共享目錄上。這時候你就要小心了。當SQLite文件放置于NFS時,在并發讀寫的情況下可能會出問題(比如數據損壞)。原因據說是由于某些NFS的文件鎖實現上有Bug。
2.3 SQLite應用場景
SQLite是一種輕量級的數據庫,主要用于存儲一些輕量級的數據,由于其占用的資源小,常常被用在嵌入式系統和移動設備中。SQLite無法處理大型系統中的海量數據,其實時性和性能不夠,無法滿足海量數據的高效存儲及查詢的需求。
可以在客戶端軟件中使用SQLite去存儲一些數據,比如IM聊天軟件中可以使用它來存放聊天數據,也可以使用它去存儲一些配置信息。嵌入式設備的資源有限,需要使用數據庫時,優先選擇SQLite數據庫。
有些數據我們可以直接將內存中的二進制數據以二進制流的方式直接寫到文件中,但是這種二進制數據在增刪改查時非常不方便,要重寫將更新后的二進制數據重寫覆蓋寫到文件中。使用SQLite去存儲數據,在增刪改查時會非常方便。
Part3MySQL數據庫
3.1 MySQL簡介
MySQL的第一版由瑞典公司 MySQL AB 在 1995 年發布,該公司的創始人為 David Axmark、Allan Larsson 和 Michael Widenius。MySQL 項目采用 GNU 通用公共許可 (GPL)在 2000 年作為開源發布。到 2001 年,MySQL 有超過 200 萬次的有效安裝;到 2004 年,該軟件每天的下載超過 3 萬次。
MySQL 于 2008 年被 Sun Microsystems 以10億美元收購。當 Oracle 于 2009 年收購 Sun Microsystems 時,它也獲得了 MySQL 的所有權。Oracle公司對 MySQL 軟件采用了雙授權政策,分為社區免費版和商業版。MySQL所使用的 SQL 語言是用于訪問數據庫的最常用標準化語言,因為其免費開源,目前是使用最廣泛的開源關系數據庫系統,是眾多IT廠商的第一選擇。
3.2 MySQL優缺點
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;
- 全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函數(COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、MAX()和MIN())。你可以在同一查詢中混來自不同數據庫的表;
- 所有列都有缺省值。你可以用INSERT插入一個表列的子集,那些沒用明確給定值的列設置為他們的決省值。
當然MySQL也存在一些缺陷:
- MySQL最大的缺點是其安全系統,主要是復雜而非標準,另外只有到調用mysqladmin來重讀用戶權限時才發生改變;
- MySQL的另一個主要的缺陷之一是缺乏標準的RI(Referential Integrity-RI)機制;Rl限制的缺乏(在給定字段域上的一種固定的范圍限制)可以通過大量的數據類型來補償;
- MySQL直到5.0版本才支持存儲過程,對存儲過程支持的并不是很好;
- MySQL不支持熱備份,MySQL熱備的問題主要與InnoDB存儲引擎的特性有關。InnoDB存儲引擎是MySQL默認的存儲引擎,它具有ACID特性,并且支持行鎖機制,在高并發的場景下可以提供良好的性能。然而,在實現熱備的情況下,就會暴露InnoDB存儲引擎的一些缺陷。
3.3 MySQL應用場景
MySQL用一種簡單的方式為數據訪問(和使用)提供了可靠的保護。大多數網站和Web應用程序,可以忽視約束性地簡單工作在MySQL上。另外,如果你工作在一個需要高度定制的解決方案上,可以使用MySQL的豐富配置設置和操作模式,能夠很容易地執行你的規則。如果你在開發的應用需要被多用戶訪問,而且這些用戶都用同一個數據庫,則需要選擇客戶 - 服務器模式數據庫MySQL。
Part4PostgreSQL數據庫
4.1 PostgreSQL簡介
PostgreSQL是一個功能強大的開源數據庫系統,它誕生于美國加州大學伯克利分校,PostgreSQL于1996年首次以開源軟件的形式發布。經過長達15年以上的積極開發和不斷改進,PostgreSQL已在可靠性、穩定性、數據一致性等獲得了業內極高的聲譽。
目前PostgreSQL可以運行在所有主流操作系統上,包括Linux、Unix(AIX、BSD、HP-UX、SGI IRIX、Mac OS X、Solaris和Tru64)和Windows。PostgreSQL是完全的事務安全性數據庫,完整地支持外鍵、聯合、視圖、觸發器和存儲過程(并支持多種語言開發存儲過程)。它支持了大多數的SQL:2008標準的數據類型,包括整型、數值型、布爾型、字節型、字符型、日期型、時間間隔型和時間型,它也支持存儲二進制的大對像,包括圖片、聲音和視頻。PostgreSQL對很多高級開發語言有原生的編程接口,如C/C++、Java、.Net、Perl、Python、Ruby、Tcl 和ODBC以及其他語言等,也包含各種文檔。
作為一種企業級數據庫,PostgreSQL以它所具有的各種高級功能而自豪,像多版本并發控制(MVCC)、按時間點恢復(PITR)、表空間、異步復制、嵌套事務、在線熱備、復雜查詢的規劃和優化以及為容錯而進行的預寫日志等。它支持國際字符集、多字節編碼并支持使用當地語言進行排序、大小寫處理和格式化等操作。它也在所能管理的大數據量和所允許的大用戶量并發訪問時間具有完全的高伸縮性。目前已有很多PostgreSQL的系統在實際生產環境下管理著超過4TB的數據。由于PostgreSQL的優異性能,它已贏得最終用戶和業內的多次大獎,包括Linux新媒體(Linux New Media)的最佳數據庫獎和5次Linux期刊編輯選出的最佳數據庫獎。
最重要的一點,PostgreSQL的源代碼可以自由獲取,它的授權是在非常自由的開源授權下,這種授權允許用戶在各種開源或是閉源項目中使用、修改和發布PostgreSQL的源代碼。用戶對源代碼的可以按用戶意愿進行任何修改、改進。 因此,PostgreSQL不僅是一個強大的企業級數據庫系統,也是一個用戶可以開發私用、網絡和商業軟件產品的數據庫開發平臺。
4.2 PostgreSQL優勢
PostgreSQL 提供了豐富的核心功能,使其成為廣泛使用的數據庫解決方案。以下是幾個重要的核心功能:
- 高級查詢功能:PostgreSQL 支持復雜的 SQL 查詢,包括連接、子查詢、聚合函數、窗口函數等。同時它還支持全文搜索、地理空間數據處理和圖形數據分析等擴展功能;
- 完整性約束:PostgreSQL 允許定義各種完整性約束,例如主鍵、唯一約束、外鍵和檢查約束,以保證數據的完整性和一致性;
- 觸發器和存儲過程:PostgreSQL 支持觸發器和存儲過程,允許在插入、更新或刪除數據時執行自定義的業務邏輯;
- 并發控制:借助多版本并發控制(MVCC)技術,PostgreSQL 實現了高度并發的讀寫操作,避免數據鎖定和讀寫沖突;
- 復制和高可用性:PostgreSQL 支持數據復制和流復制,可以創建熱備份和實現高可用性架構;
- 擴展性:通過提供擴展機制,用戶可以自定義和使用各種插件和擴展,從而增強 PostgreSQL 的功能。
4.3 PostgreSQL應用場景
如果你需要你的數據庫執行一些定制操作,靈活可擴展的PostgreSQL是更好的選擇。如果可能要把整個數據庫系統遷移到另一個數據庫系統(例如Oracle)中,PostgreSQL對于這種切換將是最兼容和易于操作的。PostgreSQL是完全開源的,不受任何商業公司的控制,與受甲骨文控制的MySQL相比,PostgreSQL更加值得信賴。比如在國產化系統中,為了安全起見,會優先選擇更加自主可控的PostgreSQL。
Part5在實際系統中的選擇
就我們接觸到的實際系統而言,需要處理大量的數據信息,需要較高的安全性,以及支持多用戶并發,可以選擇MySQL或PostgreSQL。在嵌入式設備和移動設備中,業內使用的都是輕量級數據庫SQLite,實際運行時需要頻繁直接讀/寫磁盤文件。在國產化的系統中,為了實現完全的自主可控,會選擇完全開源且不受商業控制的PostgreSQL。
-
數據庫
+關注
關注
7文章
3799瀏覽量
64389 -
MySQL
+關注
關注
1文章
809瀏覽量
26569 -
SQlite
+關注
關注
0文章
78瀏覽量
15945 -
postgresql
+關注
關注
0文章
21瀏覽量
220
發布評論請先 登錄
相關推薦
評論