【Mysql】面试题汇总

1. 存储引擎

1-1. MySQL 支持哪些存储引擎?默认使用哪个?

答:

MySQL 支持的存储引擎包括 InnoDBMyISAMMemory 等。

Mysql 5.5 之前默认的是MyISAM,Mysql 5.5 之后默认的是InnoDB

可以通过 show engines 查看 Mysql 支持的所有存储引擎。

1-2. MySQL 存储引擎架构了解吗?

答:

存储引擎是存储数据建立索引更新/查询数据等技术的实现方式 。

MySQL 的存储引擎设计的是可拔插式的。存储引擎是基于表的,不同的表可以使用不同的存储引擎。

1-3. MyISAM 和 InnoDB 有什么区别?

答:

  • InnoDB 支持事务,MyISAM不支持事务。
  • InnoDB 支持行锁和表锁,MyISAM只支持表锁。
  • InnoDB 支持外键,MyISAM不支持外键。
  • InnoDB 支持MVCC,MyISAM不支持MVCC。
  • InnoDB 支持数据库异常崩溃后的安全恢复,MyISAM不支持。 todo: 原因好像MyISAM没有 undoredo 日志文件

1-4. MyISAM 和 InnoDB 如何选择?

答:

如果对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,InnoDB 存储引擎是比较合适的选择。

对事务的完整性、并发性要求不是很高,以读操作和插入操作为主,MyISAM存储引擎是比较合适的选择。


2. 索引

2-1. 索引是什么,有什么作用?

答:

索引是一种用于快速查询检索数据的数据结构。

作用:当数据量比较大时,使用索引可以极大地提高数据检索的效率

2-2. MySQL 中的索引是怎么实现的,为什么选B+树作为索引的数据结构?

答:

MySQL 中的索引主要是通过 B+Tree 树来实现的。

B+Tree 是一颗多叉的平衡搜索树,每个节点是可以存储多个值,它是B树的一个变种。

B+Tree 与 B 树的主要区别:

  • B 树每个节点存储数据指针,B+Tree 树非叶子节点只存储指针这样每个非叶子节点存储的指针就会更多,进而树的高度就会更低,进而减少磁盘 I/O 次数。
  • B树的叶子节点没有指针相连, B+Tree 叶子节点形成一个单向链表,更适合范围查询。而Mysql 对B+Tree进行一个优化,多了一个指向相邻节点的指针。这样可以满足字段的降序排序。

B+Tree 与 Hash主要区别:

  • Hash查找的效率很高,但无法做范围查询

综合以上的区别,所以为什么选B+树这种数据结构来实现索引。

2-3. 索引的分类有哪些?

答:

  • 按「数据结构」分类:B+tree索引、Hash索引、全文索引。
  • 按「物理存储」分类:聚簇索引、二级索引。
  • 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引。
  • 按「字段个数」分类:单列索引、联合索引。

在这里插入图片描述

2-4. 什么时候需要 / 不需要索引?

答:

什么时候适用索引?

  • 字段有唯一性限制的,比如商品编码
  • 经常用于 where 查询条件的字段,以及 group byorder by 的字段。因为建立索引之后在 B+Tree 中的记录都是排序好的。

什么时候不适用索引?

  • 查询条件用不到的字段,因为索引是会占用物理空间。
  • 存在大量重复数据的字段。
  • 经常更新的字段不用创建索引,因为索引字段频繁修改,由于要维护 B+Tree的有序性,那么就需要频繁的重建索引。
  • 表数据太少的时候,不需要创建索引。

2-5. 索引什么时候会失效?

答:

  1. 索引字段使用函数运算
  2. 索引字段使用头部模糊查找
  3. 联合索引不满足最左匹配原则
  4. 字符串类型的字段没有加引号
  5. 使用or连接条件有一侧的字段没有索引

2-6. 什么是最左匹配原则?

答:

比如现在有一个联合索引,它是由多个字段组成的。

此时查询条件的字段一定要包含创建这个联合索引字段时候最左边的那个字段,那么索引才生效。

没有最左边的字段为什么会失效?

因为联合索引首先是按最左边的这个字段进行排序的,如果相同再按之后的字段排序,如果没有第一个字段,那么此时查找的时候,对于其他字段来说就不是有序的了

2-7. 索引的优化方法有哪些?

答:

  • 使用覆盖索引。覆盖索引就是我们要查询的字段,它已经包括在查询条件的联合索引中了。这样就不用回表查询了。
  • 对于一些大字符串的字段,可以建立前缀索引,节省空间。
  • 主键索引最好自增,这样每次插入一条新记录,都是追加操作。如果不是自增,会出现页分裂。

2-8. 表的一行数据大小为1k,有五千万条记录,主键是bigint类型,求B+树的高是多少?

答:

Mysql页中的指针大小固定是6个字节,因为主键是bigint类型,所以是8个字节。一页的大小固定是16k

首先假设一页中有 n 个数据,n + 1 个指针。一页可以存储的总字节 : 16 * 1024 = n * 8 + (n + 1) * 6

求出n后,进而知道了一个页的指针个数。

假设树高为2,则可以存储的总记录数:(n + 1)* (16K / 1K) = (n + 1)* 16

假设树高为3,则可以存储的总记录数:(n + 1)*(n + 1) * 16

假设树高为x,那么将5000万带入上述公式后:5000万 = (n + 1)^ x * 16

从而求出树高x。

3. 锁

3-1. Mysql有哪些锁?

答:

  1. 全局锁:整个数据库就处于只读状态。场景:数据库逻辑备份
  2. 表级锁
    • 表锁
      • 表共享读锁:所有客户端都只能读数据,不能写数据
      • 表独占写锁:只有上锁的客户端可以读写数据,其他都不能读写数据。
    • 元数据锁(MDL)系统自动加 避免DDLCRUD冲突
      • MDL读锁:CRUD操作时,加MDL读锁
      • MDL写锁:对表结构进行变更操作,加MDL写锁
    • 意向锁 系统自动加 快速判断表里的记录是否有行锁,避免行锁表锁冲突
      • 意向共享锁:与 表共享读锁 兼容,与 表独占写锁 互斥
      • 意向排他锁:与 表共享读锁 互斥,与 表独占写锁 互斥
  3. 行级锁 InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。
    • 行锁:锁定单个行记录。行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。
      • 共享锁:select … in share mode 会加共享锁,与排他锁互斥
      • 排他锁:insert、update、delete、select … for update 会加排他锁。与共享锁、排他锁互斥
    • 间隙锁:锁定索引之间的间隙,目的解决幻读问题。
    • 临键锁:行锁和间隙锁组合,同时锁住索引项,并锁住索引项前面的间隙

3-2. 什么SQL语句会加行级锁?

答:

update、insert、delete、 select … for update 会加行锁的排他锁

select … in share mode 会加行锁的共享锁

当事务提交了,锁就会被释放

3-3. 行级锁有哪些?

答:

行锁:对索引项加锁

间隙锁:对索引的间隙加锁

临键锁:行锁 + 间隙锁,锁定索引项和索引项前面的间隙

3-4. Mysql是怎么加行级锁的?

答:

加锁的对象是索引项,加锁的基本单位是 next-key lock

next-key lock 在一些场景下会优化成行锁间隙锁

唯一索引进行等值查询的时候

  • 查询记录存在,优化成行锁,确保这个记录不会被删除,防止幻读。
  • 查询记录不存在,在索引树找到第一条大于该查询记录的记录,将该记录的next-key lock优化成间隙锁,确保不会将查询记录插进来,防止幻读。

没有加索引的查询的时候

没有使用索引列作为查询条件,或者查询语句没有走索引查询,导致扫描是全表扫描。那么,每一条记录的索引上都会加 next-key 锁,这样就相当于锁住的全表,这时如果其他事务对该表进行增、删、改操作的时候,都会被阻塞。

因此,在线上在执行 updatedeleteselect ... for update 等具有加锁性质的语句,一定要检查语句是否走了索引,如果是全表扫描的话,会对每一个索引加 next-key 锁,相当于把整个表锁住了

3-5. update条件字段没加索引会锁全表?

答:

会,没有索引会全表扫描,那么,每一条记录的索引上都会加 next-key 锁,这样就相当于锁住的全表。

3-6. 行锁 + 间隙锁可以防止删除操作的幻读吗?

3-7. 加了什么锁会导致死锁?

3-8. 死锁了怎么办?

3-9. 意向锁是什么?有什么作用?它是表级锁还是行级锁?

答:

意向锁是一种表级锁,它是用来避免行锁和表锁发生冲突,可以快速判断表中记录是否有行锁。

当对记录加行锁时,会自动的对表加上意向锁。

3-10. 备份数据库数据的时候,使用全局锁会影响业务,那有什么其他方式可以避免?

答:

InnoDB 存储引擎默认的事务隔离级别是可重复读,那么可以在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。

备份数据库的工具是 mysqldump,在使用 mysqldump 时加上 –single-transaction 参数的时候,就会在备份数据库之前先开启事务。

这种方法只适用于支持「可重复读隔离级别的事务」的存储引擎。

4. 事务

4-1. 事务有哪些特性?

答:

InnoDB 引擎是支持事务的,MyISAM 引擎不支持事务

事务的四大特性:

  • 原子性:事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败
  • 一致性:事务操作的前后,数据库要保持一致性的状态。比如从转账业务角度来看,A向B转账之后,他们账号的总额与转账之前的总额要保持一致
  • 隔离性:数据库是支持多个事务并发执行的,事务不会受到其他并发执行事务的影响
  • 持续性:事务对数据的操作是永久性的,即便系统故障也不会丢失。

4-2. 并发的事务操作会有什么问题?

答:

  • 脏读:一个事务读取了另一个事务未提交的数据。如果另一个事务进行回滚,则当前读取的数据就是脏数据。
  • 不可重复读:在同一个事务内,前后读取同一条数据不一致。
  • 幻读:在一个事务内,前后进行查询时,发现两次读取的记录数量不一样。

4-3. 事务的隔离级别有哪些?

答:

  • 读未提交:一个事务读取另一个事务未提交的数据
  • 读已提交:一个事务读取另一个事务提交的数据
  • 可重复读:在同一个事务内,前后读取同一条数据保持一致
  • 串行化:所有的事务串行执行

4-4. 什么是MVCC?

答:

MVCC全称是多版本并发控制,是数据库中用来实现事务隔离的一种技术,维护了一个数据的多个版本。

MVCC的具体实现,还需要依赖于数据库记录中的隐式字段undo log日志readView

事务id(隐式字段)满足相应的规则(readView中的访问规则)就会读取到对应的版本数据(存放在undo log日志)

4-5. 在可重复读的隔离级别下,是如何解决幻读的?

答:

针对快照读,也就是普通的 select 语句,是通过 MVCC 解决的。因为开启事务后创建的ReadView在后续的数据查询中会一直沿用,所以不会出现幻读的问题

针对当前读,除了快照读(普通select语句)之外的语句,都是当前读,每次执行前都会查询最新的记录,其它也就是select…for update等语句,是通过next-key lock(记录锁+间歇锁)解决的。

比如执行了select * from t_stu where id >2 for update,这个时候就会为id>2的记录加上next-key lock,在本事务提交之前,其它事务都没有办法对id>2的记录进行修改操作,也就解决了幻读问题

4-6. ReadView在MVCC里如何工作?

答:

4-7. Mysql是如何实现可重复读的?

答:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外包2月,技术退步惊现!大专生逆袭大厂,全靠这份神秘资料!

大家好,我是一名大专生,19年通过校招进入湖南某软件公司,从事功能测试工作已近4年。今年8月,我意识到长期舒适的环境让我变得不思进取,技术停滞不前,甚至因此失去了谈了2年的女朋友。我下定决心&#xff0c…

金蝶云星空——插件dll重新发布报错:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�

项目场景: 金蝶插件开发 问题描述 今天更新了插件dll然后重启IIS金蝶就报如下错误: 解决方案: 折腾了一天结果发现是给自己挖坑了,这次更新我担心插件代码有问题就把原dll重命名了然后把最新dll更新到金蝶bin文件中&#xff0c…

【DBC专题】-11-使用Cantools将CAN/CANFD DBC自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 经典CAN/CANFD DBC自动生成C语言代码 2.1 批处理文件CAN_DBC_To_C.bat内容说明 2.2 经典CAN/CANFD DBC文件要求 2.3 如何使用生…

网站引用图片但它域名被墙了或者它有防盗链,我们想引用但又不能显示,本文附详细的解决方案非常简单!

最好的办法就是直接读取图片文件&#xff0c;用到php中一个常用的函数file_get_contents(图片地址)&#xff0c;意思是读取远程的一张图片&#xff0c;在输出就完事。非常简单&#xff5e;话不多说&#xff0c;直接上代码 <?php header("Content-type: image/jpeg&quo…

clipboard好用的复制剪切库

clipboard是现代复制到剪贴板的工具&#xff0c;其 gzip 压缩后只有 3kb&#xff0c;能够减少选择文本的重复操作&#xff0c;点击按钮就可以复制指定内容&#xff0c;支持原生HTMLjs&#xff0c;vue3和vue2。使用方法参照官方文档&#xff0c;so easy&#xff01;&#xff01;…

装X神器,装X图片生成器,高富帅模拟器

先展示两张效果 基金装X图 短信存款图 神器功能展示 总共有12大类可供用户选择 还有一些美感的&#xff1a; 总结 总之种类非常多&#xff0c;有了这个神器你懂的&#xff5e; 关注下方公众号&#xff0c;回复【zzsq】即可获取。

2、鸿蒙学习-申请调试证书和调试Profile文件

申请发布证书 发布证书由AGC颁发的、为HarmonyOS应用配置签名信息的数字证书&#xff0c;可保障软件代码完整性和发布者身份真实性。证书格式为.cer&#xff0c;包含公钥、证书指纹等信息。 说明 请确保您的开发者帐号已实名认证。每个帐号最多申请1个发布证书。 1、登录AppGa…

Linux软件管理(1)

软件管理 下载 wget Linux wget是一个下载文件的工具&#xff0c;它用在命令行下。 wget工具体积小但功能完善&#xff0c;它支持断点下载功能&#xff0c;同时支持FTP和HTTP下载方式&#xff0c;支持代理服务器和设置起来方便简单。 1.语法 wget [选项]……[URL]…… 2、…

阅读基础知识1

一 网络 1. 三次握手四次挥手 三次握手&#xff1a;为了建立长链接进行交互即建立一个会话&#xff0c;使用 http/https 协议 ① 客户端产生初始化序列号 Seqx &#xff0c;向服务端发送建立连接的请求报文&#xff0c;将 SYN1 同步序列号&#xff1b; ② 服务端接收建立连接…

洛谷_P1068 [NOIP2009 普及组] 分数线划定_python写法

P1068 [NOIP2009 普及组] 分数线划定 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 知识点&#xff1a; 这道题用到了自定义排序规则 n, m map(int,input().split()) data [] for i in range(n):l list(map(int,input().split()))data.append(l)import functoolsdef my_cm…

香港科技大学广州|智能制造学域博士招生宣讲会—同济大学专场

时间&#xff1a;2024年3月28日&#xff08;星期四&#xff09;10:00 地点&#xff1a;同济大学嘉定校区济人楼310 报名链接&#xff1a;https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾&#xff1a;崔华晨 助理教授 跨学科重点研究领域 •工业4.0 •智能传感器、自动光学检…

web攻防——csrf,ssrf

csrf 当我们在访问自己的管理员系统的时候&#xff0c;打开别人发的钓鱼连接就会自动增加管理员&#xff08;前提&#xff0c;后台在登录状态&#xff09;当我们打开别人发的网站&#xff0c;就会触发增加管理员的数据包 假设我们要测试这个网站 看到这个&#xff0c;就得下载一…

计算机组成原理-3-系统总线

3. 系统总线 文章目录 3. 系统总线3.1 总线的基本概念3.2 总线的分类3.3 总线特性及性能指标3.4 总线结构3.5 总线控制3.5.1 总线判优控制3.5.2 总线通信控制 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理&#xff08;上&#xff09;_哈尔滨工业大学》、《计算机组成原理…

Positive Technologies 专家发现的漏洞已在 ABB 控制器中得到修复

&#x1f31f; 我们的同事一如既往地表现出色&#xff1a;应用分析专家 Natalia Tlyapova 和 Denis Goryushev 因发现 Freelance AC 900F 和 AC 700F 控制器中的两个漏洞而受到 ABB 的表彰。 这些设备用于自动化大规模连续循环生产设施和构建企业配送控制系统。利用这些漏洞的…

Codeforces Round 925 (Div. 3) G. One-Dimensional Puzzle【推公式+组合数学+隔板法】

原题链接&#xff1a;https://codeforces.com/problemset/problem/1931/G 题目描述&#xff1a; 有 4 种拼图&#xff0c;其中第 i 种拼图有 ci​ 张。 两张拼图可以连结当且仅当它们相邻的卡槽中一个凹陷一个突出。 我们希望将所有的拼图从左往右拼起来&#xff0c;求总方案…

js 中文乱码解决、乱码对照

1、js iso-8859-1转utf-8 在JavaScript中&#xff0c;可以使用内置的TextEncoder和TextDecoderAPI来实现ISO-8859-1编码和UTF-8编码之间的转换。以下是一个将ISO-8859-1编码的字符串转换为UTF-8编码的示例代码&#xff1a; function convertISO88591ToUTF8(isoString) {// 将…

C语言数据结构基础——二叉树学习笔记(二)topk问题

1.top-k问题 1.1思路分析 TOP-K 问题&#xff1a;即求数据结合中前 K 个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大 。 比如&#xff1a;专业前 10 名、世界 500 强、富豪榜、游戏中前 100 的活跃玩家等。 对于 Top-K 问题&#xff0c;能想到的最简单直…

Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)

目录 一、前置说明 二、Gradle 启动&#xff01; 2.1、安装 2.2、初始化项目 2.3、gradle 项目目录介绍 2.4、Gradle 项目下载慢&#xff1f;&#xff08;万能解决办法&#xff09; 2.5、Gradle 常用命令 2.6、项目构建流程 2.7、设置文件&#xff08;settings.gradle.…

什么是web组态?Web组态软件哪个好用?

随着工业4.0的到来&#xff0c;物联网、大数据、人工智能等技术的融合应用&#xff0c;使得工业领域正在经历一场深刻的变革。在这个过程中&#xff0c;Web组态技术以其独特的优势&#xff0c;正在逐渐受到越来越多企业的关注和认可。那么&#xff0c;什么是Web组态&#xff1f…

快速从0-1完成聊天室开发——环信ChatroomUIKit功能详解

聊天室是当下泛娱乐社交应用中最经典的玩法&#xff0c;通过调用环信的 IM SDK 接口&#xff0c;可以快速创建聊天室。如果想根据自己业务需求对聊天室应用的 UI界面、弹幕消息、礼物打赏系统等进行自定义设计&#xff0c;最高效的方式则是使用环信的 ChatroomUIKit 。 文档地址…