- 各个数据页可以组成一个双向链表
- 每个数据页中的记录又可以组成一个单向链表
每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
所以说,如果写select * from tab where name = 'xxx'
这样没有进行任何优化的 sql 语句,默认会这样做:
- 定位到记录所在的页:需要遍历双向链表,找到所在的页。
- 从所在的页内中查找相应的记录:由于不是根据主键查询,只能遍历所在页的单链表。
很明显,在数据量很大的情况下这样查找会很慢!这样的时间复杂度为O(n)。
索引做了什么可以让查询加快速度呢?其实就是将无序的数据变成有序(相对):
很明显:没有用索引是需要遍历双向链表来定位对应的页,现在通过“目录”就可以很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))。其实底层结构就是B+树,B+树作为树的一种实现,能够很快地查找出对应的记录。