sqlite> .schema actor
CREATE TABLE actor (
id INTEGER PRIMARY KEY, name TEXT, gender TEXT
);
sqlite> explain query plan
...> select * from actor where id = '305453';
0|0|0|SEARCH TABLE actor USING INTEGER PRIMARY KEY (rowid=?)
sqlite> explain query plan
...> select * from actor where name = 'Connery, Sean';
0|0|0|SCAN TABLE actor
sqlite>
与SEARCH TABLE actor USING INTEGER PRIMARY KEY (rowid=?)
相比,SCAN TABLE actor
花费的时间要少得多
很明显SCAN TABLE actor
是由于重复的可能性而对actor
表进行详尽扫描,但是,
1)SCAN TABLE
和SEARCH TABLE
扫描B-TREE或记录序列?
2)如果是B-Tree,那么SEARCH TABLE
如何查询更快?
SEARCH TABLE
表示它使用索引,这是查找具有特定列值的行的快速方法。主键是自动索引的,对于其他列,您需要使用CREATE INDEX
命令显式添加索引。像这样搜索B树是O(log n)。
SCAN TABLE
意味着它必须执行详尽的搜索,读取表中的所有行。扫描整个表是O(n)。当您匹配非索引列(如示例中的name
)时,就会执行此操作。
有关SQLite索引的更多信息,请参阅Squeezing Performance from SQLite: Indexes? Indexes!。有关SQLite索引设计的详细文档在Query Planning中。