引荐课程:MySQL教程。
InnoDB引擎表的特性
1、InnoDB引擎表是基于B+树的索引构造表(IOT)
关于B+树
B+ 树的特性:
一切关键字都出如今叶子结点的链表中(浓密索引),且链表中的关键字恰好是有序的;
不能够在非叶子结点掷中;
非叶子结点相称因而叶子结点的索引(希罕索引),叶子结点相称因而存储(关键字)数据的数据层;
2、假如我们定义了主键(PRIMARY KEY),那末InnoDB会挑选主键作为群集索引、假如没有显式定义主键,则InnoDB会挑选第一个不包括有NULL值的唯一索引作为主键索引、假如也没有如许的唯一索引,则InnoDB会挑选内置6字节长的ROWID作为隐含的群集索引(ROWID跟着行纪录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
3、数据纪录自身被存于主索引(一颗B+Tree)的叶子节点上。这就请求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据纪录按主键递次寄存,因而每当有一条新的纪录插进去时,MySQL会依据其主键将其插进去恰当的节点和位置,假如页面到达装载因子(InnoDB默以为15/16),则拓荒一个新的页(节点)
4、假如表运用自增主键,那末每次插进去新的纪录,纪录就会递次添加到当前索引节点的后续位置,当一页写满,就会自动拓荒一个新的页
5、假如运用非自增主键(假如身份证号或学号等),因为每次插进去主键的值近似于随机,因而每次新纪录都要被插到现有索引页得中心某个位置,此时MySQL不能不为了将新纪录插到适宜位置而挪动数据,以至目的页面能够已被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读返来,这增加了许多开支,同时频仍的挪动、分页操纵造成了大批的碎片,得到了不够紧凑的索引构造,后续不能不通过OPTIMIZE TABLE来重修表并优化添补页面。
综上总结,假如InnoDB表的数据写入递次能和B+树索引的叶子节点递次一致的话,这时候存取效力是最高的,也就是下面这几种状况的存取效力最高:
运用自增列(INT/BIGINT范例)做主键,这时候写入递次是自增的,和B+数叶子节点破裂递次一致;
该表不指定自增列做主键,同时也没有能够被选为主键的唯一索引(上面的前提),这时候InnoDB会挑选内置的ROWID作为主键,写入递次和ROWID增进递次一致;
除此以外,假如一个InnoDB表又没有显现主键,又有能够被挑选为主键的唯一索引,但该唯一索引能够不是递增关联时(比方字符串、UUID、多字段团结唯一索引的状况),该表的存取效力就会比较差。
以上就是MySQL为何主键自增的细致内容,更多请关注ki4网别的相干文章!