我想知道当您在 android 上处理数据库时 sqllite 究竟是如何工作的。我知道它会将所有内容都写入带有 .db 扩展名的文件中。但它如何读取或写入一个特定的表?它是获取整个文件还是仅获取相关部分,以及它是如何执行这些操作的?有人可以建议我一些链接吗?我尝试了谷歌,但我找到的链接只是解释了如何编写查询。
2 回答
为此,您必须阅读数据库的基础知识。所有数据库框架在工作方面几乎相同,因此您必须研究数据库的基础知识(任何)。这里有一些你可以喜欢的相关信息
What does a database actually do to find out what matches a select statement?
坦率地说,这是一个蛮力的问题。简单地说,它会读取数据库中的每个候选记录并将表达式与字段匹配。所以,如果你有“select * from table where name = 'fred'”,它实际上会遍历每条记录,获取“name”字段,并将其与“fred”进行比较。
现在,如果“table.name”字段被索引,那么数据库将(可能但不一定)首先使用索引来定位候选记录以应用实际过滤器。
这减少了将表达式应用到的候选记录的数量,否则它只会执行我们所说的“表扫描”,即读取每一行。
但从根本上说,它定位候选记录的方式与应用实际过滤器表达式的方式是分开的,显然,可以进行一些巧妙的优化。
How does a database interpret a join differently to a query with several "where key1 = key2" statements?
好吧,连接用于创建一个新的“伪表”,在其上应用过滤器。因此,您有过滤条件和连接条件。连接条件用于构建此“伪表”,然后对其应用过滤器。现在,在解释连接时,这又是与过滤器相同的问题——蛮力比较和索引读取以构建“伪表”的子集。
How does the database store all its memory?
良好数据库的关键之一是它如何管理其 I/O 缓冲区。但它基本上将 RAM 块与磁盘块匹配。使用现代虚拟内存管理器,更简单的数据库几乎可以依赖 VM 作为其内存缓冲区管理器。高端 DB'S 自己做这一切。
How are indexes stored?
B+Trees 通常,你应该查一下。这是一种已经存在多年的直接技术。它的好处与大多数平衡树共享:对节点的一致访问,加上所有叶节点都是链接的,因此您可以轻松地按键顺序从一个节点遍历到另一个节点。因此,使用索引,可以将行视为针对数据库中的特定字段“排序”,并且数据库可以利用该信息来优化它。这与使用哈希表作为索引不同,后者只能让您快速获取特定记录。在 B-Tree 中,您不仅可以快速获取特定记录,还可以快速获取排序列表中的某个点。
在数据库中存储和索引行的实际机制非常简单易懂。游戏正在管理缓冲区,并将 SQL 转换为有效的查询路径,以利用这些基本的存储习惯。
然后,在存储惯用语之上还有整个多用户、锁定、日志记录和事务复杂性。
Android 上的 SQLite 操作与任何其他平台上的 SQLite 操作没有任何不同。
非常简短地回答您的问题:SQLite 文件被分成固定大小的页面。每个数据库对象(表、索引等)占用一定数量的页面。如果对象需要增长(比如将新行插入表中),它可以从空闲页面列表中分配更多新页面,或者通过增加数据库文件的大小来分配更多新页面。如果行被删除或对象被丢弃,回收的空闲空间进入空闲页列表。在任何操作期间,SQLite 引擎都会尝试不获取整个文件,但它会维护页面缓存以获得更高的性能。
您可以在SQLite 网站上找到更详细的解释,特别是关于SQLite 数据库文件格式的解释。