一、数据结构

1、B-tree(一个结点16KB,一页大小)

        A、叶子节点具有相同的深度,叶子节点的指针为空

        B、所有索引元素不能重复

        C、结点中的索引从左到右递增

mysql无主键表的隐患_主键

2、B+Tree(一个结点16K,一页大小)

       A、非叶子结点不存储数据,只存储索引(冗余),可以放更多索引

       B、叶子结点包含所有索引字段(索引+数据)

       C、叶子结点直接指针双向连接,便于提高区间访问的性能

      优点:

        A、B+Tree的数据存储是连续的,便于范围查询

        

mysql无主键表的隐患_数据库_02

二、innoDB存储引擎(对应表)

        1、表数据文件就是按B+Tree组织的一个索引文件

        2、聚集索引。主键对应的索引文件,叶子结点包含了索引和完整的数据记录

                 非主键对应的索引文件(自定义的索引),叶子结点存储索引和主键id值,通过id值获取主键索引文件的数据。目的是节省存储空间和保持一致性。

为什么建议innoDB表必须使用主键,并且推荐使用数字类型的自增主键

        使用主键原因:innoDB的数据文件就是一个B+Tree组织的一个索引文件。如果没有设置主键,mysql会默认创建一列row_id 来作为默认主键,影响数据库系统的性能。

        使用数字作为主键的原因:mysql的字符串类型,需要按一个个字符进行比较,先把字符转化为ASCII码然后比较,相等之后还得继续比较,直到得出结果,影响访问效率。而数字直接拿来对比。

        自增主键的原因:mysql会默认维护B+TREE,当不按顺序插入数据时,比如插入数字顺序5,7,8,6,假设插入5,7,8之后已经使用完了一页的磁盘空间,当插入6时,系统维护B+Tree,会增加新的一页,然后把7,8取出来,再把6,7放进去,而8放在新的一页。如果按顺序插入,就不会发生这个问题。