索引实现原理解析

众所周知,sql语句性能执行计划分析,我们会尽量避免全表扫描,而通过索引来加快查询,那么索引到底是什么呢,为什么能够加快查询呢?

  要解决这个疑问,那么我们要知道数据库表数据是怎么存储的,主流的RDBMS都是把平衡树(B-树)当做数据表默认的索引数据结构的,我们平时建表的时候都会为表加上主键,一个加了主键的表,存储结构就由无序的排列变成树结构,

15946833-562a83d4274e3bec.png

换句话说,就是整个表就变成了一个索引,非聚集索引,也就是数据库默认用主键值建立的平衡树,节点包含数据记录的地址信息(伪列rowid),根据主键值找到rowid,计算出地址获取数据库这条记录,此时查找由原来的一条条无序查找变成按树的层次来查找,用大O标记法就是O(log n),n是记录总数,底数是树的分叉数,结果就是树的层次数,这就是索引的基本实现原理。

  当创建非主键索引(聚集索引),重新用索引字段值创建一颗平衡树(额外空间消耗),同时树节点保持了主键 对应值,所以索引其实是用空间换取时间的做法,通过该索引字段找到对应主键值,然后再通过主键的索引找到记录。

    复合式索引跟单字段类似,只是按照复合索引字段依次排序,以A、B字段作为索引,则会先根据A排序,然后再根据B排序得到平衡树,所以缺少前导列,只有后导列,会引起全表扫描,不走复合索引。

  具体平衡树的实现,平衡树g的旋转网上资料很多,不一一详述。

另外一种常见索引bitmap(位图)索引,位图索引是适用于候选值较少却又广泛出现,但不频繁更新的列,比如性别等。

具体语法 create bitmap index index_name on table_name (col_name..)

如一张表

  姓名    性别    婚姻状态

张三      男        未婚

李四      男        已婚

韩梅梅    女        离婚

对性别、婚姻状态建立位图索引,则三条记录对性别形成位图

rowid  1  2    3

男      1  1    0

女      0  0    1

未婚    1  0    0

已婚    0    1    0

离婚    0    0    1

现在要查询男性、未婚的记录,只要将男的位图110与未婚的位图100进行与运算 即110&100=100,然后根据起始rowid进行偏移计算出记录,即第一条记录为查询的结果

猜你喜欢

转载自blog.csdn.net/weixin_33766168/article/details/87221006