【CMU15-445 Part-8】Tree Indexes ii

Part08-Tree Indexes ii


B+ Tree maintain duplicate indexes

B+ Tree如果维护重复索引或者重复key呢?两种方式解决

  1. 自动让每个key都变得unique,通过往索引中插入的key后面追加它所对应的tuple的record id来做到这点。 key + record ID make key unique。
  2. 将重复的key存储到overflow的叶子节点上

插入重复的key #6

Untitled

Untitled

上图是使用key + record ID方法

Untitled

上图是使用over flow page的方法,但是违背了B+ Tree的定义

Demo on Hash and B+ Tree Index

create index idx_emails_hash on emails using hash(email);
;EXPLAIN SELECT * FROM emails WHERE email = '[email protected]'

使用explain返回,index sacn using 什么索引 on eamils

index condtion:((email)::text = ‘[email protected]’::text)

Cluster

CLUSTER emails USING idx_emails_tree

强迫PostgreSQL根据索引定义来对整个表进行重新排序。这个操作只会进行一次,后续删除和插入并不会维护这个顺序。注意这仅仅是对于PG来说是这样的,其它系统会自动cluster

Implicit Indexes

保证主键唯一性约束,当你创建表的时候,下面是等价的:

Untitled

对外键来说,并不是自动创建索引的,下面例子中,创建table bar外键约束到val1,会报错,因为在没有索引的情况下,我们无法强行使用引用完整性约束。

Untitled

Partial Indexes

不需要整个表上使用索引,只需要某些数据子集。

create index idx_foo on foo(a,b) where c = 'WuTang';

好处:通过使用部分索引避免不需要的数据污染buffer pool,树的高度也会降低,更快查到数据。

Covering Indexes

响应查询需求结果所需的所有字段,都能够在索引本身中找到。不需要专门声明。

Untitled

index 中包括了查询需要有关的a,b。不需要查看实际的tuple,就能完成查询。优势:通过page id page表进行查找时,可能需要一次磁盘IO,覆盖索引无需这样去查看底层tuple。

Index Included Columns

CREATE INDEX idx_foo ON foo(a,b) INCLUDE (c);

Functional/Expression Indexes

函数式索引。在声明索引的时候,需要copy tuple的key,放到index里面。但是有些查询不想通过key 的 value来查询,而是通过key所衍生出来的某些数值来查找。

select * from users where extract(dow from login) = 2;
create index idx_user_login on users(login)
create index idx_user_login ON users (EXTRACT(dow FROM login));
create index idx_user_login ON foo(login) Where EXTRACT(dow FROM login) = 2;

PG: select pg_prewarm(’users’); 会预热,即把该表所有数据加载到buffer Pool里面。

Tries Index

radix tree是trie的变式,数据库里面都是用radix tree 不用trie。

trie是树形结构,并不保存key的完整拷贝,而是保存key的digit(key的原子子集,一个bit或者byte)。例子:最后底层叶子节点可以保存record id,指向tuple。

Untitled

Trie Index Properties

  1. trie树的形状only取决于key的分布以及长度,不在于插入顺序。
  2. Trie 不需要 像B+ Tree 重新平衡,可以在垂直方向rebalance
  3. 操作的复杂度都是O(k),K指的是查找的key的长度。Key隐式地存储在路径里面
  4. 向上走 向下走,但是不利于横向的循序扫描,所以点查询来说Tries比B+ Tree快很多,但是扫描的话要回溯很多。

Trie Key Span

span:树枝向外分叉的个数,即树在每一层每个节点中digit的个数。

fan out:最多有多少条way。

Untitled

0|pointer|1|null,意味着没有从1走的路径。

优化空间1:根据offset来决定他是0or1

Untitled

优化空间2:垂直压缩,向下走也就只有那一个了,可以在分支的时候就end。只用一个child,Patricia Tree。

Untitled

Radix Tree:: Modifications

Untitled

Untitled

可以先留着空slot,然后再合并。

Untitled

Radix Tree是一种移除了所有可以忽略的路径的Trie树。

WikiPedia Example

B+ Tree and Hash 进行关键词搜索效果不好。因为找的是那些东西的子集,B+ Tree只能用准确的key查找,不能用部分key查找,同理hash。

Untitled

直接在content上建立索引肯定是bad的。

select pageID from revisions Where content like '%Pavlo%';

Inverted Index

可以进行在倒排索引里面的查询有

  1. Phrase Searches:词组搜索,例如找到所有包含单词pavlo的record
  2. Proximity Searches:近似搜索,在n words中出现的,关注于上下文。
  3. Wildcard Searches:利用正则表达式等等。

猜你喜欢

转载自blog.csdn.net/qq_47865838/article/details/128179289