众所周知,sql语句性能执行计划分析,我们会尽量避免全表扫描,而通过索引来加快查询,那么索引到底是什么呢,为什么能够加快查询呢?
要解决这个疑问,那么我们要知道数据库表数据是怎么存储的,主流的RDBMS都是把平衡树(B-树)当做数据表默认的索引数据结构的,我们平时建表的时候都会为表加上主键,一个加了主键的表,存储结构就由无序的排列变成树结构,
换句话说,就是整个表就变成了一个索引,非聚集索引,也就是数据库默认用主键值建立的平衡树,节点包含数据记录的地址信息(伪列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进行偏移计算出记录,即第一条记录为查询的结果