数据库索引相关知识点

主流的索引数据结构

   1 b+tree

   2 hash

   3 bitmap (拥有此索引的数据库比较少,比如oracle)

b+

 是二叉树和B树的衍生

    比起二叉树可以自动平衡,比起B树多了叶子节点

自动平衡:

    正常的二叉树 ,如果插入数据本身就排序极端,比如1,2,3,4,5,6,这样就跟链表就没什么区别了,相当于全部扫描。如果这个时候查询6,就要经历6次io

    b+树可以自动平衡,修改根节点,索引的时候可以减少io次数。

    b树本身也比2叉树查询更快,因为b树也是自动平衡树,并且b树的节点的子节点数比二叉树的子节点数更多,这样树的深度就会减少,索引时的io次数就会降低,更多的运算在cpu和内存,这样查询效率更高

 叶子节点

   为什么不用b树作为索引结构,因为b树没有办法做范围查询,b树的本身节点可以叫做非叶子节点,叶子节点可以当做是个链表,非叶子节点指向链表的数据就会同时拥有链表和b树的优势,io快,并且可以范围查询。

HASH

 b树不作为索引结构的还有一个原因,就是hash索引的存在,他比b树拥有更高的查询效率,但是缺点跟b树一样,没办法范围查询。

  个人观点 :那么为什么hash不能像b+树一样再做一个链表作为一个叶子节点一样的存在,因为hash本身就是无序的,而b树的树结构本身是有序的,叶子节点的生成耗费的资源更小

bitmap也叫位图索引

 是一个很强硬的索引结构,根据索引值直接根据0101格式指向了表数据,每多一个索引值,就会多一套表数据指向。所以这种索引的表字段,值越少越好,比如性别(男,女)或者婚姻状态(已婚,未婚)等等,而身份证号这种类型不适合用位图索引。此外,位图索引适合静态数据,而不适合索引频繁更新的列。因为修改值会锁行,如果其他数据操作需要被锁的行,将会等待,降低性能

密集索引和稀疏索引

   密集索引:索引直接指向的行数据

  稀疏索引:索引指向的行数据的地址

  innodb引擎的表,会直接根据主键或者唯一键生成表(b+树),如果没主键没唯一键,则会自动生成一个隐藏的字段作为索引键生成表,也是是刚生成表的时候,会强制生成一个密集索引。myisam则不会,myisam的主键索引是稀疏索引

联合索引为什么要最左原则?

因为联合索引是以最左边的开始排序的。

 你可以想象成order by多个字段,对于全表来说,只有第一个字段是全表顺序排列的,第二个字段只在前一个字段一样的情况下是顺序排列的,对于全表来说第二个字段开始,后面都是乱序的,所以索引也是一样,得要最左按顺序使用。

当然如果索引的a,b两个字段。sql语句为 b=1 and a=2 。sql优化器也会自动优化成a=2 and b=1 这个适合索引的顺序。除非跳过了a查询直接查询b,那么索引就无法生效了

发布了19 篇原创文章 · 获赞 11 · 访问量 3096

猜你喜欢

转载自blog.csdn.net/qq_28056571/article/details/88639821