搜索 TABLE 与扫描 TABLE

SEARCH TABLE vs SCAN TABLE

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>

SCAN TABLE actor

相比,

SEARCH TABLE actor USING INTEGER PRIMARY KEY (rowid=?) 花费的时间明显减少


很明显,SCAN TABLE actor 是对 actor table 的详尽扫描,但是,

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

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

SEARCH TABLE 表示它使用索引,这是一种快速查找具有特定列值的行的方法。主键是自动索引的,对于其他列,您需要使用 CREATE INDEX 命令显式添加索引。像这样搜索 B 树是 O(log n)。

SCAN TABLE 意味着它必须执行穷举搜索,读取 table 中的所有行。扫描整个 table 是 O(n)。这是在您匹配非索引列时完成的,例如示例中的 name

有关 SQLite 索引的详细信息,请参阅 Squeezing Performance from SQLite: Indexes? Indexes!. And detailed documentation of the design of SQLite indexes is in Query Planning