没有索引的时候查询
- 1.如果只有一个数据页,根据主键查询 可以根据页目录二分法查询。如果是非主键只能是从最小记录遍历查询。
- 2.如果有多个数据页,必须定位到记录所在的页,然后按照步骤1.但是定位记录所在的页在没有索引的情况下只能遍历。
索引
索引页的基本构成
- 1.索引页分为数据页和目录页
- 2.新分配的页的号码不一定基于上一个的号码
- 3.页之间是双链表
- 4.索引就是B+数,存放我们用户记录的那层为第0层
- 5.页内记录是单链表
数据页的记录
- 1.完整的用户记录
数据页注意点
- 1.下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值
- 2.如果新增一个记录,而原来的页又放不下,此外主键记录小于当前页的最大值,因此要讲当前页的最大值分配到下一个页--页分裂。
目录页的记录
- 1.页(数据页或者目录页)的用户记录中的最小主键值(如果是非主键索引,就是对应的索引列值)
- 2.页号--该页号对应的是其指向的下一页的页号。
- 3.主键值
聚簇索引
- 1.也就是主键索引,叶子节点存放真正数据。
二级索引
- 1.非主键索引就是二级索引
- 2.目录页存放的是索引列值,主键值,页号
- 3.数据页存放的是索引列值和对应的主键值。
- 4.如果查找的包含的内容多于不是主键和索引列,则还需要回表(即回到主键索引)
联合索引
- 1.联合索引的多个列和页号组成目录项
- 2.联合索引的多个列和主键以及页号组成数据页
- 3.本质上属于联合索引
- 4.联合主键中先按照第一个列排列,如果第一个列相同在比较第二个列。如果有第三个就继续比较。(前提是前面必须相等)
InnoDB的B+树索引的注意事项
- 1.每当为某个表创建一个B+树索引(聚簇索引不是人为创建的,默认就有)的时候,都会为这个索引创建一个根节点页面
- 2.最开始表中没有数据的时候,每个B+树索引对应的根节点中既没有用户记录,也没有目录项记录。
- 3.随后向表中插入用户记录时,先把用户记录存储到这个根节点中。
- 4.当根节点中的可用空间用完时继续插入记录,此时会将根节点中的所有记录复制到一个新分配的页
- 5.一个B+树索引的根节点自诞生之日起,便不会再移动
- 6.根节点的页号便会被记录到某个地方,然后凡是InnoDB存储引擎需要用到这个索引的时候,都会从那个固定的地方取出根节点的页号,从而来访问这个索引。
拾遗
- 1.如果目录页中的只有索引列和页号的话,假如索引列值是一样的则会导致新加入的记录无法寻找适合的插入页
- 2.因此面对这种情况都会把该记录的主键加进来进行区分
- 3.一个页面最少存储2条记录
网友评论