这篇文章只打算介绍InnoDB以B+ Tree为基础的索引模型,并不过多的从源码细节上分析
InnoDB的索引全貌大致是(引用自B+Tree index structures in InnoDB):
其中(只能保证大致上正确):
- 树高度的定义:叶子节点是0,父节点高度是子节点高度+1
- 每一个Record由Key + Value组成:
- 中间节点的Value:是一个Pointer(page_no),指向一个下一高度的一个Page(可能是中间节点,可能是叶子节点)
- 中间节点的Key:是Pointer指向的Page中最小的Key
- 叶子节点的Value:非主键列
- 叶子节点的Key:主键列
- 同一高度的Page连接成“双向链表”,称作Page List
- 同一Page的Record连接成“单向链表”,称作Record List(按Record的Key升序连接)
- Infimum(下确界):一个Page中,Record List的头节点
Supremum(上确界):一个Page中,Record List的尾节点
查找的实现
在InnoDB中,对索引的查找是通过三个函数实现:
btr_cur_search_to_nth_level:通过对整个B+树的“二分查找”,定位到Page
- page_cur_search_with_match:在一个Page内“二分查找”(使用Page中的Slot),定位到Record
- cmp_dtuple_rec_with_match_low:比较定位的Record是否是需要的Record