目录
1、概述
2、SQLite数据库
2.1、SQLite简介
2.2、SQLite优缺点
2.3、SQLite应用场景
3、MySQL数据库
3.1、MySQL简介
3.2、MySQL优缺点
3.3、MySQL应用场景
4、PostgreSQL数据库
4.1、PostgreSQL简介
4.2、PostgreSQL优势
4.3、PostgreSQL应用场景
5、在实际系统中的选择
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)/chenlycly/category_11931267.html 一个完整的IT系统一般少不了数据库系统的支撑,大量的数据需要保存到数据库中。不同的数据库在使用场景和性能上,有一定的差异。IT系统需要根据运行环境、数据量的大小以及业务需求,选择合适的数据库。今天我们就来讲讲三个常用的免费开源的关系型数据库SQLite、MySQL和PostgreSQL,大概地了解一下这三个数据库的差异与应用场景。
1、概述
数据库可以分商业数据库和免费数据库,常见的商业数据库有Microsoft SQL Server、Oracle、Sybase、DB2和Informix,普遍使用的免费数据库则有SQLite、MySQL和PostgreSQL。商业数据库的性能和功能强大全面,而且他们还有强大的技术团队支持。免费开源数据库的稳定性和性能也不逊色,有着活跃开源社区的支撑。
一些政府和银行的项目,使用商业数据库比较多,比如Microsoft SQL Server、Oracle、Sybase、DB2和Informix等。但对于大部分IT厂商,出于成本的考虑,会选用免费开源的数据库,开源的数据库也更可控。
本文我们主要来讨论一下SQLite、MySQL和PostgreSQL这三个免费开源数据库。轻量级数据库SQLite主要用于客户端和嵌入式设备中,存放一些轻量级的数据。MySQL和PostgreSQL主要用于服务端,存放一些大量或海量的数据。
此外,国内的一线大厂在数据库领域进行了深入的研究和布局,在MySQL和PostgreSQL等开源数据库的基础上进行深度优化和创新,开发出了满足他们大型业务系统海量数据存储需求的新型数据库以及应用于云计算领域的云数据库,比如腾讯的TBase数据库、阿里的OceanBase数据库以及华为的GaussDB数据库。并且这些大厂,根据自身业务系统的需求,开发出了用于不同业务场景的多种数据库。
这些大厂之所以能将自主创新的数据库玩起来,主要有以下几个原因:
1)他们有雄厚的资金与人才储备,可以投入大量的人力和资源去做深度的研究和布局;
2)他们有自家的大型业务系统(比如腾讯有微信、阿里有淘宝、华为有庞大的电信运营支撑系统,这些产品系统中深度地融入了云计算和大数据技术),为了满足自家系统的海量数据高效存储与查询需求,他们必须要在现有技术的基础上进行持续的技术创新;
3)新产品和技术应用到自家的大型业务系统之后,可以会遇到这样或那样的问题或瓶颈,这能持续地推动产品和技术的优化与改进。
近十年来,也诞生了很多国产数据库厂商,比如瀚高公司的瀚高数据库(基于开源的PostgreSQL数据库)、达梦公司的达梦数据库、人大金仓的Kingbase数据库。
2、SQLite数据库
2.1、SQLite简介
SQLite,是一款轻量级的关系型数据库,是一个用C语言开发库。它的设计目标是用于嵌入式系统中的,很多嵌入式产品中使用了它,它占用资源很低,可能只需要几百K的内存就够了。它支持Windows、Linux、Unix等主流的操作系统,因为它是用C语言开发的,可以和很多程序语言相结合,比如 C++、C#、PHP、Java、Python、Ruby等:
1)C/C++
由于SQLite本身是C写的,它自带的API也是C接口的。所以C/C++用起来最直接了。假如你不喜欢面向过程的C API风格,可以另外找个C++的包装库。想重新发明轮子的同学,也可以自己包装一个。
2)Java
如果要用Java访问SQLite,可以通过SQLite的JDBC驱动,或者通过专门的SQLite包装库。个人建议走JDBC方式,万一将来要换数据库,代码就不用大改。
3)Python
pysqlite是Python操作SQLite的首选。从Python 2.5开始,它已经被整合到Python的标准库中。看来Python社区还是蛮喜欢SQLite嘛。
4).Net
对于喜欢dotNet的同学,可以通过SQLite的驱动来访问。
5)Ruby
Ruby可以通过SQLite-Ruby操作SQLite数据库。
SQLite第一个Alpha版本诞生于2000年5月。 至已经接近有23个年头,SQLite也迭代到了3.0版本。不像常见的客户 - 服务器数据库范例,SQLite引擎不是一个与数据库服务器通信的独立进程,而是直接链接到程序中成为程序的一部分(可以直接将.h和.c添加到目标工程中,也可以封装成dll供目标程序调用)。
使用SQLite数据库的方式很简单,只需要将之集成到程序中,直接调用SQLite提供的API接口即可完成数据库和表的创建、数据的增删改查等操作。整个数据库(定义、表、索引和数据本身)都是存储在宿主主机上的一个或多个db文件。关于如何调用SQLite库提供的API函数,可以参见之前写的文章:
轻量级数据库SQLite的API接口说明/chenlycly/article/details/123482588
2.2、SQLite优缺点
SQLite是完全免费开源的,是一种轻量级的数据,运行时占用很少的内存资源,只需要集成到程序中即可使用。支持多个操作系统,支持C、C++、Java和Python多种开发语言。SQLite支持大部分SQL语句和数据库特性。
SQLite有以下的缺点:
1)并发访问的锁机,SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。
2)SQL标准支持不全,在它的官方网站上,具体列举了不支持哪些SQL92标准。我个人感觉比较不爽的是不支持外键约束。
3)有时候需要访问其它机器上的SQLite库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏)。原因据说是由于某些NFS的文件锁实现上有Bug。
2.3、SQLite应用场景
SQLite是一种轻量级的数据库,主要用于存储一些轻量级的数据,由于其占用的资源小,常常被用在嵌入式系统和移动设备中。SQLite无法处理大型系统中的海量数据,其实时性和性能不够,无法满足海量数据的高效存储及查询的需求。
可以在客户端软件中使用SQLite去存储一些数据,比如IM聊天软件中可以使用他来存放聊天数据,也可以使用它去存储一些配置信息。嵌入式设备的资源有限,需要使用数据库时,优先选择SQLite数据库。
有些数据我们可以直接将内存中的二进制数据以二进制流的方式直接写到文件中,但是这种二进制数据在增删改查时非常不方便,要重写将更新后的二进制数据重写覆盖写到文件中。使用SQLite去存储数据,在增删改查时会非常方便。
3、MySQL数据库
3.1、MySQL简介
MySQL的第一版由瑞典公司 MySQL AB 在 1995 年发布,该公司的创始人为 David Axmark、Allan Larsson 和 Michael Widenius。MySQL 项目采用 GNU 通用公共许可 (GPL)在 2000 年作为开源发布。到 2001 年,MySQL 有超过 200 万次的有效安装;到 年,该软件每天的下载超过 3 万次。
MySQL 于 年被 Sun Microsystems 以10亿美元收购。当 Oracle 于 年收购 Sun Microsystems 时,它也获得了 MySQL 的所有权。Oracle公司对 MySQL 软件采用了双授权政策,分为社区免费版和商业版。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言,因为其免费开源,目前是使用最广泛的开源关系数据库系统,是众多IT厂商的第一选择。
3.2、MySQL优缺点
MySQL主要有以下几点优势:
1)它使用的核心线程是完全多线程,速度快并支持多处理器。
2)有多种列类型:1、2、3、4、和8字节长度自有符号/无符号整数、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、和ENUM类型。
3)它通过一个高度优化的类库实现SQL函数库并像他们能达到的一样快速,通常在查询初始化后不该有任何内存分配。没有内存漏洞。
4)支持ANSI SQL的LEFT 0UTER JOIN和ODBC。
5)MySQL可以工作在不同的平台上。支持C、C++、Java、Perl、PHP、Python和TCL API。
6)全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函数(COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、MAX()和MIN())。你可以在同一查询中混来自不同数据库的表。
7)所有列都有缺省值。你可以用INSERT插入一个表列的子集,那些没用明确给定值的列设置为他们的决省值。
当然MySQL也存在一些缺陷:
1)MySQL最大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变。
2)MySQL的另一个主要的缺陷之一是缺乏标准的RI(Referential Integrity-RI)机制;Rl限制的缺乏(在给定字段域上的一种固定的范围限制)可以通过大量的数据类型来补偿。
3)MySQL直到5.0版本才支持存储过程,对存储过程支持的并不是很好。
4)MySQL不支持热备份,MySQL热备的问题主要与InnoDB存储引擎的特性有关。InnoDB存储引擎是MySQL默认的存储引擎,它具有ACID特性,并且支持行锁机制,在高并发的场景下可以提供良好的性能。然而,在实现热备的情况下,就会暴露InnoDB存储引擎的一些缺陷。
3.3、MySQL应用场景
MySQL用一种简单的方式为数据访问(和使用)提供了可靠的保护。大多数网站和Web应用程序,可以忽视约束性地简单工作在MySQL上。另外,如果你工作在一个需要高度定制的解决方案上,可以使用MySQL的丰富配置设置和操作模式,能够很容易地执行你的规则。如果你在开发的应用需要被多用户访问,而且这些用户都用同一个数据库,则需要选择客户 - 服务器模式数据库MySQL。
4、PostgreSQL数据库
4.1、PostgreSQL简介
PostgreSQL是一个功能强大的开源数据库系统,它诞生于美国加州大学伯克利分校,PostgreSQL于1996年首次以开源软件的形式发布。经过长达以上的积极开发和不断改进,PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。
目前PostgreSQL可以运行在所有主流操作系统上,包括Linux、Unix(AIX、BSD、HP-UX、SGI IRIX、Mac OS X、Solaris和Tru64)和Windows。PostgreSQL是完全的事务安全性数据库,完整地支持外键、联合、视图、触发器和存储过程(并支持多种语言开发存储过程)。它支持了大多数的SQL:标准的数据类型,包括整型、数值型、布尔型、字节型、字符型、日期型、时间间隔型和时间型,它也支持存储二进制的大对像,包括图片、声音和视频。PostgreSQL对很多高级开发语言有原生的编程接口,如C/C++、Java、.Net、Perl、Python、Ruby、Tcl 和ODBC以及其他语言等,也包含各种文档。
作为一种企业级数据库,PostgreSQL以它所具有的各种高级功能而自豪,像多版本并发控制(MVCC)、按时间点恢复(PITR)、表空间、异步复制、嵌套事务、在线热备、复杂查询的规划和优化以及为容错而进行的预写日志等。它支持国际字符集、多字节编码并支持使用当地语言进行排序、大小写处理和格式化等操作。它也在所能管理的大数据量和所允许的大用户量并发访问时间具有完全的高伸缩性。目前已有很多PostgreSQL的系统在实际生产环境下管理着超过4TB的数据。由于PostgreSQL的优异性能,它已赢得最终用户和业内的多次大奖,包括Linux新媒体(Linux New Media)的最佳数据库奖和5次Linux期刊编辑选出的最佳数据库奖。
最重要的一点,PostgreSQL的源代码可以自由获取,它的授权是在非常自由的开源授权下,这种授权允许用户在各种开源或是闭源项目中使用、修改和发布PostgreSQL的源代码。用户对源代码的可以按用户意愿进行任何修改、改进。因此,PostgreSQL不仅是一个强大的企业级数据库系统,也是一个用户可以开发私用、网络和商业软件产品的数据库开发平台。
4.2、PostgreSQL优势
PostgreSQL 提供了丰富的核心功能,使其成为广泛使用的数据库解决方案。以下是几个重要的核心功能:
高级查询功能:PostgreSQL 支持复杂的 SQL 查询,包括联接、子查询、聚合函数、窗口函数等。同时它还支持全文搜索、地理空间数据处理和图形数据分析等扩展功能。完整性约束:PostgreSQL 允许定义各种完整性约束,例如主键、唯一约束、外键和检查约束,以保证数据的完整性和一致性。触发器和存储过程:PostgreSQL 支持触发器和存储过程,允许在插入、更新或删除数据时执行自定义的业务逻辑。并发控制:借助多版本并发控制(MVCC)技术,PostgreSQL 实现了高度并发的读写操作,避免数据锁定和读写冲突。复制和高可用性:PostgreSQL 支持数据复制和流复制,可以创建热备份和实现高可用性架构。扩展性:通过提供扩展机制,用户可以自定义和使用各种插件和扩展,从而增强 PostgreSQL 的功能。
4.3、PostgreSQL应用场景
如果你需要你的数据库执行一些定制操作,灵活可扩展的PostgreSQL是更好的选择。如果可能要把整个数据库系统迁移到另一个数据库系统(例如Oracle)中,PostgreSQL对于这种切换将是最兼容和易于操作的。PostgreSQL是完全开源的,不受任何商业公司的控制,与受甲骨文控制的MySQL相比,PostgreSQL更加值得信赖。比如在国产化系统中,为了安全起见,会优先选择更加自主可控的PostgreSQL。
5、在实际系统中的选择
就我们接触到的实际系统而言,需要处理大量的数据信息,需要较高的安全性,以及支持多用户并发,可以选择MySQL或PostgreSQL。在嵌入式设备和移动设备中,业内使用的都是轻量级数据库SQLite,实际运行时需要频繁直接读/写磁盘文件。在国产化的系统中,为了实现完全的自主可控,会选择完全开源且不受商业控制的PostgreSQL。