1.索引
索引存在的意义主要是为了提高查询的效率,参考一本书,书有目录这样想找自己想要的内容翻看目录就快了许多,没有目录就需要一页一页的找.
索引的代价
有了索引虽然提高了查询的效率但是降低了增删改的效率,一本书每次修改内容就需要修改目录这就变得很麻烦.并且索引也消耗了更多的空间.
~~在插入新的数据的时候,既要改变硬盘上新的数据,又要调整索引.
但是引入索引是值得的在实际的开发过程中,查的使用次数,要远远大于增删改的次数.
索引背后的数据结构
它背后的数据结构是B+树
了解B+树之前我们先了解一下B树
B树是一个N叉搜索树
B树中的值是不会重复出现的
每个节点上可能存在N-1个值,也可能会更少,N-1个值,就把区间划成了N份
这样就使树的高度降低了在进行数据的查找时候IO次数就减少了
B+树
1.一个节点可以存N个key,N个key划分出N个区间(而不是N+1个区间)
2.每个节点的key都会在子节点中出现,并且是每个子节点的最大值
3.B+树的叶子节点会首尾相接,相当于一个链表
这个时候非常方便范围查找
4.正是因为叶子节点,是完整的数据集合,只在叶子节点中储存数据表中的每一行数据,只需在非叶子节点中存储key值即可.减少了内存开支,非叶子节点也可能在缓存中,进一步减少了IO次数.
从图可以看出B+树的叶子节点包含整个树中所有的数据.
B+树的优势
1.每个节点都存更多的key值,树的高度降低了,访问IO次数减少了
2.所有查询结果都会落在叶子节点上,所以访问每个数据的IO次数都相同.