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