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