搜索 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。
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。