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

Navicat for MySQL如何才能設(shè)置HTTP屬性

適用于MySQL和PostgreSQL環(huán)境的簡便數(shù)據(jù)庫開發(fā)工
多層面分析 etcd 與 PostgreSQL數(shù)據(jù)存儲方案的差異
什么是Sqlite數(shù)據(jù)庫?
SQLite和MySQL區(qū)別
MySQL遙遙領(lǐng)先PostgreSQL的原因是什么

MySQL還能跟上PostgreSQL的步伐嗎

評論