当前位置: 首页 > news >正文

【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 = '00@00.000'

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

index condtion:((email)::text = ‘00@00.000’::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:利用正则表达式等等。

相关文章:

  • JSON相关
  • Hygieia (Devops)开源-搭建步骤(一)
  • 桥接设计模式
  • [附源码]计算机毕业设计物品捎带系统Springboot程序
  • 100天精通Python(数据分析篇)——第67天:Pandas数据连接、合并、重构(pd.merge、pd.concat、stack、unstack)
  • 使用uni-app创建扫码连接wifi小程序
  • 【单片机基础】ADC0832详解
  • [附源码]计算机毕业设计基于springboot的文成考研培训管理系统
  • Java Script 内置对象(三) --------- Array 对象
  • 机器学习:详细推导高斯混合聚类(GMM)原理(附Python实现)
  • 华为机试 - 字符串匹配
  • 关于spark配置项 和 hive serDe 和 spark serDe
  • Linux | 二级页表的虚拟地址是怎么转换的?
  • .m3u8.sqlite文件转mp4,m3u8.sqlite文件转视频工具(开源免费)
  • 计算机毕业设计Java电商项目(源码+系统+mysql数据库+lw文档)
  • webpack使用入门贴
  • 【Linux内核】Linux内核介绍
  • linux关于ssh免密登录、known_hosts文件
  • mongoDB操作文档(全部)
  • 基于SSM的服装商城销售系统(含文档资料)