搜索表与扫描表

时间:2017-12-21 21:09:08

标签: sql sqlite explain

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 actoractor表格的详尽扫描,因为有可能重复,但是,

1)SCAN TABLE& SEARCH TABLE扫描B-TREE或记录序列?

2)如果它是B-Tree,那么SEARCH TABLE如何更快地查询?

1 个答案:

答案 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