看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!
索引是帮助MySQL高效获取数据的数据结构
提高数据查询的效率
索引:排好序的快速查找数据结构!索引会影响where后面的查找,和order by 后面的排序
1️⃣中所描述的是索引存储时保存的形式,2️⃣是索引使用过程中进行的分类,两者是不同层次上的划分。不过平时讲的索引类型一般是指在应用层次的划分。
就像手机分类,安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。
mysql默认存储引擎innodb只显示支持B-Tree(从技术上讲是B+Tree)。对于频繁访问的表,innodb会透明建立自适应has索引,即在B树索引基础上建立Hash索引, 可以显示提高查找效率,对于客户端时透明的,不可控的,隐式的。
基于Hash表实现,只有精确匹配索引所有列的查找才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个HashCode,并且Hash索引将所有的HashCode存储在引擎中,同时在索引表中会保持指向每个数据行的指针
B-Tree能够加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中 B+树是B-树的改进版本,同时也是Mysql数据库索引采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高
案例:假设有一张学生表,id为主键 在MyISAM引擎中的实现(二级索引也是这样实现的) 在InnoDB中的实现
问:为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?
hash:虽然可以快速定位,但是没有顺序,IO复杂度高。[???]二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高红黑树:树的高度随着数据量增加而增加,IO代价高。问:为什么官方建议使用自增长主键作为索引。
结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,也只会分裂很少一部分。并且能够减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。