主流的索引数据结构
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,那么索引就无法生效了