数据库索引--基本介绍

文章目录

    • 索引结构
        • 物理结构
        • 索引行和表行
    • 常见索引
        • 位图索引
        • B树索引
        • 散列

索引结构

物理结构

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

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

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

索引行和表行

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

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

常见索引

位图索引

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

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

B树索引

非叶子页通常包含一个键值(这个值至少要和表中最大的列相当,否则列值会被截断),以及指向下一层级页的指针,该键值是下一层级页中最大键值。按照这种方式逐层建立,最后剩下一个页(根页),位于索引结构的最上层。
这种组织方式的索引被称为B树索引(一种平衡树索引),因为通过这种索引查找任何一条索引记录都需要访问相同数量的非叶子页。
未选择平衡二叉树作为索引数据结构的原因:由于平衡二叉树搜寻时I/O过多,节点数据内容太少

散列

以散列方式存储索引
存储一行数据时,由随机选择器将主键值转换为从1到n中的某个页号,若该页已满,则存到该页串联的链表页中。当发起一个select···where PK=:PK查询时,随机选择器将主键转为页号直接访问该页或遍历该页的链表得到结果。
数据库索引--基本介绍_第5张图片
散列是已知主键值的情况下读取一个表行的最快方式。读取一行记录的I/O次数可低至1 : 1,然而添加更多记录后,页表链长度增长,I/O次数也会随之大幅度增加。此外散列方式不支持范围谓词。

你可能感兴趣的:(数据库)