美文网首页
MySQL为什么一定要有一个主键

MySQL为什么一定要有一个主键

作者: Jokerone_ | 来源:发表于2017-05-11 15:39 被阅读0次

无特殊需求下Innodb建议使用与业务无关的自增ID作为主键
InnoDB引擎使用聚集索引,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)
1、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如下图所示:


这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。
2、 如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:

此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。
mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。此时需对表进行优化,这样才会使查询变得更有效率。

innodb如何选择一个聚集索引
对于innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,innodb会如何处理呢。请看如下规则

  1. 如果一个主键被定义了,那么这个主键就是作为聚集索引
  2. 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
  3. 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增。

还有一个需要注意的是:
次级索引的叶子节点并不存储行数据的物理地址。而是存储的该行的主键值。
所以:一次级索引包含了两次查找。一次是查找次级索引自身。然后查找主键(聚集索引)

MySQL为什么需要一个主键
MySQL索引背后的数据结构及算法原理

相关文章

  • MySQL为什么一定要有一个主键

    无特殊需求下Innodb建议使用与业务无关的自增ID作为主键InnoDB引擎使用聚集索引,数据记录本身被存于主索引...

  • 主键和唯一索引的区别

    主键和唯一索引的区别主要有以下几点:1)主键一定会创建一个唯一索引,有唯一索引的列不一定为主键;2)主键不允许空值...

  • 第一次商讨

    1. 数据库 Mysql Oracle 主键,Oracle 用Sequence生成主键,主键唯一,各表共用一个自增...

  • MySQL主键与索引

    今日格言:让一切回归原点,回归最初的为什么。 本篇讲解 Mysql 的主键问题,从为什么的角度来了解 Mysql ...

  • 蓝信移动面经03-26

    自我介绍 mysql 事务机制 acid 引擎索引为什么用B+树主键索引和非主键索引区别select。。。wher...

  • 2018-07-09 复合主键

    Mysql 多列形成主键(复合主键 ) 什么是数据表的复合主键所谓的复合主键 就是指你表的主键含有一个以上的字段组...

  • MySQL 表设计要注意什么?

    问题1:为什么一定要设一个主键?回答:因为你不设主键的情况下,innodb也会帮你生成一个隐藏列,作为自增主键。所...

  • 重新学习Mysql数据库4:Mysql索引实现原理

    MySQL索引类型 一、简介 MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索...

  • mysql操作数据库

    MYSQL主键自增用法

  • MySQL--索引

    MySQL索引 查看索引 创建索引 创建唯一索引 创建主键索引 删除索引 删除主键 MySQL视图 创建视图 删除...

网友评论

      本文标题:MySQL为什么一定要有一个主键

      本文链接:https://www.haomeiwen.com/subject/mlpotxtx.html