介紹
該關係數據模型,這在數據庫管理工具的行和列,占主導地位的表組織數據。今天,還有其他數據模型,包括NoSQL和NewSQL,但關係數據庫管理系統(RDBMS)仍然在全球範圍內存儲和管理數據。
本文比較並對比了三種最廣泛實施的開源RDBMS:SQLite,MySQL和PostgreSQL。具體來說,它將探討每個RDBMS使用的數據類型,它們的優缺點以及對其進行最佳優化的情況。
有關數據庫管理系統的一些知識
數據庫是邏輯上建模的信息或數據集群。甲數據庫管理系統(DBMS),在另一方面,是一種計算機程序,與數據庫交互。DBMS允許您控制對數據庫的訪問,寫入數據,運行查詢以及執行與數據庫管理有關的任何其他任務。儘管數據庫管理系統通常被稱為“數據庫”,但這兩個術語是不可互換的。數據庫可以是任何數據集合,而不僅僅是存儲在計算機上的數據集合,而DBMS是允許您與數據庫進行交互的軟件。
所有數據庫管理系統都有一個基礎模型,該模型構造瞭如何存儲和訪問數據。關係數據庫管理系統是採用關係數據模型的DBMS。在此模型中,數據被組織成表格,在RDBMS的上下文中,表格更正式地稱為“ 關係”。關係是一組元組或表中的行,每個元組共享一組屬性或列:
大多數關係數據庫使用結構化查詢語言(SQL)來管理和查詢數據。但是,許多RDBMS使用它們自己特定的SQL方言,這可能會有某些限制或擴展。這些擴展通常包括額外的功能,這些功能使用戶可以執行比標準SQL更為複雜的操作。
注意:在本指南中,“標準SQL”一詞多次出現。SQL標準由美國國家標準協會(ANSI),國際標準化組織(ISO)和國際電工委員會(IEC)共同維護。每當本文提到“標準SQL”或“ SQL標準”時,都是指這些機構發佈的SQL標準的當前版本。
應該注意的是,完整的SQL標準龐大而複雜:完整的SQL:2011核心合規性需要179個功能。因此,大多數RDBMS不支持整個標準,儘管有些確實比其他更接近完全合規。
每列都分配有一種數據類型,該數據類型指示該列中允許的條目類型。不同的RDBMS實現不同的數據類型,這些數據類型並不總是可以直接互換的。一些常見的數據類型包括日期,字符串,整數和布爾值。
數值數據類型既可以簽署,這意味著它們可以同時代表正數和負數,或無符號的,這意味著它們只能表示正數。例如,MySQL的tinyint數據類型可以容納8位數據,這等於256個可能的值。此數據類型的有符號範圍是-128至127,而無符號範圍是0至255。
有時,數據庫管理員會在表上施加約束,以限制可以在表中輸入哪些值。約束通常適用於一個特定的列,但是某些約束也可以適用於整個表。以下是SQL中常用的一些約束:
- UNIQUE:將此約束應用於列可確保該列中沒有兩個條目相同。
- NOT NULL:此約束可確保一列沒有任何NULL條目。
- PRIMARY KEY:的組合UNIQUE和NOT NULL,將PRIMARY KEY約束確保在列中沒有條目NULL,並且每個條目是明顯的。
- FOREIGN KEY:A FOREIGN KEY是一個表中的列,它引用PRIMARY KEY另一表的。此約束用於將兩個錶鏈接在一起:該FOREIGN KEY列的條目必須已經存在於父PRIMARY KEY列中,寫過程才能成功。
- CHECK:此約束限制了可以輸入到列中的值的範圍。例如,如果您的應用程序僅適用於阿拉斯加居民,則可以CHECK在“郵政編碼”列上添加約束,以僅允許輸入99501和99950之間的值。
- DEFAULT:這提供給定列的默認值。除非指定其他值,否則SQLite會自動輸入默認值。
- INDEX:用於幫助更快地從表中檢索數據,此約束類似於教科書中的索引:查詢不必查看錶中的每個條目,而只需查看索引列中的條目以查找所需的結果即可。
如果您想了解有關數據庫管理系統的更多信息,請查看關於理解SQL和NoSQL數據庫以及不同數據庫模型的文章。
現在,我們已經全面介紹了關係數據庫管理系統,讓我們進入本文將介紹的三個開源關係數據庫中的第一個:SQLite。
SQLite的
SQLite是一個自包含的,基於文件的,完全開源的RDBMS,即使在低內存環境中也具有可移植性,可靠性和強大的性能而聞名。即使系統崩潰或斷電,其事務也符合ACID。
在SQLite的項目的網站將其描述為一個“無服務器”數據庫。大多數關係數據庫引擎都實現為服務器進程,其中程序通過中繼請求的進程間通信與主機服務器進行通信。但是,使用SQLite,任何訪問數據庫的進程都直接從數據庫磁盤文件讀取和寫入數據庫磁盤文件。由於它消除了配置服務器進程的任何需求,因此簡化了SQLite的設置過程。同樣,使用SQLite數據庫的程序也不需要配置:它們只需要訪問磁盤即可。
SQLite是免費的開放源代碼軟件,不需要特殊許可即可使用它。但是,該項目確實提供了多個擴展,每個擴展都收取一次費用,這有助於壓縮和加密。此外,該項目還提供各種商業支持包,每個包都需支付年費。
SQLite支持的數據類型
SQLite允許將各種數據類型組織為以下存儲類:
數據類型說明null包括任何NULL值。integer有符號整數,根據值的大小存儲在1、2、3、4、6或8個字節中。real實數或浮點值,存儲為8字節浮點數。text使用數據庫編碼存儲的文本字符串,可以是UTF-8,UTF-16BE或UTF-16LE。blob任何數據塊,每個數據塊的存儲都與輸入的數據完全相同。
在SQLite的上下文中,術語“存儲類”和“數據類型”被認為是可互換的。如果您想了解有關SQLite的數據類型和SQLite類型相似性的更多信息,請查閱SQLite的官方文檔。
SQLite的優點
- 佔用空間小:顧名思義,SQLite庫非常輕巧。儘管它使用的空間因安裝的系統而異,但可以佔用不到600KiB的空間。此外,它是完全獨立的,這意味著您無需在系統上安裝任何外部依賴項即可運行SQLite。
- 用戶友好:SQLite有時被描述為“零配置”數據庫,可以直接使用。SQLite不會作為服務器進程運行,這意味著它永遠都不需要停止,啟動或重新啟動,也不需要任何需要管理的配置文件。這些功能有助於簡化從安裝SQLite到將其與應用程序集成的路徑。
- 可移植:與通常將數據存儲為一大批單獨文件的其他數據庫管理系統不同,整個SQLite數據庫存儲在單個文件中。該文件可以位於目錄層次結構中的任何位置,並且可以通過可移動媒體或文件傳輸協議共享。
SQLite的缺點
- 有限的併發性:儘管多個進程可以同時訪問和查詢SQLite數據庫,但是在任何給定時間只有一個進程可以對數據庫進行更改。這意味著與大多數其他嵌入式數據庫管理系統相比,SQLite支持更大的併發性,但是不如MySQL或PostgreSQL這樣的客戶端/服務器RDBMS。
- 沒有用戶管理:數據庫系統通常帶有對用戶的支持,或具有對數據庫和表的預定義訪問權限的託管連接。由於SQLite直接讀取和寫入普通磁盤文件,因此唯一適用的訪問權限是基礎操作系統的典型訪問權限。對於需要多個具有特殊訪問權限的用戶的應用程序,這使SQLite成為糟糕的選擇。
- 安全性 :在某些情況下,使用服務器的數據庫引擎比無服務器的數據庫(如SQLite)可以更好地保護客戶端應用程序中的錯誤。例如,客戶端中的雜散指針不能破壞服務器上的內存。而且,由於服務器是單個持久性進程,因此與無服務器的數據庫相比,客戶端-服務器的數據庫可以更精確地控制數據訪問,從而實現更細粒度的鎖定和更好的併發性。
何時使用SQLite
- 嵌入式應用程序:對於需要可移植性且不需要將來擴展的應用程序,SQLite是數據庫的絕佳選擇。示例包括單用戶本地應用程序和移動應用程序或遊戲。
- 磁盤訪問替換:在應用程序需要直接將文件讀寫磁盤的情況下,使用SQLite可以獲得使用SQL帶來的附加功能和簡便性,這將是有益的。
- 測試:對於許多應用程序,使用使用附加服務器進程的DBMS來測試其功能可能是過大的。SQLite具有內存模式,可用於快速運行測試,而無需實際的數據庫操作,因此使其成為測試的理想選擇。
何時不使用SQLite
- 處理大量數據:只要磁盤驅動器和文件系統也支持數據庫的大小要求,SQLite就可以在技術上支持最大140TB的數據庫。但是,SQLite網站建議將任何接近1TB的數據庫都存儲在集中式客戶端服務器數據庫中,因為這樣規模或更大的SQLite數據庫將難以管理。
- 高寫入量:SQLite在任何給定時間僅允許進行一次寫入操作,這極大地限制了其吞吐量。如果您的應用程序需要大量寫入操作或多個併發寫入器,則SQLite可能不足以滿足您的需求。
- 需要網絡訪問:由於SQLite是無服務器數據庫,因此它不提供對其數據的直接網絡訪問。此訪問權限內置於應用程序中,因此,如果SQLite中的數據與應用程序位於不同的計算機上,則它將需要跨網絡的高帶寬引擎到磁盤鏈接。這是一種昂貴,效率低下的解決方案,在這種情況下,客戶端服務器DBMS可能是更好的選擇。
的MySQL
根據DB-Engines排名,自該站點於2012年開始跟蹤數據庫的流行以來,MySQL一直是最受歡迎的開源RDBMS。它是功能豐富的產品,可為許多世界上最大的網站和應用程序提供支持,包括Twitter,Facebook ,Netflix和Spotify。MySQL的入門相對簡單,這在很大程度上要歸功於其詳盡的文檔和龐大的開發人員社區,以及在線上與MySQL相關的豐富資源。
MySQL是為提高速度和可靠性而設計的,但要以完全遵守標準SQL為代價。MySQL開發人員不斷努力以更嚴格地遵守標準SQL,但仍落後於其他SQL實現。但是,它確實帶有各種SQL模式和擴展,使其更接近法規遵從性。與使用SQLite的應用程序不同,使用MySQL數據庫的應用程序通過單獨的守護進程訪問它。由於服務器進程位於數據庫和其他應用程序之間,因此它可以更好地控制誰可以訪問數據庫。
MySQL啟發了許多第三方應用程序,工具和集成庫,這些擴展了其功能並使其更易於使用。這些第三方工具中使用更廣泛的一些是phpMyAdmin,DBeaver和HeidiSQL。
MySQL支持的數據類型
MySQL的數據類型可以分為三大類:數字類型,日期和時間類型以及字符串類型。
數值類型 :
數據類型說明tinyint一個非常小的整數。此數字數據類型的有符號範圍是-128到127,而無符號範圍是0到255。smallint一個小整數。此數字類型的有符號範圍是-32768到32767,而無符號範圍是0到65535。mediumint中型整數。此數字數據類型的有符號範圍是-8388608至8388607,而無符號範圍是0至16777215。int 要麼 integer普通大小的整數。此數字數據類型的有符號範圍是-2147483648至2147483647,而無符號範圍是0至4294967295。bigint一個大整數。此數字數據類型的帶符號範圍是-9223372036854775808至9223372036854775807,而無符號範圍是0至18446744073709551615。float一個小的(單精度)浮點數。double,double precision或real普通大小(雙精度)浮點數。dec,decimal,fixed,或者numeric壓縮的定點數。創建該列時,將定義此數據類型的條目的顯示長度,並且每個條目都遵循該長度。bool 要麼 boolean布爾值是一種只有兩個可能值的數據類型,通常是true或false。bit位值類型,您可以為其指定每個值的位數,從1到64。
日期和時間類型:
數據類型說明date日期,以表示YYYY-MM-DD。datetime顯示日期和時間的時間戳,顯示為YYYY-MM-DD HH:MM:SS。timestamp一個時間戳,指示自Unix時代以來的時間(1970年1月1日為00:00:00)。time一天中的時間,顯示為HH:MM:SS。year以2或4位數字格式表示的年份,默認為4位數字。
字符串類型 :
數據類型說明char定長字符串;存儲時,此類型的條目將在右邊填充空格以符合指定的長度。varchar可變長度的字符串。binary與char類型相似,但是具有指定長度的二進制字節字符串,而不是非二進制字符串。varbinary與varchar類型相似,但是長度可變的二進制字節字符串而不是非二進制字符串。blob二進制字符串,最大長度為65535(2 ^ 16-1)字節的數據。tinyblob一blob列,最大長度為255(2 ^ 8-1)個字節的數據。mediumblob一blob列,最大長度為16777215(2 ^ 24-1)個字節的數據。longblob一blob列,最大長度為4294967295(2 ^ 32-1)字節數據。text一個字符串,最大長度為65535(2 ^ 16-1)個字符。tinytext一text列,最大長度為255(2 ^ 8-1)個字符。mediumtext一text列,最大長度為16777215(2 ^ 24-1)個字符。longtext一text列,最大長度為4294967295(2 ^ 32-1)個字符。enum枚舉,它是一個字符串對象,它從創建表時聲明的值列表中獲取單個值。set與枚舉類似,字符串對象可以具有零個或多個值,每個值都必須從創建表時指定的允許值列表中選擇。
MySQL的優點
- 受歡迎程度和易用性:作為世界上最流行的數據庫系統之一,擁有使用MySQL經驗的數據庫管理員並不乏。同樣,關於如何安裝和管理MySQL數據庫,還有大量印刷和在線文檔,以及許多旨在簡化數據庫入門過程的第三方工具,例如phpMyAdmin。
- 安全性:MySQL隨附了一個腳本,該腳本可通過設置安裝的密碼安全級別,為root用戶定義密碼,刪除匿名帳戶以及刪除默認情況下可訪問的測試數據庫來幫助您提高數據庫的安全性所有用戶。另外,與SQLite不同,MySQL確實支持用戶管理,並允許您逐個用戶授予訪問權限。
- 速度:通過選擇不實現SQL的某些功能,MySQL開發人員可以優先考慮速度。儘管最近的基準測試表明,其他PostgreSQL之類的RDBMS在速度方面可以與MySQL匹敵,或者至少接近MySQL,但MySQL仍然享有極快的數據庫解決方案聲譽。
- 複製:MySQL支持許多不同類型的複製,這是在兩個或多個主機之間共享信息的實踐,以幫助提高可靠性,可用性和容錯能力。這對於設置數據庫備份解決方案或橫向擴展數據庫很有幫助。
MySQL的缺點
- 已知侷限性:由於MySQL是為了提高速度和易用性而不是完全符合SQL的要求而設計的,因此它具有某些功能侷限性。例如,它不支持FULL JOIN子句。
- 許可和專有功能:MySQL是雙重許可的軟件,具有根據GPLv2許可的免費開源社區版本,以及根據專有許可發行的若干付費商業版本。因此,某些功能和插件僅適用於專有版本。
- 發展緩慢:自從MySQL項目於2008年被Sun Microsystems收購,然後在2009年被Oracle Corporation收購後,用戶抱怨DBMS的開發過程已經大大減慢了,因為社區不再擁有代理機構快速應對問題並實施更改。
何時使用MySQL
- 分佈式操作:MySQL的複製支持使其成為分佈式數據庫設置(例如主從或主從體系結構)的理想選擇。
- 網站和Web應用程序:MySQL在Internet上為許多網站和應用程序提供支持。這在很大程度上要歸功於安裝和設置MySQL數據庫的簡易性,以及長期來看的總體速度和可伸縮性。
- 預期的未來增長:MySQL的複製支持可以幫助促進水平擴展。另外,升級到商業MySQL產品(例如支持自動分片的另一種水平擴展過程MySQL Cluster)的過程相對簡單。
什麼時候不使用MySQL
- 必須遵守SQL:由於MySQL不會嘗試實現完整的SQL標準,因此此工具不完全符合SQL。如果對於您的用例來說,必須完全或什至幾乎完全符合SQL要求,則可能要使用更完全兼容的DBMS。
- 併發性和大數據量:儘管MySQL通常在重讀操作中表現良好,但併發讀寫可能會出現問題。如果您的應用程序將有許多用戶一次向其寫入數據,則另一個PostgreSQL之類的RDBMS可能是更好的數據庫選擇。
PostgreSQL的
PostgreSQL,也稱為Postgres,自稱為“世界上最先進的開源關係數據庫”。創建它的目的是高度可擴展並符合標準。PostgreSQL是一個對象關係數據庫,這意味著,雖然它主要是一個關係數據庫,但它還包含一些功能(例如表繼承和函數重載),這些功能通常與對象數據庫相關聯。
Postgres能夠同時有效地處理多個任務,這就是併發性。由於實現了多版本併發控制(MVCC),它可以實現無讀鎖定,從而確保其事務的原子性,一致性,隔離性和持久性,也稱為ACID遵從性。
PostgreSQL沒有像MySQL那樣被廣泛使用,但是仍然有許多第三方工具和庫旨在簡化PostgreSQL的使用,包括pgAdmin和Postbird。
PostgreSQL支持的數據類型
PostgreSQL支持數字,字符串以及日期和時間數據類型,例如MySQL。此外,它支持幾何形狀,網絡地址,位字符串,文本搜索和JSON條目的數據類型,以及幾種特有的數據類型。
數值類型:
數據類型說明bigint有符號的8字節整數。bigserial自動遞增的8字節整數。double precision一個8字節的雙精度浮點數。integer有符號的4字節整數。numeric 要麼 decimal建議在精度至關重要的情況下使用一些可選精度,例如金額。real一個4字節的單精度浮點數。smallint有符號的2個字節的整數。smallserial自動遞增的2個字節的整數。serial一個自動遞增的4字節整數。
字符類型:
數據類型說明character具有指定固定長度的字符串。character varying 要麼 varchar長度可變但長度有限的字符串。text可變長度的字符串。
日期和時間類型 :
數據類型說明date日曆日期,包括日,月和年。interval一個時間跨度。time 要麼 time without time zone一天中的時間,不包括時區。time with time zone一天中的時間,包括時區。timestamp 要麼 timestamp without time zone日期和時間,不包括時區。timestamp with time zone日期和時間,包括時區。
幾何類型:
數據類型說明box在平面上的一個矩形框。circle在飛機上的圓。line平面上的無限線。lseg平面上的線段。path在飛機上的幾何路徑。point平面上的幾何點。polygon平面上的閉合幾何路徑。
網絡地址類型:
數據類型說明cidrIPv4或IPv6網絡地址。inetIPv4或IPv6主機地址。macaddr媒體訪問控制(MAC)地址。
位字符串類型:
數據類型說明bit固定長度的位字符串。bit varying可變長度的位字符串。
文字搜索類型:
數據類型說明tsquery文本搜索查詢。tsvector文本搜索文檔。
JSON類型:
數據類型說明json文本JSON數據。jsonb分解後的二進制JSON數據。
其他數據類型:
數據類型說明boolean邏輯布爾值,代表true或false。bytea“字節數組”的縮寫,此類型用於二進制數據。money一定數量的貨幣。pg_lsnPostgreSQL日誌序列號。txid_snapshot用戶級交易ID快照。uuid通用唯一標識符。xmlXML數據。
PostgreSQL的優點
- SQL合規性:PostgreSQL比SQLite或MySQL還要嚴格遵守SQL標準。根據PostgreSQL的官方文檔,除了一長串可選功能之外,PostgreSQL還支持179種完全符合SQL:2011核心要求的功能。
- 開源和社區驅動:PostgreSQL的源代碼是一個完全開放源代碼的項目,它是由一個龐大而專門的社區開發的。同樣,Postgres社區維護並提供了許多在線資源,這些資源描述瞭如何使用DBMS,包括官方文檔,PostgreSQL Wiki和各種在線論壇。
- 可擴展 :用戶可以通過其目錄驅動的操作及其對動態加載的使用,以編程方式即時擴展PostgreSQL 。可以指定一個目標代碼文件,例如共享庫,而PostgreSQL將根據需要加載它。
PostgreSQL的缺點
- 內存性能:對於每個新的客戶端連接,PostgreSQL都會派生一個新進程。每個新進程都分配了大約10MB的內存,對於具有大量連接的數據庫而言,這可以快速增加內存。因此,對於簡單的繁重的操作,PostgreSQL通常比其他RDBMS(如MySQL)的性能要差。
- 流行度:儘管近年來使用更為廣泛,但從歷史上看,PostgreSQL在流行度方面一直落後於MySQL。其結果之一是,可以幫助管理PostgreSQL數據庫的第三方工具仍然較少。同樣,與擁有MySQL經驗的數據庫管理員相比,擁有經驗豐富的Postgres數據庫的數據庫管理員也要少得多。
何時使用PostgreSQL
- 數據完整性很重要:PostgreSQL自2001年以來就完全兼容ACID,並且實施多版本貨幣控制以確保數據保持一致,從而在數據完整性至關重要時,它成為RDBMS的強大選擇。
- 與其他工具的集成:PostgreSQL與多種編程語言和平臺兼容。這意味著,如果您需要將數據庫遷移到另一個操作系統或將其與特定工具集成,那麼使用PostgreSQL數據庫可能比使用另一個DBMS容易。
- 複雜的操作:Postgres支持可以利用多個CPU的查詢計劃,以便更快地回答查詢。加上對多個併發寫入器的強大支持,使其成為數據倉庫和在線事務處理等複雜操作的理想選擇。
何時不使用PostgreSQL
- 速度勢在必行:犧牲速度,PostgreSQL在設計時就考慮了可擴展性和兼容性。如果您的項目需要儘可能快的讀取操作,則PostgreSQL可能不是DBMS的最佳選擇。
- 簡單的設置:由於Postgres具有強大的功能集和對標準SQL的強烈支持,因此對於簡單的數據庫設置來說可能會顯得過大。對於需要速度的重讀操作,MySQL通常是更實際的選擇。
- 複雜的複製:儘管PostgreSQL確實提供了對複製的強大支持,但是它仍然是一個相對較新的功能,並且某些配置(例如主-主體系結構)只能通過擴展來實現。複製是MySQL上更為成熟的功能,許多用戶認為MySQL的複製更容易實現,特別是對於那些缺乏必要的數據庫和系統管理經驗的用戶。
結論
如今,SQLite,MySQL和PostgreSQL是世界上三種最受歡迎的開源關係數據庫管理系統。每個都有其獨特的功能和侷限性,並且在特定情況下表現出色。決定RDBMS時,有很多變量在起作用,而且選擇很少像選擇最快的一個或功能最多的一個那樣簡單。下次您需要關係數據庫解決方案時,請務必深入研究這些工具和其他工具,以找到最適合您需求的工具。
閱讀更多 crazyrico 的文章