系列文章目录
【面试八股文 - java基础 - 数据结构 - HashMap】
前言
索引是干嘛用的,感觉还挺好理解的吧,
就类似书的目录啊,不是也叫索引么,
就是为了快速在一堆数据里面查找到我想要的那个数据用的东西。
一、 Hash索引
哈希的概念之前在hashMap中已经讲过
【面试八股文 - java基础 - 数据结构 - HashMap】
那么Hash索引就是通过hash值来索引到具体的数据内容,
优点的话,
因为hash值可以直接算出来,查找插入都很快,
缺点就也比较严重,
因为hash值其实是不具有连续性的,
所以根本没办法进行范围查找
二、B+树
1、为什么是树
而数据库的实际使用中还是经常会出现范围查找情况的,
而且也非常需要数据的顺序结构的,
所以这个时候就要用到查找和插入都有不错性能的树结构了,
2、为什么不是二叉树
树结构最经典的应该说二叉树,或者更进一步,二叉平衡树了,
那么为什么没有选用呢,
因为考虑到了磁盘I/O的影响,
索引的每次读取都需要读取磁盘数据,是比较耗时的操作,
而二叉树相对较深,需要多次的数据读取,造成查询时间的增加,
反而不如多叉树,同为树状结构,兼顾了查找和插入效率,
又减少了磁盘I/O次数,节省了查询时间
3、为什么不是b树而是b+树
前面已经提过数据库的实际使用中还是经常会出现范围查找情况的,
b数将数据储存到了所有节点中,
输出连续数据难度较大,
而b+树因为将数据完全储存在了叶子节点中,
连续数据只需要沿着叶子节点一直读取即可。
三、聚簇索引
传统艺能之“望文生义”,
聚簇索引,就是聚成一簇啊,那是谁跟谁聚成一簇呢,
是每个索引跟自己对应的数据聚成一簇,
那么就可以明白了,聚簇索引数据的索引跟数据储存位置的关系,
聚簇索引的好处显而易见,
只要根据索引规则查到了索引,那紧跟着就能读就是自己想要的数据,
查询效率较高。
那么对应聚簇索引自然就有非聚簇索引,
myISAM引擎用的就是非聚簇索引,
也就是索引会单独储存,数据和索引会分开储存 ,
根据索引规则查到索引后,会得到数据储存的地址,再根据地址查找到实际数据,
非聚簇索引将数据和索引分开的方式可以有效的防止不规则数据导致的频繁分页情况。
四、索引失效
1)索引有一个基础原则叫最左匹配原则,
如果索引可以从左到右依次提供出来,
则索引都可以使用,
但如果左面内容模糊,右面提供什么信息也无法使索引生效,
2)那么同样的也就可以理解了,如果是联合索引,
那么从左到右提供第一索引,第二索引,是没有问题的,
但如果无法提供第一索引,则同样会导致索引失效,
3)索引就简单的使用要查找的内容,
如果使用表达式,则会导致索引失效,
4)同样的,如果使用函数,也会导致索引失效,
5)格式字符集要保持一致,索引是不会转换的,不一致也会导致索引失效,
6)系统后台算法得出不用索引效率更高时,会不通过索引。
五、其他注意事项
1)按需使用索引,索引是能提高查找效率,
但索引的创建和维护也是需要一定的代价,
那么查找较少或数据量较小情况下是可以选择不使用索引的,
2)innoDB主键就是索引,如果没有主键,系统后台会创建默认索引
总结
感觉数据库索引内容很多啊,这里先留个坑位,后面想到什么内容再回来补充