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
如何更快地查询?
答案 0 :(得分:3)
SEARCH TABLE
表示它使用索引,这是查找具有特定列值的行的快速方法。主键自动编入索引,对于其他列,您需要使用CREATE INDEX
命令显式添加索引。像这样搜索B树是O(log n)。
SCAN TABLE
表示必须执行详尽的搜索,读取表格中的所有行。扫描整个表是O(n)。如果您要匹配非索引列(例如示例中的name
),则会执行此操作。
有关SQLite索引的更多信息,请参阅Squeezing Performance from SQLite: Indexes? Indexes!。有关SQLite索引设计的详细文档位于Query Planning。