mysql 是怎样运行的笔记

第六章:快速查询的秘籍-B+树索引

建立一个索引的方式,

在讲到用户数据存取到的是在页中的时候,讲述到这些数据的存放规律,以及其他的存取内容
第一点:用户是按照主键大小从小到大的方式排序成一个单向链表。
第二点,每页之间的页码不是按照顺序来的,当数据达到页最大的存储时就会分页
第三点:数据量这么多,我们该如何快速的去定位到我们想要的数据呢?
innodb的做法是延用了页的结构,将每个用户页中取最小的主键值作为新的一页的标识,
组内的key值是数据的主键值,value是具体的页码。这个新的页就是目录页,能够帮助我们
很好的定位到数据在那一页。这个新页为了区分用户的数据页,就用record_type
=1的时候表示是目录项记录,=0就是普通的用户记录。
第四点:如果数据量实在太大了,我们可以在重复上一个步骤,在生成一个范围更广的目录页,
就像是一个多级目录一样,大目录嵌套小目录,小目录嵌套更小的目录

查找的方式就是通过先在目录页中按照二分法就行定位到那个用户数据页上,接着在该页也用
二分法定位具体的哪一行数据


这个页的关系可以看成是一颗树也就是我们说的B+树,每个非叶子节点就是我们的目录项页,
叶子节点就是我们用户数据页。B+树我们也称为是索引。更具体一点就是聚簇索引


上面讲到的聚簇索引是只有查询条件为主键的时候才能使用,那如果我们查询条件不是其他列,
是否可以建立B+树(索引)呢?也是可以的,只不过这颗B+树的叶子节点(用户页)上
存的数据就不是完整的用户数据了,上面只有当前查询列和主键列2个字段。这个索引也被称为二级索引。所以如果你想要根据这个查询条件获取所有信息,就只能再去聚簇索引(B+树)上查询一遍。这种通过携带主键信息到聚簇索引中重新定位完整的用户记录的过程称为回表。
因为不是主键,所以查询得到的结果可能是不唯一,多条数据符合。
所以在查询叶子节点的时候,会从第一条符合条件的数据不断的往后面页查找,直到找不到为止。
要注意的是,查询到一条符合条件的数据后,就立马去回表操作,然后在回来接着查询符合条件的列。
 

你可能感兴趣的:(mysql,笔记,数据库)