Btree搜索非索引字段

时间:2016-06-16 18:09:05

标签: mysql postgresql rdbms

我一直在阅读@XenphYan的答案

How does database indexing work?

但我无法理解的东西很少

  

由于许多记录只能在一个记录上排序   字段,我们可以声明搜索未排序的字段   需要线性搜索,需要N / 2块访问(打开   平均值),其中N是表格跨越的块数。如果   该字段是非关键字段(即不包含唯一条目)   然后必须在N个块访问时搜索整个表空间。

首先我无法理解上述部分。

问题1。为什么搜索未排序的字段需要线性搜索N / 2块访问?

  

虽然使用排序字段,但可以使用二进制搜索   log2 N块访问。此外,由于数据是在非密钥的情况下进行排序的   字段,表的其余部分不需要搜索重复   值,一旦找到更高的值。因此性能提高了   显着的。

我也不理解这一部分,在我看来,上面的具体要点是在排序字段上可以使用二进制搜索。

我的感受...... 根据我的理解,二进制搜索仅应用于索引字段。 (即提高搜索性能)

POC:

这是我的表格如何

create table sqltemp(
  id INT PRIMARY KEY, 
  name CHAR(50),
  counter INT
);

insert into sqltemp(id,name,counter) values(1,'viren',1),(2,'vikas',2),(3,'vikram',3);  

EXPLAIN ANALYZE  select id from sqltemp where counter=2;

Seq Scan on sqltemp  (cost=0.00..14.25 rows=2 width=4)
   Filter: (increment = 2)

AASTast EXPLAIN命令并不具体说明任何二进制搜索符号(即它是Seq Scan

所以,我的问题2是

问题2:我的理解是正确的,DB中的二进制搜索仅适用于索引字段。

1 个答案:

答案 0 :(得分:0)

  

问题1.如何搜索未排序的字段需要线性搜索N / 2块访问?

重要的部分是平均。如果您在50%的时间内搜索N中的一个项目,那么它恰好位于您检查的项目的前半部分。这只是一种奇特的方式,说找到目标没有比检查每一行更快捷的方法。

  

问题2:我的理解是正确的,DB中的二进制搜索仅适用于索引字段。

sequential scan表示数据库引擎正在查看每一行,即O(n)。如果你编写一个利用索引的查询,EXPLAIN会告诉你它能够使用index scan,即O(log2(n)),这是快得多在大桌子上。要在示例数据库中查看此内容,请尝试:

EXPLAIN ANALYZE  select * from sqltemp where id=2;

主键是索引字段,这意味着数据库引擎将其存储在二叉树中。