SQlite学习(开篇)

道歉

首先感谢一直支持我的朋友,虽然粉丝不多,但是还是要坚持的去写一些东西。由于工作上的一些事情,实在是忙的不行(996.ICU),两个月没有更新文章,实在是抱歉。以后每周会保持至少2篇的更新量。还请各位朋友,多多支持!

从这篇文章开始,我准备穿插着一个【SQlite学习】的文章。深入分析SQlite实现的原理,从而以小见大的方式学习数据库。


前言

SQlite当前是流行的嵌入式关系型数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法、事务、数据表和索引等。由于本人非常喜欢SQlite的精简实现,所以单列系列文章来分享给各位读者。

事实上,尽管SQLite拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。下面我们将列举一下SQLite的主要特征:

  1. 管理简单,甚至可以认为无需管理。
  2. 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。
  3. 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。
  4. 易于维护。

综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。SQLite的设计者们为了达到这一目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句等。正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。

SQLite无法直接与客户端/服务器SQL数据库引擎(如MySQL,Oracle,PostgreSQL或SQL Server)相媲美,因为SQLite和他们服务领域根本不一样。所以如果听到有人说SQlite没有其他数据库好用,都是耍流氓!!

客户端/服务器SQL数据库引擎努力实现企业数据的共享存储库。它们强调可伸缩性,并发性,集中化和控制。SQLite致力于为各个应用程序和设备提供本地数据存储。SQLite强调经济,效率,可靠性,独立性和简单性。

SQLite不会与客户端/服务器数据库竞争。可以理解为SQLite与fopen()竞争。


SQlite优势

  • 嵌入式设备和物联网
  • 这个领域是SQlite应用最广的,因为SQLite数据库不需要管理,所以它适用于必须在没有专业人员支持的情况下运行的设备。SQLite非常适合用于手机,机顶盒,电视,游戏机,照相机,手表,厨房电器,恒温器,汽车,机床,飞机,遥控传感器,无人机,医疗设备和机器人。
  • 应用文件格式
  • SQLite通常用作桌面应用程序的磁盘文件格式,例如版本控制系统,财务分析工具,媒体编目和编辑套件,CAD软件包,记录保存程序等。传统的File / Open操作调用sqlite3_open()来附加到数据库文件。随着应用程序内容的修改,更新会自动发生,因此文件/保存菜单选项变得多余。可以使用备份API实现File / Save_As菜单选项。
  • 这种方法有许多好处,包括改进的性能,降低的成本和复杂性,以及提高的可靠性。有关详细信息,请参阅SQlite官方技术说明 文档aff_short.html和 appfileformat.html和fasterthanfs.html。此用例与下面的数据传输格式和 数据容器用例密切相关 。
  • 网站
  • SQLite非常适合作为大多数中低流量网站(也就是大多数网站)的数据库引擎。一般来说,每天点击次数少于100K的网站应该可以正常使用SQLite。100K点击/天的数字是一个保守估计,而不是一个硬上限。SQLite已经正常可以使用10倍的流量。
  • 当然,SQLite官网(https://www.sqlite.org/)使用SQLite本身,在在2015年时(现在没有最新的资料不清楚是否还是用SQlite引擎),它每天处理大约400K到500K的HTTP请求,其中大约15-20%是动态的数据库的页面。动态内容每个网页使用大约200条SQL语句。此设置在单个VM上运行,该VM与另外23个共享物理服务器,但仍然在大多数时间内将负载平均值保持在0.1以下。
  • 数据分析
  • 了解SQL的人可以使用 sqlite3命令行shell(或各种第三方SQLite访问程序)来分析大型数据集。可以从CSV文件导入原始数据,然后可以对数据进行切片和切块以生成大量的摘要报告。使用用Tcl或Python编写的简单脚本(两者都内置SQLite)或R或其他语言使用现成的适配器,可以进行更复杂的分析。用途包括网站日志分析,体育统计分析,编程指标汇编和实验结果分析。许多生物信息学研究人员以这种方式使用SQLite。
  • 当然,企业客户端/服务器数据库也可以做同样的事情。SQLite的优点是它更易于安装和使用,结果数据库是一个可以写入U盘或通过电子邮件发送给同事的文件。
  • 缓存企业数据
  • 许多应用程序使用SQLite作为企业RDBMS中相关内容的缓存。这减少了延迟,因为现在大多数查询都是针对本地缓存发生的,并且避免了网络往返。它还减少了网络和中央数据库服务器上的负载。在许多情况下,这意味着客户端应用程序可以在网络中断期间继续运行。
  • 服务器端数据库
  • 系统设计人员使用SQLite作为数据存储在数据中心中运行的服务器应用程序,或者换句话说,使用SQLite作为特定于应用程序的数据库服务器的底层存储引擎。
  • 使用此模式,整个系统仍然是客户端/服务器:客户端向服务器发送请求并通过网络获取回复。但是,客户端请求和服务器响应不是发送通用SQL并返回原始表内容,而是高级别和特定于应用程序。服务器将请求转换为多个SQL查询,收集结果,进行后处理,过滤和分析,然后构建仅包含基本信息的高级回复。
  • 开发人员报告说,在这种情况下,SQLite通常比客户端/服务器SQL数据库引擎更快。数据库请求由服务器序列化,因此并发不是问题。数据库分片也改进了并发性:对不同的子域使用单独的数据库文件。例如,服务器可能为每个用户提供单独的SQLite数据库,以便服务器可以处理数百或数千个并发连接,但每个SQLite数据库仅由一个连接使用。
  • 数据传输格式
  • 由于SQLite数据库是一个定义良好的跨平台格式的单个压缩文件 ,因此它通常用作将内容从一个系统传输到另一个系统的容器。发件人将内容收集到SQLite数据库文件中,将一个文件传输到接收者,然后接收者使用SQL根据需要提取内容。
  • 即使终端具有不同的字大小和/或字节顺序,SQLite数据库也有助于系统之间的数据传输。数据可以是大型二进制blob,文本和小数字或布尔值的复杂混合。通过添加新表和/或列可以轻松扩展数据格式,而不会破坏传统接收器。SQL查询语言意味着接收者不需要一次解析整个传输,而是可以根据需要查询接收的内容。数据格式是透明的,因为它可以使用来自多个供应商的各种普遍可用的开源工具轻松解码以供人工查看。
  • 文件存档和/或数据容器
  • 在SQLite的归档想法展示的SQLite如何被用作ZIP压缩文件或压缩包的替代品。存储在SQLite中的文件存档仅比同等的ZIP存档略大,并且在某些情况下实际上更小。SQLite存档具有增量和原子更新功能,并能够存储更丰富的元数据。
  • 除了传统的tarball和ZIP存档之外,Fossil 2.5及更高版本还提供 SQLite存档文件作为下载格式。该sqlite3.exe命令行外壳版本3.22.0和以后将创建,列表,或使用解压的SQL归档.ARCHIVE命令。
  • SQLite是一个很好的解决方案,适用于任何需要将各种内容捆绑到一个独立的自我描述包中以便通过网络发送的情况。内容以明确定义的,跨平台且稳定的文件格式进行编码 。编码是有效的,并且接收器可以提取内容的小子集而无需读取和解析整个文件。
  • SQL归档作为广播到许多客户端的软件或内容更新的分发格式非常有用。例如,使用这种想法的变化来将电视节目指南传送到机顶盒并向车辆导航系统发送无线更新。
  • 替换ad hoc磁盘文件
  • 许多程序使用 fopen(), fread()和 fwrite()来创建和管理本土格式的数据文件。SQLite特别适合替代这些临时数据文件。与直觉相反,SQLite可以比 用于读取和写入磁盘内容的文件系统更快。
  • 内部或临时数据库
  • 对于必须以不同方式筛选和排序的大量数据的程序,将数据加载到内存中的SQLite数据库并使用带有连接和ORDER BY子句的查询来提取数据时,通常更容易,更快捷。需要的形式和顺序,而不是尝试手动编写相同的操作。以这种方式在内部使用SQL数据库也为程序提供了更大的灵活性,因为可以添加新的列和索引而无需重新编译每个查询。
  • 在演示或测试期间替代企业数据库
  • 客户端应用程序通常使用通用数据库接口,允许连接到各种SQL数据库引擎。将SQLite包含在支持的数据库中并将SQLite引擎静态链接到客户端是很有意义的。这样,客户端程序可以单独使用SQLite数据文件进行测试或演示。
  • 教育和培训
  • 因为它易于设置和使用(安装很简单:只需将sqlite3或sqlite3.exe可执行文件复制到目标机器并运行它)SQLite是一个很好的数据库引擎,用于教授SQL。学生可以轻松创建任意数量的数据库,并可以通过电子邮件将数据库发送给教师进行评论或评分。对于有兴趣研究如何实现RDBMS的更高级的学生,模块化和评论良好且记录在案的SQLite代码可以作为一个很好的基础。
  • 实验性的SQL语言扩展
  • SQLite的简单模块化设计使其成为用于对新的实验性数据库语言功能或想法进行原型设计的良好平台。

和RDBMS相比的一些劣势

  • C/S应用:
  • 如果你有多个客户端需要同时访问数据库中的数据,特别是他们之间的数据操作是需要通过网络传输来完成的。在这种情况下,不应该选择SQLite。由于SQLite的数据管理机制更多的依赖于OS的文件系统,因此在这种操作下其效率较低。
  • 数据量较大:
  • 受限于操作系统的文件系统,在处理大数据量时,其效率较低。对于超大数据量的存储,甚至不能提供支持。
  • 高并发:
  • 由于SQLite仅仅提供了粒度很粗的数据锁,如读写锁,因此在每次加锁操作中都会有大量的数据被锁住,即使仅有极小部分的数据会被访问。换句话说,我们可以认为SQLite只是提供了表级锁,没有提供行级锁。在这种同步机制下,并发性能很难高效。

个性化特征:

  • 零配置:
  • SQLite本身并不需要任何初始化配置文件,也没有安装和卸载的过程。当然也不存在服务器实例的启动和停止。在使用的过程中,也无需创建用户和划分权限。在系统出现灾难时,如电源问题、主机问题等,对于SQLite而言,不需要做任何操作。
  • 没有独立的服务器:
  • 和其他关系型数据库不同的是,SQLite没有单独的服务器进程,以供客户端程序访问并提供相关的服务。SQLite作为一种嵌入式数据库,其运行环境与主程序位于同一进程空间,因此它们之间的通信完全是进程内通信,而相比于进程间通信,其效率更高。然而需要特别指出的是,该种结构在实际运行时确实存在保护性较差的问题,比如此时,应用程序出现问题导致进程崩溃,由于SQLite与其所依赖的进程位于同一进程空间,那么此时SQLite也将随之退出。但是对于独立的服务器进程,则不会有此问题,它们将在密闭性更好的环境下完成它们的工作。
  • 单一磁盘文件:
  • SQLite的数据库被存放在文件系统的单一磁盘文件内,只要有权限便可随意访问和拷贝,这样带来的主要好处是便于携带和共享。其他的数据库引擎,基本都会将数据库存放在一个磁盘目录下,然后由该目录下的一组文件构成该数据库的数据文件。尽管我们可以直接访问这些文件,但是我们的程序却无法操作它们,只有数据库实例进程才可以做到。这样的好处是带来了更高的安全性和更好的性能,但是也付出了安装和维护复杂的代价。
  • 平台无关性:
  • 这一点在前面已经解释过了。和SQLite相比,很多数据库引擎在备份数据时不能通过该方式直接备份,只能通过数据库系统提供的各种dump和restore工具,将数据库中的数据先导出到本地文件中,之后在load到目标数据库中。这种方式存在显而易见的效率问题,首先需要导出到另外一个文件,如果数据量较大,导出的过程将会比较耗时。然而这只是该操作的一小部分,因为数据导入往往需要更多的时间。数据在导入时需要很多的验证过程,在存储时,也并非简简单单的顺序存储,而是需要按照一定的数据结构、算法和策略存放在不同的文件位置。因此和直接拷贝数据库文件相比,其性能是非常拙劣的。
  • 弱类型:
  • 和大多数支持静态类型的数据库不同的是,SQLite中的数据类型被视为数值的一个属性。因此对于一个数据表列而言,即便在声明该表时给出了该列的类型,我们在插入数据时仍然可以插入任意类型,比如Integer的列被存入字符串'hello'。针对该特征唯一的例外是整型的主键列,对于此种情况,我们只能在该列中存储整型数据。
  • SQL语句编译成虚拟机代码:
  • 很多数据库产品会将SQL语句解析成复杂的,相互嵌套的数据结构,之后再交予执行器遍历该数据结构完成指定的操作。相比于此,SQLite会将SQL语句先编译成字节码,之后再交由其自带的虚拟机去执行。该方式提供了更好的性能和更出色的调试能力。

本文参考SQlite官网https://www.sqlite.org,更多内容可以直接登录官网查看。

总结

SQlite虽然非常小巧,但是功能非常强大,麻雀虽小五脏俱全。其实真正值得我们的学习的是设计的思想,这个以后的文章中,我们慢慢体会。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月20日

ThinkPHP5快速入门基础

ThinkPHP5快速入门基础一、基础快速入门 ( 一 ) :基础本章介绍了 ThinkPHP5 .0 的安装及基本使用 ,并给出了一个最简单的示例带你了解如何开始开发 ,主要包 含 :简介官网下载 omposer安装和更新CGit下载和更新目录结构运行环境入口文件调试模式控制器视图读取数据总结在学习 ThinkPHP5.0 之前 ,如果你还不理解面向对象和命名空间的概念 ,建议首先去PHP手册恶

ThinkPHP5快速入门

ThinkPHP5快速入门目 录零、序言一、基础二、URL和路由三、请求和响应四、数据库五、查询语言六、模型和关联 (1)模型定义 (2)基础操作 (3)读取器和修改器 (4)类型转换和自动完成 (5)查询范围 (6)输入和验证 (7)关联 (8)模型输出七、视图和模板八、调试和日志九、API开发十、命令行工具十一、扩展十二、杂项SessionCookie验证

热门专题

昆明综合高中|昆明综合高中
昆明综合高中
国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
综合高中|云南综合高中,昆明综合高中,综合高中能考本一吗,综合高中和普通高中的区别,综合高中是什么意思,综合高中能参加全国统一高考吗,综合高中可以考哪些大学,综合高中的学籍是什么
综合高中
云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
APP开发|app开发_app开发公司_app软件开发_专业app开发_云南app开发公司_app定制_原生app开发定制
APP开发
云南开放大学|云南开放大学报名,云南开放大学报考,云南开放大学,什么是云南开放大学,云南开放大学学历,云南开放大学学费,云南开放大学报名条件,云南开放大学报名时间,云南开放大学学历,云南开放大学专业
云南开放大学
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
云南综合高中|云南综合高中
云南综合高中

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部