索引 概念原理
面试场景
1、谈谈你对数据库索引的理解
数据库索引其实就相当于字典上面的拼音目录,在进行大数据量查询时,是优化数据库性能的重要方法。
他可以快速定位到某个数据在哪一行,从而避免全文匹配,提高查询效率。
mysql索引的底层是采用B+TREE实现的,B+TREE是由 平衡二叉树 、 B树 过渡来的,
B+TREE的特点就是(为什么要采用B+TREE树呢?因为它有两个特点):
1)非叶子节点不存储数据,在叶子节点上存储数据,这样一个非叶子节点就能够存储更多的索引key,就能使树的度(degree)变大,I/O的效率变高
2)在叶子节点上面有指向相邻叶子节点的指针,这样就提高了范围查找的效率
mysql索引主要用到的是MyISAM和InnoDB两种存储引擎,
这两种存储引擎的区别是(这两种存储引擎有很大区别):
1)MyISAM的数据和索引是分开存储的,有单独的两个文件,属于非聚簇索引;而InnoDB是放在同一个文件里面存储的,他的数据文件本身就是主键索引文件,属于聚簇索引;
2)两者都支持B+TREE,但是都不支持hash
3)MyISAM是非事务安全型的,而InnoDB是事务安全型的
4)MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
应用场景:
1)MyISAM用来管理非事务表,他提供高速存储和检索,如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
2)InnoDB是事务安全型的,具有很多特性,如果应用中需要执行大量的INSERT或UPDATE操作,就应该使用InnoDB,这样就可以提高多用户并发操作的性能。
索引的好处:
创建索引可以大大提高系统的性能。
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
学习笔记
鲁班学院 https://www.bilibili.com/video/av37254744/?redirectFrom=h5
蚂蚁课堂 http://www.mayikt.com/course/video/2089
常用数据结构、算法动画演示 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
1、hash数据结构
就是根据字段值计算出hash值,从而进行定位
优点:查询速度快
缺点:不支持范围查询
2、平衡二叉树搜索树
参考链接:https://blog.csdn.net/tanrui519521/article/details/80935348
这是由二叉搜索树过渡来的,二叉搜索树的概念:
1)若他的左子树不为空,则左子树上所有节点的值都小于根节点的值
2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
3)它的左右子树也分别是二叉搜索树
但是二叉搜索树会有极端的情况,就是左右高度差过大,如下图所示
这棵树,说是树,其实它已经退化成链表了,但从概念上来看,它仍是一棵二叉搜索树,只要我们按照逐次增大,
如1、2、3、4、5、6的顺序构造一棵二叉搜索树,则形如上图。那么插入的时间复杂度就变成了O(n),
导致这种糟糕的情况原因是因为这棵树极其不平衡,右树的重量远大于左树,因此我们提出了叫平衡二叉搜索树的结构,
又称之为AVL树,是因为平衡二叉搜索树的发明者为Adel’son-Vel’skii 和Landis二人。
AVL树的性质:
1)左子树与右子树高度之差的绝对值不超过1
2)树的每个左子树和右子树都是AVL树
3)每一个节点都有一个平衡因子(balance factor),任一节点的平衡因子是-1、0、1(每一个节点的平衡因子 = 右子树高度 - 左子树高度)
做到了这点,这棵树看起来就比较平衡了,那么如何生成一棵AVL树呢?算法相对来说复杂,随着新节点的加入,树自动调整自身结构,达到新的平衡状态,这就是我们想要的AVL树。
当树不平衡时,我们需要做出旋转调整,有四种调整方法。
左单旋、右单旋、左右单旋、右左单旋
优点:可以支持范围查询
缺点:进行范围查询时,需要回旋,所以效率很低
3、B树
为了减少磁盘I/O次数,由平衡二叉搜索树过渡到了B树,
B树最大的特点就是一个非叶子节点上面可以放多个索引key(称为度),这样原来要搜四次,现在只要搜1次了;
4、B+树
在B树上面再做一层优化,形成了B+树,就是现在mysql使用的索引数据结构
B树只是一个根节点上可以同时存储多个元素,这样就减少了I/O操作
特点:
1)非叶子节点不存储数据,在叶子节点上存储数据,这样一个非叶子节点就能够存储更多的索引key,就能使树的度(degree)变大,I/O的效率变高
2)在叶子节点上面有指向相邻叶子节点的指针,这样就提高了范围查找的效率
备注
1)like模糊查询如果前面用了%,那是不会用到索引的
2)导致索引失效的条件
3)innodb是效率最高的,使用主键索引,不用辅助索引
4)B-Tree索引是B+树吗?
5)innodb的.ibd文件保存了数据和索引
=》Myisam的.MYD是保存的数据文件,.MYI保存的索引文件
6)索引属于存储引擎级别的概念,主要包括MyISAM、InnoDB、Memory引擎等