之前朋友在面试的时候被问到了许多关于索引的问题,而索引这个词一直也是我们在开发中最最最常见的,也是很多在进行代码优化的时候会去做的一件事情,所以今天我们来说说面试中关于索引的那点事。
索引
什么是索引?
索引其实是数据库的一种术语,在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
但是面试的时候一般不会问你索引是什么?而是喜欢去问,为什么要去使用索引,它的底层是怎么实现的?那数据库又应该怎么去优化呢?下面我们就从这三个方面去解释一下这些面试中的要点信息。
索引底层实现
索引的实现通常使用B树及其变种B+树。
B-Tree 是最常用的用于索引的数据结构。因为它们是时间复杂度低, 查找、删除、插入操作都可以可以在对数时间内完成。另外一个重要原因存储在B-Tree中的数据是有序的。
哈希表是另外一种你可能看到用作索引的数据结构-这些索引通常被称为哈希索引。使用哈希索引的原因是,在寻找值时哈希表效率极高。所以,如果使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出的值。
我们以MySQL数据库的索引为例子。
既然说到了索引的实现是通过B树和变种B+树,那我们来说说这个B树和B+树。
B树
我们看个图。图中所示,B树事实上是一种平衡的多叉查找树,也就是说最多可以开m个叉(m>=2),我们称之为m阶b树,我给大家多画一点内容,这也是我专门看视频的时候记录下的一些自己的心得。
![e50fd38819fb03f7804cd763596bf609.png](https://img-blog.csdnimg.cn/img_convert/e50fd38819fb03f7804cd763596bf609.png)
图中其实画的是比较简单的,但是如果说我们画一个三阶的,这个时候就可以是这样子的