【问题标题】:SEARCH TABLE vs SCAN TABLE搜索表与扫描表
【发布时间】:2018-06-04 14:09:42
【问题描述】:
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 表的详尽扫描,因为可能存在重复,但是,

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

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

【问题讨论】:

  • 主键是一个索引,不需要每一行都读取。
  • @Barmar 首先,在这两种情况下,这些查询是扫描记录序列还是 B-tree。因为带有主键的 B-Tree 相当快。

标签: sql sqlite explain


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多