SQLite vs MySQL vs PostgreSQL:關係型數據庫比較

自 1970 年埃德加·科德提出關係模型之後,關係型數據庫便開始出現,經過了 40 多年的演化,如今的關係型數據庫種類繁多,功能強大,使用廣泛。面對如此之多的關係型數據庫,我們應該如何權衡找出適合自己應用場景的數據庫系統呢?O.S. Tezer 最近在 DigitalOcean 上發表了一篇博文,對比了 SQLite、MySQL 和 PostgreSQL 這三個常用的、流行的關係型數據庫管理系統(RDBMS),希望能對你有所幫助。

  O.S. Tezer 分別從數據庫支持的數據類型、優勢、劣勢、何時應該使用以及何時不應該使用該數據庫這 5 個方面對 SQLite、MySQL 和 PostgreSQL 做了比較。

  SQLite

  SQLite 是一款輕型數據庫,它遵守 ACID,能夠嵌入到使用它的應用程序中。作爲一個自包含的、基於文件的數據庫,SQLite 提供了非常出色的工具集能夠處理所有類型的數據,與託管在服務器上基於進程的關係型數據庫相比它的約束更少,也更易用。

  當應用程序使用 SQLite 時,SQLite 並非作爲一個獨立進程通過某種通信協議(例如 socket)與應用程序通信,而是作爲應用程序的一部分,應用程序通過調用 SQLite 的接口直接訪問數據文件。感謝類庫的底層技術,它讓 SQLite 變得非常快速、高效並且十分強大。

  SQLite 支持的數據類型

  SQLite 支持的數據類型包括:NULL、INTEGER、REAL、TEXT、BLOB。

  注意:如果你想了解與 SQLite 數據類型相關的更多內容,可以參閱官方文檔。

  SQLite 的優點

  基於文件

  整個數據庫完全由磁盤上的一個文件構成,這使得它的可移植性非常好。

  標準化

  儘管它看起來像一個“簡化版”的數據庫實現,但是 SQLite 確實支持 SQL。它省略了一些功能(RIGHT OUTER JOIN 和 FOR EACH STATEMENT),但同時也增加了一些額外的功能。

  非常適合開發甚至是測試

  在大多數應用程序的開發階段,大部分開發人員可能都非常需要一個能夠支持併發擴展的解決方案。SQLite 包含豐富的功能,所能提供的特性超乎開發所需,使用起來也非常簡潔——只需要一個文件和一個C鏈接庫。

  SQLite 的缺點

  沒有用戶管理

  高級數據庫都支持用戶系統,例如管理連接對數據庫和表的訪問權限。鑑於 SQLite 的目的和性質(沒有多客戶端併發的高層設計),它並不包含這些功能。

  缺少通過優化獲得額外性能的空間

  還是由於設計方面的原因,無法通過優化 SQLite 獲得大量的額外性能。這個類庫非常容易調整、也非常容易使用。它並不複雜,所以從技術上無法讓它變得更快,因爲它已經很快了。

  何時應該使用 SQLite

  嵌入式應用程序

  所有需要可移植性、不需要擴展的應用程序,例如單用戶的本地應用、移動應用或者遊戲。

  替代磁盤訪問

  在很多情況下,需要直接讀寫磁盤文件的應用程序可以切換到 SQLite 從而受益於 SQLite 提供的額外功能以及使用結構化查詢語言(SQL)所帶來的簡便性。

  測試

  對大部分應用程序而言沒必要使用額外的進程測試業務邏輯(例如應用程序的主要目標:功能)。

  何時不應該使用 SQLite

  多用戶應用程序

  如果有多個客戶端需要訪問並使用同一個數據庫,那麼最好使用功能完整的關係型數據庫(例如 MySQL),而不是選擇 SQLite。

  需要高寫入量的應用程序

  寫操作是 SQLite 的一個侷限。該 DBMS 在同一時刻僅允許一個寫操作,因而也限制了其吞吐量。

  MySQL

  MySQL 是最受歡迎的一個大規模數據庫服務器。它是一款功能豐富的開源產品,許多網站和在線應用程序都使用該數據庫。MySQL 的入門相對比較簡單,開發者可以從 Internet 上獲取到大量與該數據庫相關的信息。

  注意:鑑於該產品的受歡迎程度,使用該數據庫可以讓我們受益於大量第三方應用程序、工具以及集成類庫。

  儘管 MySQL 並沒有嘗試實現完整的 SQL 標準,但是它依然爲用戶提供了大量功能。作爲一個獨立的數據庫服務器,應用程序需要與 MySQL 守護進程通信才能訪問數據庫——不同於 SQLite。

  MySQL 支持的數據類型

  MySQL 支持的數據類型包括 TINYINT、SMALLINT、MEDIUMINT、INT 或 INTEGER、BIGINT、FLOAT、DOUBLE、DOUBLE PRECISION、REAL、DECIMAL、NUMERIC、DATE、DATETIME、TIMESTAMP、TIME、YEAR、CHAR、VARCHAR、TINYBLOB, TINYTEXT、BLOB, TEXT、MEDIUMBLOB、MEDIUMTEXT、LONGBLOB, LONGTEXT、ENUM、SET。

  MySQL 的優點

  易用

  很容易安裝。第三方工具,包括可視化工具,讓用戶能夠很容易入門。

  功能豐富

  MySQL 支持關係型數據庫應該有的大部分功能——或者直接支持、或者間接支持。

  安全

  支持很多安全特性,有些非常高級,並且是內置於 MySQL 中。

  可擴展也非常強大

  MySQL 能夠處理大量數據,並且在需要的時候可以規模化使用。

  快速

  放棄某些標準讓 MySQL 能夠非常高效、簡捷地工作,因而速度更快。

  MySQL 的缺點

  已知限制

  MySQL 從一開始就沒有打算做所有事情,因而它在功能方面有一定的侷限性,並不能滿足一些先進應用程序的要求。

  可靠性問題

  MySQL 對某些功能(例如引用、事務、審計等)的實現方式使得它與其他的關係型數據庫相比缺少了一些可靠性。

  開發停滯

  儘管 MySQL 依然是一款開源產品,但是自從它被收購之後人們就對其開發進展有很多抱怨。需要注意的是有一些基於 MySQL 的、完整集成的數據庫在標準的 MySQL 之上附加了其他價值,例如 MariaDB。

  何時應該使用 MySQL

  分佈式操作

  如果 SQLite 不能滿足你的需求,那麼將 MySQL 引入到開發棧中,就像任何其他獨立的數據庫服務器一樣,它能夠給你帶來大量的操作自由度以及一些先進的功能。

  高安全性

  MySQL 的安全機制通過一種簡單的方式爲數據的訪問和使用提供了可靠的保護。

  網站和Web應用

  儘管有一些約束,但是絕大部分網站和 Web 應用都可以簡單地運行在 MySQL 上。相關的靈活可擴展的工具非常易於使用和管理——事實證明這些工具在長期運行時非常有用。

  定製解決方案

  MySQL 有豐富的配置項和運行模式,如果你需要一個高度量身定製的解決方案,那麼 MySQL 能夠非常容易地尾隨並執行你的規則。

  何時不應該使用 MySQL

  SQL遵從性

  因爲 MySQL 並沒有打算實現完整的 SQL 標準,所以它並不完全符合 SQL。如果你可能需要與這樣的關係型數據庫集成,那麼從 MySQL 切換過去可能並不容易。

  併發性

  儘管 MySQL 和一些其他的存儲引擎能夠非常好地執行讀操作,但是併發讀寫可能會有問題。

  缺少功能

  MySQL 缺少某些功能,例如全文本搜索。

  PostgreSQL

  PostgreSQL 是一款先進的、開源的對象關係型數據庫管理系統,它的主要目標是遵從標準和可擴展。PostgreSQL,或者說 Postgres,試圖將 ANSI/ISO SQL 標準及其修正結合起來。

  與其他關係型數據庫相比,PostgreSQL 獨特的地方是它支持高度需要的、完整的面向對象以及關係型數據庫的功能,例如完全支持可靠性事務。

  由於其強大的底層技術,PostgreSQL 能夠非常高效地處理很多任務。得益於多版本併發控制(MVCC),它能夠在沒有讀鎖的情況下實現併發並保證 ACID。

  PostgreSQL 是高度可編程的,因此擴展性非常好,它支持稱爲“存儲過程”的自定義程序。用戶可以創建這種函數簡化重複的、複雜的以及經常需要的數據庫操作的執行。

  儘管該數據庫非常強大,但是它卻沒有像 MySQL 那麼流行,即便如此依然有很多優秀的第三方工具和類庫可以讓我們更容易地使用它。

  PostgreSQL 支持的數據類型

  PostgreSQL 支持的數據類型包括:bigint、bigserial、bit [(n)]、bit varying [(n)]、boolean、box、bytea、character varying [(n)]、character [(n)]、cidr、circle、date、double precision、inet、integer、interval [fields] [(p)]、line、lseg、macaddr、money、numeric [(p,s)]、path、point、polygon、real、smallint、serial、text、time、timestamp、tsquery、tsvector、txid_snapshot、uuid、xml

  PostgreSQL 的優點

  開源且遵從SQL標準

  PostgreSQL 是一款開源的、免費的、功能非常強大的關係型數據庫。

  強大的社區

  由一個忠實的、經驗豐富的社區支持,用戶可以通過知識庫和Q&A網站獲得全天候的免費服務。

  強有力的第三方支持

  除了非常先進的特性之外,PostgreSQL 還有很多優秀的、開源的第三方工具可以輔助系統的設計、管理和使用。

  可擴展

  可以通過存儲過程擴展 PostgreSQL 的功能。

  面向對象

  PostgreSQL 不僅是一個關係型數據庫,它還是一個面向對象的數據庫——支持嵌套等功能。

  PostgreSQL 的缺點

  性能:

  對於簡單繁重的讀取操作,使用 PostgreSQL 可能有點小題大做,同時性能也比 MySQL 這樣的同類產品要差。

  流行程度

  儘管有大量的部署,但是鑑於該數據庫的性質,它的受歡迎程序並不高。

  託管

  由於上面提到的幾點,很難找到提供託管 PostgreSQL 實例的主機或者服務提供商。

  何時應該使用 PostgreSQL

  數據完整性

  當絕對需要可靠性和數據完整性的時候,PostgreSQL 是更好的選擇。

  複雜的定製程序

  如果需要數據庫執行定製程序,那麼可擴展的 PostgreSQL 是更好的選擇。

  集成:

  如果將來可能需要將整個數據庫遷移到其他合適的解決方案上(例如 Oracle),那麼 PostgreSQL 可能兼容性最好也更容易切換。

  複雜的設計

  與其他開源且免費的數據庫相比,對於複雜的數據庫設計 PostgreSQL 在功能方面最全面,潛力最大,不需要你放棄其他有價值的資產。

  何時不應該使用 PostgreSQL

  速度

  如果你只需要快速讀取操作,那麼 PostgreSQL 並不合適。

  簡單

  除非你需要絕對的數據完整性,ACID 遵從性或者設計複雜,否則 PostgreSQL 對於簡單的場景而言有點多餘。

  複製

  對於缺少數據庫和系統管理經驗的人而言使用 MySQL 實現複製要更簡單,除非你願意花費時間、精力和資源。

轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章