SQLite入门一——SQLite概述
学习、掌握一门新的技术通常需要了解这门技术产生的背景,为什么需要这样的技术,或者说能够解决那些问题?
Ø SQLite概述
Ø SQLite特性
Ø 与其他数据库比较
Ø 使用SQLite解决那些问题
SQLite概述
SQLite数据库引擎具有独立、无服务器端、零配置、支持事务等特点,作为一款优秀的开源嵌入式数据库引擎,SQLite受到了很多知名企业及项目的使用。
SQLite是一款嵌入式数据库引擎。与其他数据库系统不同,SQLite没有一个独立的server进程,SQLite直接在文件系统上的数据库文件进行读写操作,并且SQLite的数据库文件具有很好的跨平台特性。
SQLite是一款轻量级的数据库引擎。作为一款轻量级的数据库引擎,SQLite最大也只会占用350K的内存,并且这与所使用平台以及编译器的优化设置有关。SQLite可以在最小4K的堆栈空间和100K堆上运行。由于SQLite在运行时占用的资源较少,而且无需任何管理开销,SQLite对小内存设备,如PDA、手机、MP3 等,SQLite的优势毋庸置疑。尽管在可以在如此小的内存环境上运行,但SQLite仍然具有很好的性能。
SQLite主要定位就是灵巧、高效、稳定的数据库,这种灵巧、高效、稳定的数据库有其使用的场景。下面是SQLite的主要特征:
1. 管理简单。
2. 操作方便。
3. 可以非常方便的嵌入其他应用程序。
4. 易于维护。
SQLite为了达到更加灵巧的目标,在功能上作出了很多关键性的取舍,失去了对一些RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句等。正是因为这些功能的取舍才换来了简单灵巧,简单灵巧又换来了高效性和高可靠性。
SQLite的主要特点:
1. 一致性的文件格式:
在SQLite的官方文档中是这样描述的,我们不要将SQLite与Oracle或PostgreSQL去比较,而是应该将它看做fopen和fwrite。与我们自定义格式的数据文件相比,SQLite不仅提供了很好的移植性,如大端小端、32/64位等平台相关问题,而且还提供了数据访问的高效性,如基于某些信息建立索引,从而提高访问或排序该类数据的性能,SQLite提供的事务功能,也是在操作普通文件时无法有效保证的。SQLite具有很好的向下兼容性,任何版本无需修改任何设置便可以读取以前版本的SQLite数据库文件。
2.零配置:
SQLite在使用之前无需安装,也没有安装和卸载的过程,不需要启动、停止或者配置服务器实例,因为SQLite根本没有server process,采用的是in-process的方式。使用SQLite的时候也无需创建数据库实例或者为用户设置访问权限。
3. 没有独立的服务器:
和其他关系型数据库不同的是,SQLite没有单独的服务器进程,以供客户端程序访问并提供相关的服务。SQLite作为一种嵌入式数据库,其运行环境与主程序位于同一进程空间,因此它们之间的通信完全是进程内通信,而相比于进程间通信,其效率更高。
然而需要特别指出的是,该种结构在实际运行时确实存在保护性较差的问题,比如此时,应用程序出现问题导致进程崩溃,由于SQLite与其所依赖的进程位于同一进程空间,那么此时SQLite也将随之退出。但是对于独立的服务器进程,则不会有此问题,它们将在密闭性更好的环境下完成它们的工作。
4. 单一磁盘文件:
SQLite的数据库被存放在文件系统的单一磁盘文件内,只要有权限便可随意访问和拷贝,这样带来的主要好处是便于携带和共享。其他的数据库引擎,基本都会将数据库存放在一个磁盘目录下,然后由该目录下的一组文件构成该数据库的数据文件。尽管我们可以直接访问这些文件,但是我们的程序却无法操作它们,只有数据库实例进程才可以做到。这样的好处是带来了更高的安全性和更好的性能,但是也付出了安装和维护复杂的代价。
5. 平台无关性:
这一点在前面已经解释过了。和SQLite相比,很多数据库引擎在备份数据时不能通过该方式直接备份,只能通过数据库系统提供的各种dump和restore工具,将数据库中的数据先导出到本地文件中,之后在load到目标数据库中。这种方式存在显而易见的效率问题,首先需要导出到另外一个文件,如果数据量较大,导出的过程将会比较耗时。然而这只是该操作的一小部分,因为数据导入往往需要更多的时间。数据在导入时需要很多的验证过程,在存储时,也并非简简单单的顺序存储,而是需要按照一定的数据结构、算法和策略存放在不同的文件位置。
因此和直接拷贝数据库文件相比,其性能是非常拙劣的。
6.弱类型:
大部分数据库使用静态类型,静态类型关联到数据表中的每个列,只有该种类型的数据才被允许插入到该列中。与此不同的是SQLite通过弱类型相对放松了这种限制,SQLite中的数据类型被视为数值的一个属性。因此对于一个数据表列而言,即便在声明该表时给出了该列的类型,我们在插入数据时仍然可以插入任意类型,比如Integer的列被存入字符串'hello'。针对该特征唯一的例外是整型的主键列,我们只能在该列中存储整型数据。
7.SQL语句编译成虚拟机代码:
很多数据库产品会将SQL语句解析成复杂的,相互嵌套的数据结构,之后再交予执行器遍历该数据结构完成指定的操作。相比于此,SQLite会将SQL语句先编译成字节码,之后再交由其自带的虚拟机去执行。该方式提供了更好的性能和更出色的调试能力。
SQLite应用场景:
1. 在嵌入式或移动设备上的应用:
由于SQLite在运行时占用的资源较少,而且无需任何管理开销,因此对于PDA、智能手机等移动设备来说,SQLite的优势毋庸置疑。
3. 数据分析:
可以充分利用SQLite提供SQL特征,完成简单的数据统计分析的功能。这一点是CSV文件无法比拟的。
4. 产品Demo和测试:
在需要给客户进行Demo时,可以使用SQLite作为我们的后台数据库,和其他关系型数据库相比,更加灵巧简单的SQLite减少了大量的系统部署时间。对于产品的功能性测试而言,SQLite也可以起到相同的作用。
三、和RDBMS相比SQLite的一些劣势:
1. C/S应用:
如果你有多个客户端需要同时访问数据库中的数据,特别是他们之间的数据操作是需要通过网络传输来完成的。在这种情况下,不应该选择SQLite。由于SQLite的数据管理机制更多的依赖于OS的文件系统,因此在这种操作下其效率较低。
2. 数据量较大:
受限于操作系统的文件系统,在处理大数据量时,其效率较低。对于超大数据量的存储,甚至不能提供支持。
3. 高并发:
由于SQLite仅仅提供了粒度很粗的数据锁,如读写锁,因此在每次加锁操作中都会有大量的数据被锁住,即使仅有极小部分的数据会被访问。换句话说,我们可以认为SQLite只是提供了表级锁,没有提供行级锁。在这种同步机制下,并发性能很难高效。
参考资料:
http://www.sqlite.org/whentouse.html#appfileformat
http://baike.baidu.com/view/19310.htm
部分来源于网络。
作者:NeverGone2012
出处:http://www.cnblogs.com/NeverGone2012
关于作者:爱生活,爱编程,屌丝程序员一枚,希望大家多多指教,互相学习
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接
如有问题,可以通过greg.lee.twitter@gmail.com 联系我,非常感谢。