〇、MySQL索引有哪些分类?按照数据结构的分类,可以分为:B+树索引、Hash索引、Full-text索引。按照物理存储的分类,可以分为:聚簇索引、二级索引(辅助索引)。根据字段特性可分为:主键索引、普通索引、前缀索引。根据字段个数可分为:单列索引、联合索引(复合索引、组合索引)。1、按数据结构分类MySQL索引按数据结构分类可分为:B+树索引、Hash索引、Full-text索引。-InnoDBMyISAMMemoryB+树索引√√√Hash索引××√全文索引√(MySQL5.6+)√×注:InnoDB其实是支持Hash索引的,只是InnoDB中Hash索引的创建是由存储引擎自动优化的它不可能手动干预是否为表创建Hash索引。B+树是MySQL中存储引擎使用最广泛的索引类型。B+tree中的B代表balance,不是binary,因为B+tree是从最早的平衡二叉树演化而来的。下面是B+树数据结构与其他数据结构的对比。1、B+tree和B-tree的比较。B树中的每个节点可以根据实际情况包含多条数据信息和子节点。B+tree与B-tree相比有以下两点不同:B+tree的非叶子节点只存储key-value信息,数据记录存储在叶子节点中。B树的非叶子节点也存储数据。因此B+树单个节点的数据量更小,在相同的磁盘I/O数下可以查询更多的节点。B+tree的所有叶子节点都是通过单链表连接起来的。适用于MySQL中常见的基于范围的顺序检索场景,而B-tree做不到这一点。2、B+树与红黑树的比较(图片来自网络)红黑树是一种弱平衡二叉搜索树。通过限制节点在从根到叶的任何一条路径上的着色方式,红黑树确保没有一条路径是另一条路径的两倍长。对于一棵有N个叶子节点的B+树,其搜索复杂度为O(logdN),其中d(degree)为B+树的度数,表示一个节点最多允许有子节点数为d。在实际应用中,d的取值一般都大于100,即使数据量达到千万级别,B+树的高度依然保持在3-4左右,保证了目标数据能够在3-4次磁盘I/O操作后被查询。红黑树是一棵二叉树,节点和子节点的个数都是2,也就是说它的搜索复杂度是O(logN),树的高度会比B+树高很多,所以红黑树检索到目标数据。更多的磁盘I/O要经过。3、B+树和Hash的比较Hash索引结构的特殊性,它的检索效率非常高,索引检索可以一次性定位,不像B-Tree索引需要从根节点开始到分支节点,最后访问页面节点。多次IO访问,因此Hash索引的查询效率远高于B-Tree索引。Hash索引虽然高效,但是由于其特殊性,Hash索引本身也有很多局限和不足,主要有以下几点。哈希索引只能满足=、IN和<=>(代表NULL-safe等价)查询,不能使用范围查询。由于Hash索引比较的是Hash运算后的Hash值,因此只能用于等值过滤,不能用于基于范围的过滤,因为无法确定对应的Hash算法处理后的Hash值之间的大小关系。保证和Hash运算前完全一样。哈希索引不能用于对数据进行排序。由于Hash索引存储的是Hash计算后的Hash值,而Hash值的大小关系不一定与Hash运算前的key值完全相同,所以数据库无法利用索引数据来避免任何排序操作;哈希索引不能使用部分索引键进行查询。对于组合索引,在计算Hash值时,Hash索引是将组合索引的key组合在一起后计算Hash值,而不是单独计算Hash值。也不能被利用。Hash索引还需要扫描回表。Hash索引是将索引键进行Hash运算后,将Hash运算结果的Hash值和对应的行指针信息存储在一个Hash表中。由于不同的索引键可能有相同的Hash值,即使满足某个Hashkey值数据的记录条数也无法直接从Hash索引中查询到。还是需要和access表中的实际数据进行对比,得到相应的结果。在大量Hash值相等的情况下,Hash索引的性能不一定比B-Tree索引高。对于选择性比较低的索引键,如果创建Hash索引,同一个Hash值中会存储大量的记录指针信息。这样定位某条记录会很麻烦,而且会浪费多次表数据访问,导致整体性能低下。由于范围查询是MySQL数据库查询中常见的场景,Hash表不适合范围查询,更适合Equivalence查询。此外,哈希表还存在哈希函数选择、哈希值冲突等问题。因此,B+树索引比Hash表索引有更广泛的应用场景。2、按照物理存储的分类,MySQL索引根据叶子节点是否存储完整的表数据分为聚簇索引和二级索引(辅助索引)。整个表的数据都存储在聚簇索引中,聚簇索引以外的其他索引称为二级索引,也叫辅助索引。1、聚簇索引聚簇索引的每个叶子节点存储了完整的一行表数据,叶子节点按照id列递增连接,可以方便顺序检索。(图片来自网络)InnoDB表必须有聚簇索引。默认情况下,聚集索引建立在主键字段上。在没有主键字段的情况下,表的第一个非空唯一索引将被建立为聚集索引,在没有前两者的情况下,InnoDB会自动生成一个隐式自增id列,并建立一个此列上的聚集索引。使用MyISAM作为存储引擎的表没有聚簇索引。MyISAM表中主键索引和非主键索引的结构是一样的。索引的叶子节点不存储表数据,而是存储表数据的地址。因此,MyISAM表可以没有主键。(图片来源于网络)MyISAM表的数据和索引是分开存放的。MyISAM表的主键索引和非主键索引的区别在于主键索引的B+树上的键必须满足主键的限制,而B+树上的键非主键索引只需要满足对应字段的特征即可。2.二级索引二级索引的叶子节点并不存储完整的一行表数据,而是存储聚簇索引所在列的值。(图片来自网络)回表查询由于二级索引的叶子节点不存储完整的表数据,所以索引通过二级索引查询到聚簇索引的列值后,需要返回到聚簇索引,也就是表数据本身得到进一步的数据。(图片来自网络)回表查询需要额外的B+树查找过程,势必会增加查询的时间消耗。需要注意的是,通过二级索引查询时,回表并不是必须的过程。当SELECT的所有字段都可以在一个二级索引中找到时,就不需要回表了。MySQL此时调用二级索引作为索引被覆盖或者索引覆盖被触发。可以使用Explain命令查看SQL语句的执行计划。如果执行计划的Extra字段中出现Usingindex,则表示查询触发了索引覆盖。3、按字段特性分类MySQL索引按字段特性可分为:主键索引、普通索引、前缀索引。1.主键索引建立在主键上的索引称为主键索引。一张数据表只能有一个主键索引。索引列值不允许空值,一般在建表时一起创建。2、唯一索引建立在UNIQUE字段上的索引称为唯一索引。一个表可以有多个唯一索引。索引列值允许为空,列值中多个空值不会引起重复冲突。3.普通索引建立在普通字段上的索引称为普通索引。4、前缀索引前缀索引是指建立在字符型字段的前几个字符或二进制型字段的前几个字节上的索引,而不是建立在整个字段上的索引。可以在char、varchar、binary、varbinary类型的列上建立前缀索引,可以大大减少索引占用的存储空间,提高索引的查询效率。4、按索引字段数分类MySQL索引按字段数可分为:单列索引、联合索引(复合索引、组合索引)。1.单列索引建立在单列上的索引称为单列索引。2.联合索引(复合索引、复合索引)建立在多列上的索引称为联合索引,也称为复合索引或复合索引。
