linux是一款免费开源的操作系统,由于其自由、开放、安全、稳定等诸多特点,已被各大IT公司广泛地应用于服务器和嵌入式设备中。
由于数据存储的需要,Linux操作系统需要搭配一套性能优良的数据库才能很好的满足业务需求,但是Linux系统下可用的数据库种类繁多,功能和性能也是各有千秋,往往我们需要根据业务场景来灵活的选择要使用的数据库。
但有时因为缺乏经验,选择了不合适的数据库,导致业务运转过程中出现了许多问题和瓶颈,比如后台系统需要进行大量且频繁的并发读写操作,但选择了MySQL,导致使用过程中出现了许多不可避免的读写错误;再比如很多嵌入式系统需要支持多用户,却选择了SQLite,虽说SQLite小巧轻便,迁移性好,很适合嵌入式系统,但是他并不支持多用户管理。所以如何选择一套适合的数据库就是我们所面临的一道难题。
当下Linux系统中常用的数据库包括两大类,一是商业型数据库,比如Oracle、Sybase、DB2、Informix、SQL Server等;二是开源免费的数据库,比如MySQL、PostgreSQL、SQLite等。商业数据库的功能与性能自不必多说,它们背后还有强大的技术团队的支持,此处我们要讲的是几种常用的开源免费数据库。本文根据我们的日常开发经验,简单的对MySQL、PostgreSQL、SQLite进行比较,给大家提供一个参考。
1、SQLite数据库
SQLite是一款轻量级的关系型数据库,它是用C语言实现的。它是供嵌入式使用的,已广泛地应用到各个嵌入式系统中。它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
SQLite能够支持windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 C++、C#、php、JAVA等,和Mysql、PostgreSQL这两款开源的世界著名数据库管理系统相比,它的处理速度比他们都快。
(1)SQLite的优势
它的第一个特色是轻量级。SQLite的作者很看重这个特性,连它的Logo都是用的“羽毛”,来显摆它的轻飘飘。和客户端/服务器模式的数据库又说不同,SQLite是本地数据库,他是进程内的数据库引擎。使用SQLite室只需要带上它的一个动态 库,就可以享受它的全部功能,并且这个动态库的尺寸也挺小。
SQLite的另外一个特点是绿色。它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”,只需要引入动态库即可,所以在部署的时候能够省去不少麻烦。
跨平台/可移植性,如果光支持主流操作系统,那就没啥好吹嘘的了。除了主流操作系统,SQLite还支持了很多冷门的操作系统。尤其是它对很多嵌入式系统支持的非常好,比如Android、Windows Mobile、Symbin、Palm、VxWorks等。
SQLite使用的是Public Domain协议,这是最爽一种,可以放心大胆地用,毫无限制的使用。
(2)SQLite的缺点
SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。
SQLite对SQL标准支持不全,在它的官方网站上,具体列举了不支持哪些SQL92标准。特别是不支持外键的约束.
有时候需要访问其它机器上的SQLite库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏),原因是由于某些NFS网络文件系统的文件锁在实现上是有Bug的。
(3)使用场景
一是嵌入式应用场景,所有需要迁移性,不需要扩展的应用,例如,单用户的本地应用,移动应用和游戏。
二是代替磁盘访问的场景,在很多情况下,需要频繁直接读/写磁盘文件的应用,都很适合转为使用 SQLite ,可以得益于 SQLite 使用 SQL 带来的功能性和简洁性。
2、MySQL数据库
MySQL是最流行的关系型数据库管理系统,是最好的关系数据库管理系统应用软件之一。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL由于其体积小、速度快、免费开源,被IT公司广泛的采用。
(1)MySQL的优势
它使用的核心线程是完全多线程,速度快并支持多处理器。有多种列类型:1、2、3、4、和8字节长度自有符号/无符号整数、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、和ENUM类型。
它通过一个高度优化的类库实现SQL函数库并像他们能达到的一样快速,通常在查询初始化后不该有任何内存分配。没有内存漏洞,支持ANSI SQL的LEFT 0UTER JOIN和ODBC。
MySQL可以工作在不同的平台上。支持C、C++、Java、Perl、PHP、Python和TCL API。
MySQL全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函数(COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、MAX()和MIN())。你可以在同一查询中混来自不同数据库的表。所有列都有缺省值。你可以用INSERT插入一个表列的子集,那些没用明确给定值的列设置为他们的决省值。
(2)MySQL的缺点
MySQL最大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变。
MySQL的另一个主要的缺陷之一是缺乏标准的RI(Referential Integrity-RI)机制;Rl限制的缺乏(在给定字段域上的一种固定的范围限制)可以通过大量的数据类型来补偿。 MySQL没有一种存储过程(Stored Procedure)语言,这是对习惯于企业级数据库的程序员的最大限制。
(3)MySQL的使用场景
分布式操作场景:当你需要的比SQLite可以提供的更多时,把MySQL包括进你的部署栈,就像任何一个独立的数据库服务器,会带来大量的操作自由和一些先进的功能。
高安全性场景:MySQL的安全功能,用一种简单的方式为数据访问(和使用)提供了可靠的保护。
Web网站和Web应用场景:绝大多数的网站(和Web应用程序)可以忽视约束性地简单工作在MySQL上。这种灵活的和可扩展的工具是易于使用和易于管理的——这被证明非常有助于长期运行。
定制解决方案场景:如果你工作在一个高度量身定制的解决方案上,MySQL能够很容易地尾随和执行你的规则,这要感谢其丰富的配置设置和操作模式。
多用户应用场景:如果你在开发的应用需要被多用户访问,而且这些用户都用同一个数据库,那么相比 SQLite,最好还是选择一个功能完整的关系型数据库MySQL。
3、PostgreSQL数据库
PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统,以加州大学计算机系开发的POSTGRES,4.2版本为基础发展起来的对象关系型数据库管理系统。PostgresSQL凭借其经过验证的架构,可靠性,数据完整性,强大的功能集,可扩展性以及软件背后的开源社区的奉献精神赢得了良好的声誉,PostgreSQL被广泛地应用到各大IT软件系统中。
(1)PostgreSQL的优势
PostgreSQL支持存储过程,且有众多的商业逻辑的存在,此时使用存储过程可以在较少地增加数据库服务器的负担的前提下,对这样的商业逻辑进行封装,并可以利用数据库服务器本身的内在机制对存储过程的执行进行优化。此外存储过程的存在也避免了在网络上大量的原始的SQL语句的传输,这样的优势是显而易见的。
PostgreSQL支持视图,视图的存在可以最大限度地利用数据库服务器内在的优化机制。而且对于视图权限的合理使用,事实上可以提供行级别的权限,这是MySQL和SQLite的权限系统所无法实现的
PostgreSQL支持触发器,触发器的存在不可避免的会影响数据库运行的效率,但是与此同时,触发器的存在也有利于对商业逻辑的封装,可以减少应用程序中对同一商业逻辑的重复控制。合理地使用触发器也有利于保证数据的完整性。
PostgreSQL支持R-trees这样可扩展的索引类型,可以更方便地处理一些特殊数据,支持ODBC。
(2)PostgreSQL的缺点
PostgreSQL运行速度明显低于MySQL和SQLite,因为MySQL使用了线程,而PostgreSQL使用的是进程。在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多。
PostgreSQL目前仍不完全适应24×7小时运行,这是因为你必须每隔一段时间运行一次VACUUM。
PostgreSQL在权限系统上也不是很完善。PostgreSQL只支持对于每一个用户在一个数据库上或一个数据表上的INSERT、SELECT和UPDATE/DELETE的授权,而MySQL允许你定义一整套的不同的数据级、表级和列级的权限。
PostgreSQL生成每页的速度要比MySQL慢,PostgreSQL还欠缺一些比较高端的数据库管理系统需要的特性,比如对大对象的有效支持,以及查询缓冲等提高数据库性能的机制等。
(3)PostgreSQL的使用场景
数据完整性场景:当可靠性和数据完整性是绝对必要而无需理由时,PostgreSQL是更好的选择。
复杂的自定义过程场景:如果你需要你的数据库执行自定义过程,可扩展的PostgreSQL是更好的选择。
整合迁移场景:在将来,如果可能要把整个数据库系统迁移到另一个适当的解决方案(例如Oracle)中,PostgreSQL对于这种切换将是最兼容和易于操作的。
复杂的设计场景:相比其他的开源和免费的关系数据库管理系统实现来说,对于复杂的数据库设计,PostgreSQL提供了大部分的功能和可能性,同时并没放弃其他有价值的地方。
4、我们项目中的数据库使用情况
就我们目前工作中接触到的服务器平台而言,它需要处理大量的数据信息,需要较高的安全性,以及支持多用户并发的需求,我们采用的是MySQL数据库,而事实上也正好验证了我们的预期结果。
我们项目中常用的存储阵列,则属于嵌入式设备,对于嵌入式设备,业内常采用的就是轻量级的数据库,而且需要频繁直接读/写磁盘文件,需要进行数据迁移,但不需要扩展等因素,所以我们的阵列设备使用了采用SQLite数据库,这也正好符合上述的结论。
5、写在最后
没有最好的,只有适合的!选择一个适合的数据库会让你的工作事半功倍,而一个不适合的数据库会让你烦扰不断,问题频发。
在选择数据库之前,必须先了解清楚设备的软硬件环境,然后根据具体的业务需求和实用场景,针对不同数据库的优缺点,扬长避短,选择最合适的数据库。