搜索表与扫描表

ove*_*nge 4 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>
Run Code Online (Sandbox Code Playgroud)

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查询更快?

Bar*_*mar 9

SEARCH TABLE意味着它使用索引,这是查找具有特定列值的行的快速方法。主键会自动建立索引,对于其他列,您需要使用命令显式添加索引CREATE INDEX。像这样搜索 B 树的时间复杂度为 O(log n)。

SCAN TABLE意味着它必须执行详尽的搜索,读取表中的所有行。扫描整个表的时间复杂度为 O(n)。当您匹配非索引列(如name您的示例中)时,就会完成此操作。

有关 SQLite 索引的更多信息,请参阅压缩 SQLite 的性能:索引?索引!。SQLite 索引设计的详细文档位于Query Planning中。