01。前言看了很多关于索引的博客,说的都是同一个东西。但是关于索引的一些概念一直没搞懂,比如B-Tree索引,Hash索引,唯一索引……可能有很多人和我一样,在不了解概念的情况下开始研究B-Tree,B+Tree等结构,导致面试时回答不相关!什么是索引?索引是一种数据结构,可以帮助MySQL高效地检索数据。指数能做什么?提高数据查询效率。索引:用于快速查找的排序数据结构!索引会影响where之后的查找和orderby之后的排序。02.索引分类从存储结构上分为:BTree索引(B-Tree或B+Tree索引)、Hash索引、全索引全文索引、R-Tree索引。从应用层面划分:普通索引、唯一索引、复合索引根据数据的物理顺序和键值的逻辑(索引)顺序关系:聚簇索引、非聚簇索引。第一点描述了索引存储的形式,第二点是索引使用过程中的分类。两者分不同层次。但是,我们平时所说的索引类型,一般是指应用层面的划分。就像手机分类:安卓手机、IOS手机和华为手机、苹果手机、OPPO手机。普通索引:即一个索引只包含单列,一张表可以有多个单列索引唯一索引:索引列的值必须是唯一的,但允许空值):它不是一个单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现。InnoDB的聚集索引实际上将B-Tree索引(技术上是B+Tree)和数据行保存在同一个结构中。非聚集索引:要么是聚集索引,要么是非聚集索引(严肃脸)。03.索引的底层实现mysql默认的存储引擎innodb只明确支持B-Tree(技术上讲,B+Tree)索引。对于频繁访问的表,innodb会透明地构建一个自适应的哈希索引,即在B树索引的基础上建立哈希索引,可以显着提高查找效率,并且对客户端透明、不可控、隐式。不谈存储引擎,只讨论基于哈希表的(抽象的)哈希索引的实现,只有与索引的所有列完全匹配的查询才有效。对于每一行数据,存储引擎会为所有的索引列计算一个哈希码(hashcode),哈希索引会将所有的哈希码存储在索引中,并在索引表中保存指向每一行数据的指针。B-Tree索引(MySQL使用B+Tree)B-Tree可以加速数据访问,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之间。B+Tree索引是B-Tree的改进版,也是数据库索引使用的存储结构。数据都在叶子节点上,加上顺序访问指针,每个叶子节点指向相邻叶子节点的地址。与B-Tree相比,在进行范围搜索时,只需要找到并遍历两个节点。B-Tree需要获取所有节点,相比之下B+Tree效率更高。与存储引擎讨论(一般默认使用B+Tree)案例:假设有一张以id为主键的student表idnamebirthday001Tom1996-01-01002Jann1996-01-04003Ray1996-01-08004Michael1996-01-10005Jack1996-01-13006Steven1996-01-23007Lily1996-01-25在MyISAM引擎中的实现(二级索引也是这样实现的)InnoDB中的实现04.问题:为什么索引结构默认使用B-Tree而不是hash、二叉树、红黑树?hash:虽然可以快速定位,但是没有顺序,IO复杂度高。二叉树:树的高度参差不齐,不能自平衡。查找效率与数据(树的高度)有关,IO成本高。红黑树:树的高度随着数据量的增加而增加,IO成本高。Q:为什么官方推荐使用自增主键作为索引。结合B+Tree的特点,自增主键连续,插入过程中尽量减少分页。即使需要分页,也只会分出一小部分。并且可以减少数据的移动,每次插入都是插入***。简而言之,就是减少分裂和移动的频率。Insertcontinuousdata:插入非时序数据
