我一直在阅读@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中的二进制搜索仅适用于索引字段。
答案 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;
主键是索引字段,这意味着数据库引擎将其存储在二叉树中。