数据库索引--基本介绍

索引结构

物理结构

表和索引都被存储在页中,页的大小一般为4KB或者8KB。

当表和索引被加载或重组时,每个页会留出一定比例的空闲空间,以满足向其添加新的表行或索引行的需求。DBMS的缓冲池和I/O活动都是基于的。

每个DBMS都会根据对象类型(表或索引)及页的大小拥有多个缓冲池。每一个缓冲池都足够大,可能存放成千上万的页。缓冲池管理器将尽力确保经常使用的数据被保存在池中,可以避免一些不必要的磁盘I/O。
这一策略的有效性对于SQL语句的性能表现至关重要。

索引行和表行

  • 对于主键索引(唯一键值),一个索引行等同于叶子页中的一个索引条目,索引条目中存放指向表页一行记录的指针(以主键为索引组织数据,索引顺序和表页中数据存放顺序一致,也称聚集索引)。
  • 对于非主键索引(非唯一键值),一个特定的索引值对应的索引行是一个独立的索引条目,条目下有多个指针(这些指针会其值的顺序存储,这样方便查找定位),分别指向多个表页记录(也称非聚集索引)。

在innodb中表行(表页中的行)的存储顺序与主键索引的存储顺序一致,其他辅助索引存储主键索引的位置,最后会调用主键索引来定位数据行的位置。
在myisam中表行(表页中的行)的存储顺序与主键索引的存储顺序一致,其他辅助索引直接存储表行的位置。我们可以看出,辅助索引访问存储表行时,由于表行是按主键索引组织顺序的,指向的位置是随机的,会产生随机I/O,效率低效。
如下图:

常见索引

位图索引

主要针对大量固定相同值的列而创建
一列的相同时存储称一个索引块,索引块(叶子节点)只存储:键值,起止Rowid,键值的位置编码

  • 根据键值查询时,可以根据起始rowid和位图状态,快速定位数据
  • 根据键值做and,or或in查询时,直接用索引的位图进行或运算,快速得出结果
  • select count(xx)(只需计算某键值的数量)可以直接访问索引块得出结果
  • 批量更新操作 不存在锁争用,更有效率

B树索引

B-树
其实就是我们常说的⽤了平衡算法的多路搜索树。

-----------一棵m阶或m叉的B-树-------------
树中每个结点最多有m颗子树
根节点不是叶子节点则至少有两颗子树
除根节点外的非叶子节点,至少有 m/2 (向上取整) 颗子树
所有叶子节点都出现在同一层次上,且不带信息,可以看做是外部节点或查找失败的节点

未选择平衡⼆叉树作为索引数据结构的原因:由于平衡⼆叉树搜寻时I/O过多,节
点数据内容太少。
⾮叶⼦节点(一个索引页)通常包含 键值(m叉树最多有 m-1 个键值),数据以及指向下⼀层级页的指针,该键值是下⼀层级页中最⼤键值。按
照这种⽅式逐层建⽴,最后剩下⼀个页(根页),位于索引结构的最上层。这种
组织⽅式的索引被称为B树索引(⼀种平衡树索引)。
在这里插入图片描述
B+树
B-的优化,索引列数据都存放在叶⼦页中,非叶子页只存放区间键数据。通过这种索引查找任何⼀条索引记录都需要访
问相同数量的⾮叶⼦页。
在这里插入图片描述

散列

以散列方式存储索引
存储一行数据时,由随机选择器将主键值转换为从1到n中的某个页号,若该页已满,则存到该页串联的链表页中。当发起一个select···where PK=:PK查询时,随机选择器将主键转为页号直接访问该页或遍历该页的链表得到结果。

散列是已知主键值的情况下读取一个表行的最快方式。读取一行记录的I/O次数可低至1 : 1,然而添加更多记录后,页表链长度增长,I/O次数也会随之大幅度增加。此外散列方式不支持范围谓词。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值