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实现复制要更简单,除非你愿意花费时间、精力和资源。