首页 > 其他分享 >被面试官PUA了:创建索引时一定会锁表?

被面试官PUA了:创建索引时一定会锁表?

时间:2023-12-25 09:33:18浏览次数:47  
标签:面试官 会锁表 数据库 DDL DML PUA 索引 Online MySQL

索引主要是用于提高数据检索速度的一种机制,通过索引数据库可以快速定位到目标数据的位置,而不需要遍历整个数据集,它就像书籍的目录部分,有它的存在,可以大大加速查询的效率。

那么问题来了:在创建索引时一定会锁表吗?

如果你看的是网上的一些资料,或者是通过 chatgpt,那么很可能得到的结果是这样的“是的,创建索引时是会锁表的。”,但这个回答是不正确的,为什么呢?

典型回答

因为在 MySQL 5.6 之前,创建索引时会锁表,所以,在早期 MySQL 版本中一定要在线上慎用,因为创建索引时会导致其他会话阻塞(select 查询命令除外)。

但这个问题,在 MySQL 5.6.7 版本中得到了改变,因为在 MySQL 5.6.7 中引入了 Online DDL 技术(在线 DDL 技术),它允许在创建索引时,不阻塞其他会话(所有的 DML 操作都可以一起并发执行)。

什么是 DDL?

DDL(Data Definition Language,数据库定义语言):用于定义和管理数据库的结构,它主要包括以下语句:

  • CREATE:用于创建数据库、表、索引、视图等对象。
  • ALTER:用于修改数据库、表、索引、视图等已存在的对象的结构。
  • DROP:用于删除数据库、表、索引、视图等对象。
  • TRUNCATE:用于删除表中的所有数据,但保留表的结构。
  • RENAME:用于重命名数据库、表等对象。

什么是 DML?

DML (Data Manipulation Language,数据操作语言) :用于查询和修改数据,它主要包括以下语句:

  • INSERT:用于向表中插入新的数据行。
  • UPDATE:用于更新表中已存在的数据行。
  • DELETE:用于删除表中的数据行。
  • SELECT:用于从表中检索数据。虽然 SELECT 主要用于查询,但某些包含数据修改的扩展 SQL 功能(如 LIMIT、ORDER BY、GROUP BY 等)也属于 DML 的范畴。

什么是 Online DDL?

Online DDL(Online Data Definition Language,在线数据定义语言)是指在数据库运行期间执行对表结构或其他数据库对象的更改操作,而不需要中断或阻塞其他正在进行的事务和查询。

Online DDL 官方介绍文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html

Online DDL 最重要操作定义如下:

简单翻译一下以上内容:

从上面的表格可以看出,有了 Online DDL 技术之后,在添加索引时,会对原本进行操作,并且允许和 DML(数据操作语言 INSERT、UPDATE、DELETE、SELECT)一起并发执行了。

小结

在 MySQL 5.6 之前,创建索引时会锁表,但在 MySQL 5.6.7 之后,因为新增了 Online DDL 技术,所以此时在添加索引时,是可以和 DML 数据操作语言 INSERT、UPDATE、DELETE、SELECT 等命令一起执行的。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:面试官,会锁表,数据库,DDL,DML,PUA,索引,Online,MySQL
From: https://www.cnblogs.com/vipstone/p/17925330.html

相关文章

  • 面试官:这些大学生都会
    大家好,我是JavaPub。最近有些同学在后台问我,面试总是会遇到被问Linux命令的问题,自己就面试个后端开发岗位,怎么这么难呢?其实Linux命令,对于一个后端开发来说,并不是很难,只是我们平时很少使用而已。但是,我们平时开发,用到的Linux命令,其实也就那么几个,比如:文件操作:ls、cd、pwd、m......
  • 面试官:什么是虚拟线程?为什么要有虚拟线程?
    Java中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于JDK19(预览API),正式发布于JDK21,它是一种在Java虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。操作系统线程、普通线程(Java线程)和虚拟线程的关系如下:虚拟线......
  • Android自定义View面试官最爱问的12个高级问题
    引言在Android开发领域,自定义View是一个考察开发者深度功底和创造力的重要方面。本文将从Android面试官的角度出发,深入探讨自定义View面试中常见的12个高级疑难问题,帮助大家更好地准备面试,展示专业技能。自定义View的基础知识问题:请解释自定义View的基本概念及其在Android开发中的......
  • 【面试官版】【持续更新中】融合滤波算法+数据结构+激光视觉SLAM+C++面试题汇总
    C++部分什么时候需要写虚函数、什么时候需要写纯虚函数?只继承接口为纯虚函数强调覆盖父类重写,或者父类也需要实现一定的功能,为虚函数指针传参和引用传参区别?引用传参本质上是传递原参数地址,指针传参本质还是值传递,生成拷贝指针,拷贝指针和原指针指向的为同一块内存。因此改变......
  • 面试官问我:线程锁导致的kafka客户端超时,如何解决?
    本文分享自华为云社区《线程锁导致的kafka客户端超时问题》,作者:张俭。问题背景有一个环境的kafkaclient发送数据有部分超时,拓扑图也非常简单定位历程我们先对客户端的环境及JVM情况进行了排查,从JVM所在的虚拟机到kafkaserver的网络正常,垃圾回收(GC)时间也在预期范围内,没有......
  • 面试官:这些大学生都会
    大家好,我是JavaPub。最近有些同学在后台问我,面试总是会遇到被问Linux命令的问题,自己就面试个后端开发岗位,怎么这么难呢?image-20231216131924099其实Linux命令,对于一个后端开发来说,并不是很难,只是我们平时很少使用而已。但是,我们平时开发,用到的Linux命令,其实也就那么几......
  • 面试官:如何实现链式调用?
    从Java8开始,便引入了一种称为“流式API”的编程风格,当然也被称为“链式设置”或“链式调用”。它主要是通过设置方法的返回值,让返回值变为对象自身,从而实现连续的方法调用,这种风格就叫做“链式设置”或“链式调用”。例如,以下代码:MySQLConnectOptionsconnectOptions=new......
  • 面试官问我,try catch 应该在for循环里面还是外面?
    trycatch的位置是要根据具体情况来确定的。咱们先来说说for循环里面放trycatch的情况。当你的程序在for循环中可能会发生异常,但是这个异常并不是致命的,也不会影响整个循环的执行,那你就可以把trycatch放在for循环里面。举个例子吧,假设咱们要读取一个文件里的数据,然后进行处理。可......
  • 面试官:说说 Eureka 工作原理与内部实现
    Eureka是Netflix开发的一款基于REST服务的服务发现工具,主要用于云计算系统中服务的自动注册与发现。其工作原理和内部实现可以概括如下:一、架构组件EurekaServer:服务注册中心,提供服务注册和发现的功能。服务提供者和消费者都会与EurekaServer进行交互。EurekaClient:一个Java......
  • 从面试官角度看Handler:掌握技巧,事半功倍!
    引言在Android开发领域,Handler是一项关键技能,尤其在面试中,对Handler的深刻理解和熟练运用往往是衡量一位Android开发者水平的重要标志。本文将从面试官的角度出发,针对AndroidHandler技术展开详细的解析,深入剖析高级疑难问题,帮助读者更好地准备面试。Handler的基本概念问题:请解释Ha......