数据库的知识又深又广,本着务实的态度,只简单谈谈我对数据库的索引btree的理解。

b+tree和btree是innodb磁盘等外存贮时查找的一种结构,因为磁盘读写涉及到大量的io,为了需要加快读写速度避免大量io操作,因此设计了一种平衡二叉树,平衡的意思就是树的每个分支的高度差保证在1之内,这样可以减小查找复杂度。

btree有下面有几个特征:

  1. 每个节点都有一个key,data。key就是索主键,data就是数据。
  2. 如果不是终端节点,每个节点有n个分支。
  3. 所有的终端节点都是在同一层。
  4. 终端节点没有指针,其余节点是有指针的指向它的下一层数据范围。
    对数据库的索引的简单理解

b+tree是在btree上的一种优化,它和btree的区别有下面两点。

  1. 所有的终端节点才存有数据,其他节点只放指针和key。
  2. 所有的终端节点用链表链接。
    对数据库的索引的简单理解

这样同样的页大小,间接放置的索引值增多,索引量加大,一次性读入内存的关键词加多,相对的io读写次数下降,效率就会提升。另外,终端链表可以快速查找范围数据也加快了查询。


在建立索引时有不同的索引类型,对于不同的场景选择不同的索引,使其达到最好的索引效果。并不是加索引检索一定会加快,也不是索引加的越多就越好,一切要从实际出发,数据结构这里知识博大精深,我也只是管中窥,先说几个常用的索引,后面有时间再来分享。

聚合索引

每个表只有一个,因为它决定了数据的物理地址顺序和索引顺序是一致的,所以只有一个。会有人默认id作为聚合索引,个人感觉是不合适的,它强调的是顺序也是有序范围,我基本上在实践中是看不到查id范围的,所以用id作为聚合索引有些浪费,我个人感觉时间之类的查询是比较频繁的,而且是不易更改的,因为更改聚合索引是比较麻烦的,每次更新会重新排序,所以对更改频繁的字段不是很建议。

非聚合索引

联合索引和普通索引,可以有多个。联合索引使用多个字段联合查询,遵循最左侧原理,使用频繁的字段靠左,可以提高速度。例如abc联合索引的本质就是分别创建a ab abc的索引,普通索引就是分别建立a b c的索引。当查a and b时,联合就比较快,而查b and c或者a or b时普通就比较快。

相关文章: