面试题:MySQL为什么一定要有一个主键

面试题:MySQL自增主键为什么不是连续的? 提出这个问题,是因为在工作中发现 mysql 中的 user 表的 id 默认是自增的,但是数据库存储的结果却不是连续的。`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '递增id',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 阅读详情

什么是主键?

  • 唯一标识一行记录
  • msql:innodb:mysql会根据主键创建主键索引
  • 主键可以一个列,也可以联合主键
  • 主键的选择要:不重复、唯一、没有空值,长度固定、自增
  • MySQL中只要有主键会立刻根据主键创建主键索引表(B+树),叶子结点存储数据和索引,非叶子节点存储索引
  • 自增主键插入比较快,不会涉及到叶子结点分裂问题。

为什么一定要有主键?

        有主键查询速度会更快。如果没有主键,那么这些表就会依赖一个全局序列计数器生成的ROW_ID来构造一个隐式的聚簇索引,就会导致竞争引起性能问题。
没有主键,更新或删除表中特定行会很困难。

延申

聚簇索引和非聚簇索引

  1. 很简单记住一句话:找到了索引就找到了需要的数据,那么这个索引就是聚簇索引,所以主键就是聚簇索引,修改聚簇索引其实就是修改主键。(索引就是我们要找的数据)
  2. 索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。(找到了索引还要根据索引查询数据)

索引覆盖,索引下推,回表 

索引覆盖

索引覆盖是指查询操作可以完全通过索引来完成,而无需访问表中的数据行。当一个查询的所有数据需求都可以通过索引中的数据来满足时,就发生了索引覆盖。这样,数据库就不需要进行额外的数据查找,从而减少了磁盘I/O操作,提高了查询性能1。

例如,如果有一个查询语句是:

SELECT name, age FROM users WHERE name = '张三';

如果name和age都包含在一个索引中,那么这个查询就可以通过索引覆盖来完成,不需要回表查询。

索引下推

索引下推是MySQL 5.6及以上版本引入的优化技术。它允许在索引遍历过程中应用查询条件,从而减少访问不必要数据的次数。这意味着数据库引擎会在索引层面过滤数据,而不是在找到所有可能的索引后再在服务器层面进行过滤2。

例如,对于查询:

SELECT * FROM users WHERE name LIKE '张%' AND age = 30;

在启用索引下推的情况下,数据库引擎会在遍历索引时直接应用age = 30的条件,而不是在找到所有姓张的记录后再进行过滤。

重要考虑事项

  • 索引覆盖的一个关键要求是查询中的所有列都必须在索引中。如果查询引用了索引中没有的列,那么就无法实现索引覆盖。

  • 索引下推可以显著减少因为回表操作而导致的性能开销。它通过在存储引擎层面进行更多的数据过滤,减少了服务器层面的工作量。

  • 在设计索引时,应该考虑查询模式,以便最大限度地利用索引覆盖和索引下推的优势。

回表

回表查询是数据库操作中的一个术语,特别是在使用索引进行数据检索时。它发生在使用非聚集索引(Secondary Index)进行查询时,索引中只包含了索引列的副本以及指向对应主键的引用。当查询语句中需要返回的列不在索引列上时,即使通过索引定位了相关行,仍然需要回表获取其他列的值。这意味着数据库需要进行两次查找:一次在非聚集索引上定位数据,一次在聚集索引或主键索引上获取完整的数据行。

代码示例

在MySQL中,如果有一个表,其中id是主键,而name有一个普通索引。当执行如下查询时:

SELECT * FROM table WHERE name = 'ls';

由于name列有一个普通索引,查询会首先使用这个索引。但是,普通索引只存储了name值和对应的主键id,并没有sex和type等其他信息。因此,数据库需要回到主键索引上,根据id再次查询以获取完整的数据行。

优化方法

为了避免回表查询,可以使用索引覆盖。这意味着查询涉及的所有列都包含在索引中,从而避免了第二次查询。例如,如果查询只涉及id和name:

SELECT id, name FROM table WHERE name = 'ls';

这样就不会发生回表查询。但如果查询包括sex列:

SELECT id, name, sex FROM table WHERE name = 'ls';

就需要回表查询,因为sex不在name索引中。解决这个问题的方法是创建一个包含name和sex的联合索引。

面试题:MySQL 自增主键一定是连续的吗? 自增锁是一种比拟非凡的表级锁。并且在事务向蕴含了 AUTO_INCREMENT 列的表中新增数据时就会去持有自增锁,假如事务 A 正在做这个操作,如果另一个事务 B 尝试执行 INSERT语句,事务 B 会被阻塞住,直到事务 A 开释自增锁。 阅读详情

相关推荐

用STM32手搓一个体温计

市面上大多额温计、测温计精度。

m0_61687959的博客 2375

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

主键(Primary Key)是关系数据库中的一个列或多列的组合,它的值能够唯一地标识表中的每一行记录。唯一性:主键的每个值都是唯一的,保证表中没有重复的记录。非空:主键列不能为NULL,必须有明确的值。唯一标识:通过主键,可以快速地找到指定的行数据,起到唯一标识记录的作用。在 MySQL 中,主键可以是单列(Single-column Primary Key)或多列的组合(Composite Primary Key)。MySQL 支持多种存储引擎,其中最常用的是InnoDB和MyISAM。

lssffy的博客 2266

SAGA GIS英文版进行地形分析,计算常用的地形因子等

SAGA GIS中文版是一款专业的自动化地球科学分析系统软件。SAGA GIS最新版界面简洁,操作简便,用户使用时输入要分割的影像,选择要计算特征的影像或者波段,设置越大,得到的斑块越大;反之,则越小,点击Okay,得到分割影像图。SAGA GIS中文版主要通过选择适合你影像的格式,加载影像。 SAGA GIS全称是System for Automated Geoscientific Analyses,是一种用于编辑空间数据的地理信息系统(GIS)计算机程序,它是免费的开源软件,SAGA GIS旨在为科学家

qq_35794085的博客 5642

MYSQL 为什么一定要有主键

MySQL 中虽然没有强制要求每个表都有主键,但从数据完整性、性能优化、维护便利性等多个角度出发,强烈建议为每个表定义主键。主键可以保证数据唯一性、加速查询、简化业务操作、避免冗余、提高系统可扩展性等。

有时间就写写代码 1461

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 538

新手必看:如何用R/qtl快速完成QTL定位分析(附实战代码)

本文为新手提供了使用R/qtl进行QTL定位分析的完整实战指南。内容涵盖从环境搭建、数据准备与清洗,到核心分析流程(包括遗传图谱计算、单QTL扫描、置换检验确定阈值)以及进阶结果可视化的全步骤。通过清晰的代码示例,帮助读者快速掌握这一数量遗传学关键分析技术,实现从数据到QTL峰值的完整分析闭环。

y7z8a的博客 498

mysql:什么是主键(primary key)?为什么一定要有主键?非主键索引结构(=非聚集索引=非聚簇索引)?什么是回表查询?

唯一标识一行记录msql:innodb:mysql会根据主键创建主键索引主键可以一个列,也可以联合主键主键的选择要:不重复、唯一、没有空值,长度固定、自增MySQL中只要有主键会立刻根据主键创建主键索引表(B+树),叶子结点存储数据和索引,非叶子节点存储索引自增主键插入比较快,不会涉及到叶子结点分裂问题。name:非主键索引会先根据 name索引表查询找到“lisi”,再根据主键索引表找到其他数据(回表。

maopalaoshu的博客 1833

某物data魔改与变种算法还原(含加解密Py纯算)

某物data加解密、设备指纹魔改、变异、自定义加密分析与纯算还原

吴秋霖的博客 1280

MySQL 为什么要有主键?关键要点深度解析

例如,在拥有百万条记录的用户表中,通过主键查询特定用户信息,瞬间就能得到结果,而如果没有主键,查询速度会大幅下降,严重影响系统性能。以订单表和用户表为例,订单表中的用户 ID 作为外键,引用用户表的主键,这样就能清晰地知道每个订单是由哪个用户创建的。如果没有主键,外键关联就无从谈起,数据之间的逻辑关系将变得混乱,无法保证数据的完整性和一致性。综上所述,MySQL 中的主键并非可有可无的存在,而是从数据唯一性、查询效率、表间关联、数据操作以及设计规范等多个关键要点上,深刻影响着数据库的性能和数据质量。

weixin_57172401的博客 690

8、内存交织技术详解

本文详细解析了内存交织技术的基本原理、工作机制及实现方式,探讨了其在提升内存访问速度和系统性能中的关键作用。文章还分析了内存交织的优缺点、实际应用场景以及与其他优化技术的结合应用,并提出了未来发展的可能方向,为理解与运用该技术提供了全面参考。

g9h0i1的博客 549

100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

努力让自己发光,对的人才能迎着光而来 13万+

为什么要⼀定要设置主键?

则innodb 会选择内置6字节⻓的ROWID作为隐含的聚集索引。所以,反正都要⽣成⼀个主键,那你还不如。主键,则innodb 会选择第⼀个不包含有NULL值的唯⼀索引作为主键索引、如果也没有这样的唯⼀索引,其实这个不是⼀定的,有些场景下,⼩系统或者没什么⽤的表,不设置主键也没关系,mysql最好是⽤⾃增。主键,主要是以下两个原因:如果定义了主键,那么InnoDB会选择主键作为聚集索引、如果没有显式定义。⾃⼰指定⼀个主键,提⾼查询效率!

qq_61141142的博客 300

手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界

Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。

QQ_778132974的博客 382

mysql 主键不连续_程序员经典面试题,MySQL自增主键为什么不连续

在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?即便是使用自增主键的表,也是可以指定主键的。假设当前的自增主键是X,我们指定的主键是Y,假如Y第二种出现间隔的原因,是因为Mysql插入失败了。首先我们要了解自增主键...

weixin_35906864的博客 402

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

mysql 主键 001_程序员经典面试题_001:MySQL自增主键为什么不连续

本文首发于公众号【苦味代码】,持续分享有深度的面试题今天和大家分享一道非常经典的面试题:MySQL自增主键为什么不连续?先说我整理的答案:事务回滚可能会引起MySql主键主键不连续增长,因为已经生成的主键不在回滚范围内MySql 8.0之前的版本或者innodb_autoinc_lock_mode设置为非2的值可以保证主键连续增长(原理分析请看下文)。insert... on duplicate ...

weixin_42519214的博客 210

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

mysql 自增 不是主键_程序员经典面试题,MySQL自增主键为什么不连续

在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?即便是使用自增主键的表,也是可以指定主键的。假设当前的自增主键是X,我们指定的主键是Y,假如Y第二种出现间隔的原因,是因为Mysql插入失败了。首先我们要了解自增主键...

weixin_29178069的博客 500

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

mysql建表语句主键自增_程序员经典面试题,Mysql自增主键为什么不连续

在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?即便是使用自增主键的表,也是可以指定主键的。假设当前的自增主键是X,我们指定的主键是Y,假如Y第二种出现间隔的原因,是因为Mysql插入失败了。首先我们要了解自增主键...

weixin_39603609的博客 390

mysql建表语句主键自增_程序员经典面试题,MySQL自增主键为什么不连续

在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?即便是使用自增主键的表,也是可以指定主键的。假设当前的自增主键是X,我们指定的主键是Y,假如Y<X,那么Mysql不会变更当前自增主键的最大值,只会检测是否有主...

weixin_39642687的博客 251

主键冲突报什么代码_程序员经典面试题,Mysql自增主键为什么不连续

在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?即便是使用自增主键的表,也是可以指定主键的。假设当前的自增主键是X,我们指定的主键是Y,假如Y第二种出现间隔的原因,是因为Mysql插入失败了。首先我们要了解自增主键...

weixin_42122838的博客 124

postgre 没有主键自增ma_程序员经典面试题,MySQL自增主键为什么不连续

在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?即便是使用自增主键的表,也是可以指定主键的。假设当前的自增主键是X,我们指定的主键是Y,假如Y<X,那么Mysql不会变更当前自增主键的最大值,只会检测是否有主...

weixin_29464593的博客 119

mysql 自增不连续_程序员经典面试题_001:MySQL自增主键为什么不连续

本文首发于公众号【苦味代码】,持续分享有深度的面试题今天和大家分享一道非常经典的面试题:MySQL自增主键为什么不连续?先说我整理的答案:事务回滚可能会引起MySql主键主键不连续增长,因为已经生成的主键不在回滚范围内MySql 8.0之前的版本或者innodb_autoinc_lock_mode设置为非2的值可以保证主键连续增长(原理分析请看下文)。insert... on duplicate ...

weixin_27717759的博客 298

为什么MySQL不推荐使用uuid作为主键?附面试题答案

前言 从接触编程就开始使用 Git 进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码、提交、合并等,更复杂的操作没有使用过,看过的教程也逐渐淡忘了,有些对不起 Linus 大神。 出来混总是要还的,前些天就遇到了 Git 里一种十分糟心的场景,并为之前没有深入理解 Git 命令付出了一下午时间的代价。 先介绍一下这种场景,我们一个项目从 N 版本升到 A 版本时引入了另一项目的 jar 包,又陆续发布了 B、C 版本,但在 C 版

m0_56613170的博客 508

MySQL面试:为什么用自增列作为主键

1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。 如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。 2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页16K)的各条

sfklyqh的博客 1015

MySQL 为什么建议使用自增主键?

点击上方“Java之间”,选择“置顶或者星标”你关注的就是我关心的!作者:谭小谭微信公众号:谭小谭(ID:tanstory)上一篇:为何IDEA比Eclipse更好!我们...

Java之间 2351
上一篇: MySQL中的binlog redolog和undolog的区别和作用
下一篇: 面试题:分布式事务,你了解多少?来谈谈2PC、TCC、可靠消息、最大努力通知
涵冰...
博客等级 码龄4年 2438粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涵冰...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值