本文地址:http://blog.csdn.net/mba16c35/article/details/57197962
翻译自:https://www.sqlite.org/queryplanner.html
综述
sql的最好特性就是它是一种描述性的语言,不是一种过程语言。当你用sql编程,你是告诉系统你想计算什么,而不是怎么去计算它。如何计算的任务由sql数据库引擎中的执行计划(Query Planner)子系统完成。
对于任意一句sql语句,都可能有上千种算法实现它。所有这些算法都可以得到正确结果,但是其中一些会比其他运行得更快。执行计划的任务就是尝试找出最快而且最有效的算法。
在大多数时候,执行计划系统都可以做得很好。但是,它需要索引来完成这项工作。索引是由编码者添加的。在很少情况下执行计划会得到一个次优解,这时候,编码者可能想提供额外的提示去帮助执行计划子系统。
这篇文档提供了sqlite执行计划和引擎工作的背景知识。编码者可以用这些信息创建更好的索引,帮助执行计划获得更好的性能。
1.搜索
1.1 带索引的表
大多数sqlite的表都包含了带unique integer key的行(rowid 或者 INTEGER PRIMARY KEY).这些行在逻辑上按照rowid的递增顺序来存储。举个栗子,本文使用一个叫“FruitsForSale”的表,表中的内容是关联某种水果和该水果在哪个国家培育,以及它的市场价格。
CREATE TABLE FruitsForSale( Fruit TEXT,State TEXT,Price REAL );
插入了一些实例数据之后,这个表在磁盘上可能以这样的逻辑顺序存储:
图1:表“FruitsForSale”
@H_502_25@ 在这个例子里,rowid不是连续的,不过是按序的。sqlite一般从1开始创建rowid,每加一行就加一。但是如果某些行删了,序列中就会出现一些空缺。应用其实也可以控制rowid的赋值,然后这些行就不一定是在底部插入了。但不管怎样,rowid总是唯一而且按升序排列。