1.为什么要使用索引
首先我们了解一下全表扫描,即将整张表的数据全部或者分批次加载到内存当中,而存储的最小单位是块或者页,它们是由多行数据而组成的,将这些块或者页都加载进来,逐个块或者页去轮询,找到目标数据并返回,这种方式普遍认为是非常慢的。因此,在很多情况下,我们要避免全表扫描的情况发生,所以数据库要引入一种更为高效的机制——索引,它的灵感来源于字典,在字典中只要把关键信息组织起来,比如偏旁部首,查询的时候依据这些信息的指引就能查询到页面,很快就定位到要查的字了,而这些关键信息和及这些查找数据的方式便组成了索引。
2.什么样的信息可以作为索引
主键、唯一键及普通键等。
3.索引的数据结构
- 生成索引,建立二叉查找树进行二分查找
- 生成索引,建立B-Tree结构进行查找
- 生成索引,建立B+-Tree结构进行查找
- 生成索引,建立Hash结构进行查找
• 二叉查找树
二叉查找树是每个结点最多有俩个子节点的数据结构,通常子树被称为左子树或者右子树,而且每个结点的左子树均小于该结点,右子树均大于该结点。所以。使用二叉查找树确实能提升查询效率。此树还是一颗平衡二叉树,平衡二叉树就是任意一个结点的左子树和右子树的高度差的绝对值不大于1。二叉查找树用的是二分查找,比如搜索6,6比5大,因此要从5的右孩子查找,此时来到了7,7比6大,因此查7的左孩子,这样就定位到了6,因为是对半搜索,所以时间复杂度为O(logn)。
而二叉查找有明显的缺陷,假设数据库中对数据进行增加和删除操作,如果此时将结点2、结点6删除,同时先后增加值为11和值为13的结点,如图所示。根据二叉查找树的特性,会形成线性二叉树,如图所示,查询复杂度会变为O(n),大大降低了查找效率。影响数据检索速率最根本的原因是IO,即数据库文件的读写,就是将硬盘的数据读到内存中,而二叉树在检索深度每次加1后都需要读取一个结点执行一次IO,效率很低。所以我们需要既能降低时间复杂度,又降低IO次数的数据结构,B+树。