SQLite vs MySQL vs PostgreSQL对比总结

sqlite,vs,mysql,postgresql · 浏览次数 : 0

小编点评

在开发业务系统时,RDBMS(关系型数据库)始终是一个不可或缺的组成部分。虽然近年来NoSQL数据库异军突起,但RDBMS在严谨性、稳定性和优势方面仍难以被替代。本文将为您详细介绍三种常用的RDBMS:SQLite、MySQL和PostgreSQL,以及它们在不同场景下的适用性和不适用场景。 1. SQLite SQLite是一个轻量级的、基于文件的、完全开源的RDBMS。它的优势在于占用空间小、用户友好和便携式。然而,SQLite在并发性、安全性和高写入量方面的劣势也不容忽视。适用于嵌入式应用程序、替代直接文件保存的数据以及快速运行测试的数据库。 2. MySQL MySQL是一个为了速度和可靠性而设计的、完全遵守标准SQL的RDBMS。它的优势在于普及性和易用性,以及强大的安全性和复制功能。然而,MySQL在SQL兼容性、并发性和大数据量方面的劣势也不容忽视。适用于分布式操作、各种应用程序以及未来增长较快的场景。 3. PostgreSQL PostgreSQL是一个自称为“最先进的开源关系数据库”的RDBMS,其创建目标是高度可扩展和符合标准。PostgreSQL的优势在于SQL合规性、开源和社区驱动、可扩展性以及与其他工具的集成。然而,PostgreSQL在内存性能、流行度和复杂操作方面的劣势也不容忽视。适用于数据完整性要求高、与其他工具集成以及需要处理多个并发编写器的场景。 综上所述,RDBMS在业务系统中具有重要地位,每种RDBMS都有其独特的优势和适用场景。在选择RDBMS时,需要根据项目的具体需求和特点进行权衡。

正文

开发业务系统时,是绕不开RDBMS(关系型数据库)的。
虽然现在诞生了各种NoSQL的数据库,RDBMS在业务系统中的严谨和优势依然无法取代。

近几年大大小小的项目中,常用的三种RDBMSSQLiteMySQLPostgres)都有多次接触过,
一些使用心得记录如下,供大家参考。

1. SQLite

SQLite是一个独立的、基于文件的、完全开源的RDBMS
它以可移植性、可靠性和强大的性能而闻名,即使在低内存环境中也能很好的发挥作用。

SQLite被描述为“无服务器”数据库。
大多数关系数据库引擎是作为服务器进程实现的,应用程序通过进程间通信的方式与数据库服务器进行通信。

SQLite允许任何访问数据库的进程直接读写数据库磁盘文件。
这大大简化了SQLite的使用,你可以像访问文件一样使用SQLite,几乎不需要任何配置。

1.1. 优势

它的优势总结起来有3点:占用空间小;用户友好;便携式。

占用空间小:顾名思义,SQLite库非常轻量级。它占用的空间不到600KiB。此外,它是完全自包含的,这意味着你不必在系统上安装任何外部依赖项就可以使用SQLite

用户友好SQLite开箱即用,被描述为“零配置”数据库。而且SQLite不作为服务器进程运行,这意味着它永远不需要停止、启动或重新启动,也不需要管理任何配置文件。
这些特性有助于简化SQLite与应用程序集成的过程。

便携式:与其他数据库管理系统(通常将数据存储为大量单独的文件)不同,整个SQLite数据库存储在单个文件中。
此文件可以位于目录层次结构中的任何位置,并且可以通过可移动媒体或文件传输协议共享。

1.2. 劣势

虽然轻巧好用,但是与传统数据库相比,SQLite的劣势也很明显。

有限并发:虽然多个进程可以同时访问和查询SQLite数据库,但在任何给定时间只有一个进程可以对数据库进行更改。

无用户管理:数据库系统通常支持用户,或具有预定义的数据库和表访问权限的托管连接。由于SQLite直接读写普通磁盘文件,因此唯一适用的访问权限是底层操作系统的典型访问权限。

安全:使用服务器的数据库引擎比SQLite这类无服务器数据库有更好的应用程序漏洞保护。
此外,由于服务器是单个持久进程,因此客户端-服务器的数据库可以比无服务器数据库更精确地控制数据访问,允许更细粒度的锁定和更好的并发性。

1.3. 适用的场景

SQLite适用于以下的场景:
嵌入式应用程序SQLite对于需要可移植性且不需要未来扩展的应用程序来说是绝佳选择。比如单用户本地应用、移动的应用或游戏。

替代直接用文件保存的数据:如果你的应用程序用文件来保存数据,可以尝试用SQLite来替换,可以获得使用SQL所带来的额外功能和简单性。

测试:对于许多应用程序来说,可将SQLite用于快速运行测试的数据库,这样就不需要实际数据库操作的开销,使其成为测试的理想选择。

1.4. 不适用的场景

对于以下场景,请谨慎使用SQLite
处理大量数据SQLite虽然在技术上可以支持高达140 TB的数据库,只要磁盘驱动器和文件系统也支持数据库的大小要求。
然而,SQLite建议任何接近1 TB的数据库都放在客户端-服务器的数据库上。

高写入量SQLite在任何给定时间只允许发生一次写入操作,这大大限制了其吞吐量。如果您的应用程序需要大量的写操作或多个并发编写器,SQLite可能无法满足您的需求。

需要网络访问:因为SQLite是一个无服务器数据库,它不提供对其数据的直接网络访问。
如果SQLite中的数据位于与应用程序不同的机器上,建议使用客户端-服务器的DBMS

2. MySQL

MySQL是为了速度和可靠性而设计的,完全遵守标准SQL。

与使用SQLite的应用程序不同,使用MySQL数据库的应用程序通过单独的守护进程访问它。
由于服务器进程位于数据库和其他应用程序之间,因此可以更好地控制谁可以访问数据库。

2.1. 优势

MySQL的优势主要有:
普及性和易用性:作为世界上最流行的数据库系统之一,很容易找到有MySQL工作经验的数据库管理员。
同样,有大量关于如何安装和管理MySQL数据库的在线文档。
还有许多第三方管理工具-比如phpMyAdmin

安全MySQL安装时附带了一个脚本,可以帮助您通过设置安装的密码安全级别、定义root用户的密码、删除匿名帐户以及删除默认情况下所有用户都可以访问的测试数据库来提高数据库的安全性。
另外,与SQLite不同,MySQL支持用户管理,并允许逐个用户授予不同的访问权限。

速度:MySQL开发人员优先考虑速度。虽然最近的基准测试表明,其他RDBMS(如Postgres)在速度方面可以匹配或至少接近MySQL,但MySQL仍然是一个非常快速的数据库解决方案。

复制MySQL支持许多不同类型的复制,这是在两个或多个主机上共享信息的做法,以帮助提高可靠性,可用性和容错性。
这有助于设置数据库备份解决方案或水平扩展数据库。

2.2. 劣势

MySQL的劣势主要有:
已知限制:由于MySQL是为了速度和易用性而设计的,而不是完全符合SQL,因此它具有某些功能限制。

许可和专有功能MySQL是双重许可的软件,其中一个免费和开源社区版本在GPL v2下许可,还有几个付费商业版本在专有许可下发布。

发展缓慢:自从MySQL项目在2008年被Sun Microsystems收购,后来又在2009年被Oracle公司收购以来,用户一直抱怨DBMS的开发过程显着放缓。

2.3. 适用的场景

MySQL适用于以下的场景:
分布式操作MySQL的复制支持使其成为分布式数据库设置的绝佳选择,如主次或主主架构。

各种应用程序MySQL为互联网上的许多网站和应用程序提供支持。
这在很大程度上要归功于安装和设置MySQL数据库的简单性,以及从长远来看它的整体速度和可扩展性。

未来增长比较快MySQL的复制支持可以帮助促进水平扩展。此外,升级到商业MySQL产品也比较简单。

2.4. 不适用的场景

以下场景,需谨慎使用MySQL
SQL兼容性要求高:由于MySQL不尝试实现完整的SQL标准,因此该工具并不完全符合SQL标准。如果您的用例必须完全甚至接近完全的SQL兼容性,那么您可能希望使用更完全兼容的DBMS。

并发性和大数据量:虽然MySQL通常在读操作方面表现良好,但并发读写可能会有问题。如果您的应用程序将有许多用户同时向其写入数据,那么像Postgres这样的其他RDBMS可能是更好的数据库选择。

3. Postgres

PostgreSQL,也被称为Postgres,自称为“最先进的开源关系数据库”,它的创建目标是高度可扩展和符合标准。

Postgres能够同时有效地处理多个任务,它在没有读锁的情况下实现了这一点。

3.1. 优势

Postgres的优势主要有:
SQL合规性:与SQLiteMySQL相比,PostgreSQL旨在严格遵守SQL标准。

开源和社区驱动:一个完全开源的项目,PostgreSQL的源代码是由一个大型的社区开发的。
Postgres社区维护并贡献了许多描述如何使用DBMS的在线资源,包括官方文档,PostgreSQL wiki和各种在线论坛。

可扩展性:用户可以通过编程方式扩展PostgreSQL,并通过其目录驱动操作和动态加载的使用进行动态扩展。

3.2. 劣势

Postgres的劣势主要有:
内存性能:对于每个新的客户端连接,PostgreSQL都会派生一个新的进程。每个新进程都分配了大约10MB的内存,这对于具有大量连接的数据库来说可以快速增加。
因此,对于简单的读重操作,PostgreSQL通常比其他RDBMS(如MySQL)性能差。

流行度:尽管近年来使用越来越广泛,但PostgreSQL在流行度方面一直落后于MySQL
所以,帮助管理PostgreSQL数据库的第三方工具仍然很少。类似地,具有管理Postgres数据库经验的数据库管理员并不多。

3.3. 适用的场景

Postgres适用于以下的场景:
数据完整性要求高PostgreSQL自2001年以来一直完全符合ACID,以确保数据保持一致,使其成为数据完整性至关重要的RDBMS的强有力选择。

与其他工具的集成PostgreSQL与各种编程语言和平台兼容。
如果您需要将数据库迁移到另一个操作系统或将其与特定工具集成,使用PostgreSQL数据库可能比使用其他DBMS更容易。

复杂操作Postgres可以利用多个CPU以更快的速度查询。
再加上它对多个并发编写器的强大支持,使其成为数据仓库和在线事务处理等复杂操作的绝佳选择。

3.4. 不适用的场景

以下场景,需谨慎使用Postgres
速度要求高:以速度为代价,PostgreSQL在设计时考虑了可扩展性和兼容性。如果您的项目需要尽可能快的读取操作,PostgreSQL可能不是最佳选择。

简单的设置:由于其庞大的功能集和对标准SQL的严格遵守,Postgres对于简单的数据库设置来说可能是矫枉过正的。对于需要速度的读取繁重操作,MySQL通常是更实用的选择。

复杂的复制:尽管PostgreSQL确实为复制提供了强大的支持,但它仍然是一个相对较新的特性,某些配置(如主—主架构)只能使用扩展。
复制是MySQL上一个更成熟的功能,许多用户认为MySQL的复制更容易实现,特别是对于那些缺乏必要的数据库和系统管理经验的用户。

与SQLite vs MySQL vs PostgreSQL对比总结相似的内容:

SQLite vs MySQL vs PostgreSQL对比总结

开发业务系统时,是绕不开RDBMS(关系型数据库)的。虽然现在诞生了各种NoSQL的数据库,RDBMS在业务系统中的严谨和优势依然无法取代。 近几年大大小小的项目中,常用的三种RDBMS(SQLite,MySQL,Postgres)都有多次接触过,一些使用心得记录如下,供大家参考。 1. SQLit

七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接

前言 上一章节我们引入BootstrapBlazor UI组件完成了EasySQLite后台界面的基本架子的搭建,本章节的主要内容是Blazor班级管理页面编写和接口对接。 七天.NET 8 操作 SQLite 入门到实战详细教程 第一天 SQLite 简介 第二天 在 Windows 上配置 SQ

Avalonia 使用EFCore调用SQLite实现Singleton全局注册

# Avalonia 使用EFCore调用SQLite实现Singleton全局注册 ![image-20230720204001797](https://www.raokun.top/upload/2023/07/image-20230720204001797.png) 本篇博客是我的开源项目[T

Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table: Users'.

今天使用asp.net core + sqlite 创建了一个demo项目,本地运行一切正常。可以添加,修改,删除数据。一旦发布到服务器上(Linux系统)就报错,错误信息如下: ![](https://img2023.cnblogs.com/blog/2912666/202308/2912666-

2024 CISCN WEB 部分wp

前言 第二天的revenge真是绷不住,出的很好,下次多出点revenge。 ezjava 简要介绍 sqlite jdbc...真的没想到,写文件覆盖写了半天,结果是个CVE...,给的很多东西都是幌子 原理是通过控制jdbc语句和sql语句的执行来达到加载恶意so/dll达成rce的目的,这两个

Python史上最全种类数据库操作方法,你能想到的数据库类型都在里面!甚至还有云数据库!

本文将详细探讨如何在Python中连接全种类数据库以及实现相应的CRUD(创建,读取,更新,删除)操作。我们将逐一解析连接MySQL,SQL Server,Oracle,PostgreSQL,MongoDB,SQLite,DB2,Redis,Cassandra,Microsoft Access,El

聊聊Mybatis框架原理

好久没有写博客了。最近工作中封装了一个类似ORM框架的东西。大概的原理就是将Excel数据初始化到本地sqlite数据库后,通过json配置文件,对数据库的数据做增删改查等操作。 其实大概的思考了下,就是半ORM框架mybatis的逻辑,只是我们自己封装的简陋蛮多。想想有现成的轮子没用,反而是自己写

[转帖]jmeter实现不写代码把测试结果存入execl

这里使用数据库作为中间件来实现不写代码就把测试结果存入execl,下面是步骤 1.新建一个setup线程组用来设置数据库连接信息和新建数据库,如下图所示,我们使用sqlite数据库来存储信息,因为不需要自己再去安装数据库,Database URL填写jdbc:sqlite:mytest.db,这是标

python | 连接数据库

介绍一些python中用于连接常用数据库的依赖库。 SQLite3 SQLite3是Python 中自带的数据库模块,适用于小型应用和快速原型开发。 SQLite是一个进程内的库,实现了自给自足的、无服务器的、是非常小的,是轻量级的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,不需要在系统

基于SqlSugar的开发框架循序渐进介绍(27)-- 基于MongoDB的数据库操作整合

SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架,支持多种数据库类型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等数据库,非关系型数据库的MongoDB数据库也可以作为扩展整合到开发框架里面,通过基类的继承关系很好的封装了相关的基础操作功能,极大的减少相关处理MongoDB的代码,并提供很好的开发效率。本篇随笔介绍如何在SqlSuga