搜索表与扫描表

问题描述 投票:0回答:1
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 TABLESEARCH TABLE扫描B-TREE或记录序列?

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

sql sqlite explain
1个回答
3
投票

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

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

有关SQLite索引的更多信息,请参阅Squeezing Performance from SQLite: Indexes? Indexes!。有关SQLite索引设计的详细文档在Query Planning中。

© www.soinside.com 2019 - 2024. All rights reserved.