一、内存数据库:FastDB、BerkeleyDB、SQLite
内存数据库, 顾名思义就是将数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。
最近要做一个项目,需要用到实时数据库,PI太贵了,想找一个免费的,实在不行就只能自己编了。找了半天,找到了FastDB、BerkeleyDB和SQLite.
FastDB是内存型数据库,据说很快,但数据库大小不能大于物理内存,不然。。。反正我看到这就走了,我可是要一秒内处理几千个数据,还要保存8小时以上的啊!
BerkeleyDB和SQLite倒没有数据库大小不能大于物理内存的限制,我对他们的性能进行了测试,结果如下:
|
Berkeley DB
|
Sqlite
|
插入10000条记录耗时
|
0.08秒
|
0.42秒
|
插入100000条记录耗时
|
2.31秒
|
3.81秒
|
插入7200000条记录耗时
|
1024.34秒
|
249秒
|
插入57600000条记录耗时
|
12860.78秒
|
2155.14秒
|
插入172800000条记录耗时
|
48039.64秒
|
6352.06秒
|
10000条记录查1记录耗时
|
少于0.01秒
|
少于0.01秒
|
100000条记录查1记录耗时
|
少于0.01秒
|
少于0.01秒
|
7200000条记录查1记录耗时
|
少于0.01秒
|
少于0.01秒
|
57600000条记录查1记录耗时
|
0.03秒
|
0.16秒
|
172800000条记录查1记录耗时
|
0.03秒
|
0.09秒
|
10000条记录数据库大小
|
0.628M
|
0.527M
|
100000条记录数据库大小
|
5.29M
|
5.32M
|
7200000条记录数据库大小
|
516M
|
405M
|
57600000条记录数据库大小
|
3087.13M
|
3925.8M
|
172800000条记录数据库大小
|
11890.7M
|
10621.2M
|
上表为两种数据库只建一个索引,Berkeley DB不支持事务、Sqlite支持事务情况下的数据,如果Berkeley DB打开事务支持,速度会下降很大的数量级,根本不能满足需求。另外在程序崩溃后Berkeley DB数据库不可用,Sqlite数据库仍可正常使用。
其实:Berkeley db不用一下子提交这么多数据,可以将大数据量分步操作, 插入100000条记录和插入10000条记录 的区别是前者插入10000条记录十次!这样算下 更省时间!
Bdb并发性方面比sqlite强,所以商业上BDB用的比较多。Android和iOS手机系统中使用sqlite
总结:1、fastdb挺快,但可惜数据库超过内存容量,插入和查询速度就会慢下来;
2、 Bdb 在并发性方面比sqlite强很多;
3、 Bdb插入和查询速度比 sqlite稍快
二、sql事务 Transaction
事务,批量插入
可以通过使用 BEGIN 命令手工开始一个事务。这种事务将会持续到下一个 COMMIT 或 ROLLBACK 命令为止。但如果数据库关闭,或者发生错误并且 ROLLBACK 冲突解决算法已指定的情况下,事务也会回滚。
COMMIT TRANSACTION 或 ROLLBACK TRANSACTION
END TRANSACTION 是 COMMIT 的一个别名
事务可以延迟执行(deferred),立即执行(immediate)或排它执行(exclusive)。 缺省的事务行为是延迟地。延迟意味着直到数据库第一次被访问之前不需要加锁。
如此,对于一个延迟的事务,BEGIN命令什么也不做。直到第一个读或写操作之前, 不需要加锁。对数据库的第一个读操作会产生一个共享锁(SHARED), 第一个写操作会加一个保持锁(RESERVED)。由于对锁的需要是延迟的, 直到确实需要为止,在当前进程执行BEGIN之后, 有可能其它的进程或线程会启动一个另外的事务并写到数据库。
如果事务是立即的,那么,执行BEGIN命令将立即在所有数据库上获得一个RESERVED锁, 而不用等待数据库被访问到。在BEGIN IMMEDIATE之后, 可以保证没有其它进程下写入数据库中执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE。 但其它进程仍可以从数据库中读数据。
一个排它的事务将在所有数据库上获得 EXCLUSIVE 锁,在该事务结束之前,没有任何其它线程或进程可以读、写数据库。
三、嵌入式数据库:SQLite,Berkeley DB,Firebird
嵌入式数据库是指运行在本机上、不用启动服务端的轻型数据库,它与应用程序紧密集成,被应用程序所启动,并伴随应用程序的退出而终止。
从这个意义上讲,似乎所有单机数据库都可以算嵌入式数据库,比如Access,Paradox,DBF等等,因为它们都不用启动数据库服务器即可使用。然而,我们通常不将上述数据库归入嵌入式数据库,而只将它们归入“桌面数据库”,甚至“文件型数据库”,因为这些数据库的完备性、存储容量及性能方面存在较大的缺陷。
嵌入式数据库支持的数据都是TB文件级别,更由于嵌入式数据库具备高性能的特点,可以预测,单机数据库的未来将是嵌入式数据库的天下。
嵌入式数据库三雄
目前,嵌入式数据库市场主要由三个产品分割:SQLite,Berkeley DB,Firebird嵌入服务器版,巧的是,这三个数据库产品都是开源软件。
SQLite 主页:http://www.sqlite.org
SQLite诞生于2000年5月,这几年增长势头迅猛无比,目前版本是3.3.8。
SQLite的特点如下:
1、无需安装配置,应用程序只需携带一个动态链接库。
2、非常小巧,For Windows 3.3.8版本的DLL文件才374KB。
3、ACID事务支持,ACID即原子性、一致性、隔离性、和持久性(Atomic、Consistent、Isolated、和 Durable)。
4、数据库文件可以在不同字节顺序的机器间自由的共享,比如可以直接从Windows移植到Linux或MAC。
5、支持数据库大小至2TB。
Berkeley DB 主页:http://www.oracle.com/database/berkeley-db/index.html
Berkeley DB是由美国Sleepycat Software公司开发的一套开放源码的嵌入式数据库的程序库,它于1991年发布,号称“为应用程序开发者提供工业级强度的数据库服务”,可谓是老牌悍将。Sleepycat现已被甲骨文(ORACLE)公司收购。
Berkeley DB的特点如下:
1、嵌入式,无需安装配置。
2、为多种编程语言提供了API接口,其中包括C、C++、Java、Perl、Tcl、Python和PHP等等。
3、轻便灵活。它可以运行于几乎所有的UNIX和Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下。
4、可伸缩。它的Database library才几百KB大小,但它能够管理规模高达256TB的数据库。它支持高并发度,成千上万个用户可同时操纵同一个数据库。
Firebird 嵌入服务器版(Embedded Server) 主页:http://www.firebirdsql.org
从Interbase开源衍生出的Firebird,充满了勃勃生机。虽然它的体积比前辈Interbase缩小了几十倍,但功能并无阉割。为了体现Firebird短小精悍的特色,开发小组在增加了超级服务器版本之后,又增加了嵌入版本,最新版本为2.0。
Firebird的嵌入版有如下特色:
1、数据库文件与Firebird网络版本完全兼容,差别仅在于连接方式不同,可以实现零成本迁移。
2、数据库文件仅受操作系统的限制,且支持将一个数据库分割成不同文件,突破了操作系统最大文件的限制,提高了IO吞吐量。
3、完全支持SQL92标准,支持大部分SQL-99标准功能。
4、丰富的开发工具支持,绝大部分基于Interbase的组件,可以直接使用于Firebird。
5、支持事务、存储过程、触发器等关系数据库的所有特性。
6、可自己编写扩展函数(UDF)。
嵌入式数据库特性对比
产品名称 SQLite Berkeley DB Firebird嵌入服务器版
当前版本: 3.3.8、4.5.20、2.0
速度:最快、快、快
稳定性:好、好、好
数据库容量:2TB、256TB、64TB
SQL支持:大部份SQL- 92、不支持、完全SQL-92与大部份SQL-99
Win32平台下最小体积:374KB、840KB、3.68MB
数据操纵:SQL、仅应用程序接口、SQL