深入理解 MySQL 主键和唯一(unique)索引
1、主键和唯一索引的区别
1.1 主键一定时唯一性索引,唯一性索引并不一定是主键
1.2 一个表中可以有多个唯一性索引,但只能有一个主键
1.3 主键不允许有空值,而唯一索引允许有空值
1.4 主键可以被其他字段作外键引用,而唯一性索引不能
2、主键 和 唯一索引 谁更快
InnoDB使用B+树作为索引结构。在B+树中,将节点分为叶子结点和非叶子节点,非叶子节点上保存的是索引,而且一个节点可以保存多个索引,数据全部存于叶子节点上,根据叶子节点的内容不同,InnoDB索引分为主键索引和非主键索引。
例如对于下面这个表,且ID是主键
主键索引和非主键索引的示意图如下:
其中 R 代表一整行的值
非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也成为聚簇索引。
根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。
1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。
2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。
也就是说,非主键索引查询会比主键查询多搜索一棵树。
3、为什么建议使用主键自增的索引?
这是一颗主键索引的树
如果我们插入 ID = 650 的一行数据,那么直接在最右边插入就可以了
但是如果插入的是 ID = 350 的一行数据,由于 B+ 树是有序的,为了维持树的有序性,叶子节点将会进行挪动,此时,如果在已经存储满状态的数据页中插入节点,将会申请新的数据页,将部分数据挪动到新的数据页,这个过程称为页分裂。
页分裂除了会影响性能,还会降低磁盘空间的利用率。不规则数据插入时,会造成频繁的页分裂。
整理不易,你的点赞、关注是对我最大的鼓励
深入理解 MySQL 主键和唯一(unique)索引相关推荐
- mysql主键和唯一索引_主键和唯一索引的有什么区别
主键和唯一索引的区别 -- 区别 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值 ...
- mysql主键和唯一索引_mysql 主键和唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空 ...
- mysql 主键和唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空 ...
- mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...
聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...
- mysql主键索引需要创建_mysql主键还需要建立索引吗?
mysql主键不需要建立索引,主键具备索引的功能:当创建或设置主键的时候,mysql会自动添加一个与主键对应的唯一索引,不需要再做额外的添加.数据库管理系统对于主键会自动生成唯一索引,所以主键是一个特 ...
- MySQL主键的理解
MySQL主键的理解 主键(primary key )没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为"PRIMARY KEY",主键不能重复,一个表只能 ...
- mysql 主键理解_MySQL主键的理解
MySQL主键的理解 主键(primary key)没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为"PRIMARY KEY",主键不能重复,一个表只能有 ...
- MySQL 之 约束 (主键、唯一、非空、自增、外键)
MySQL 之 约束 (主键.唯一.非空.自增.外键) 目的:使得数据更准确,更完整. 约束的分类: 1.键约束 (1)主键约束 (2)唯一键约束 (3)外键约束 2.非空约束 3.默认值约束 4.自 ...
- MySQL主键索引和唯一索引区别
MySQL主键索引和唯一索引区别 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结 ...
- mysql唯一索引和联合索引的区别_mysql中,索引,主键,唯一索引,联合索引的区别...
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度. ...
最新文章
- Objective C 中的nil,Nil,NULL和NSNull理解
- lhgdialog 4.2.0 正式版发布
- (二)spring cloud微服务分布式云架构-整合企业架构的技术点
- Everything(速度快的文件搜索软件) 1.4.1.801b 汉化绿色版
- Silverlight Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
- Mac022-brew安装tool
- dump mysql database,Mysql Database 逻辑备份: mysqldump
- 中国临床数据分析市场趋势报告、技术动态创新及市场预测
- 分支 getchar和putchar
- (转)深入理解Java的接口和抽象类
- ajax离开页面方法,jQuery中ajax调用当前页面方法
- Android IPC(一)跨进程通讯的几种方式、作用
- Memcached内存分配机制
- GB28181的协议详解
- maplab(2):ROVIOLI简介
- php定做单城市公交路线查询系统
- Angular 三目运算符
- Adaptive AUTOSAR 简介 (2021版)
- 3、NC系统接口集(持续更新)
- 修改远程桌面3389端口
热门文章
- Bash玩转脚本3之几个指令有趣的筛选京东评价
- 生先森依旧怀抱初心,满载爱意
- 国王匿名信息服务器,扮国王还是卫兵? 角色扮演服务器登录美服
- ReversingWithLena——01. Olly + assembler + patching a basic reverseme
- 城市引力模型——城市经济联系度制作
- Flink Back Pressure(背压)实现与监控
- 全局序列比对 c语言实现,序列比对(一)——全局比对Needleman-Wunsch算法
- 2020大疆数字IC校招笔试题(3)——CMOS 反相器【CMOS逻辑】【MOS管】【PMOS】【NMOS】
- DNW的详细配置及使用过程
- 经验分享:利用树莓派开发板制作无线路由器