MySQL面试题全解析:准备面试所需的关键知识点和实战经验

news2025/5/19 3:12:33

MySQL有哪几种数据存储引擎?有什么区别?

MySQL支持多种数据存储引擎,其中最常见的是MyISAM和InnoDB引擎。可以通过使用"show engines"命令查看MySQL支持的存储引擎。

  1. 存储方式:MyISAM引擎将数据和索引分别存储在两个不同的文件中,一个是.MYD文件用于存储数据,一个是.MYI文件用于存储索引。而InnoDB引擎将数据和索引存储在同一个文件中。
  2. 锁机制:MyISAM引擎只支持表级锁,即在对某个表进行读写时,会锁住整个表,其他操作需要等待。而InnoDB引擎支持行级锁,可以在并发访问时只锁住需要操作的行,提高了并发性能。
  3. 事务支持:MyISAM引擎不支持事务,而InnoDB引擎支持事务。事务是一种保证数据一致性和完整性的机制,可以将多个操作作为一个整体进行提交或回滚。
  4. 外键支持:MyISAM引擎不支持外键约束,而InnoDB引擎支持外键约束。外键是用于维护表与表之间关系的一种机制,可以确保数据的一致性

什么是脏读、幻读、不可重复读?要怎么处理?

脏读、不可重复读和幻读是数据库中的一些并发问题。

脏读是指一个事务在读取另一个未提交事务的数据时,如果未提交事务回滚了,则读取到的数据是不一致的。

不可重复读是指一个事务在相同的查询条件下,多次读取数据结果不一致。例如,事务A第一次读取数据时,事务B修改了相同的数据并提交,导致事务A第二次读取时数据不一致。

幻读是指一个事务在多次查询中,由于其他事务插入或删除数据,导致查询结果出现新增或减少的情况。

处理这些问题的方法有几种:

  1. 加锁:可以使用数据库提供的锁机制,如行级锁或表级锁,来控制并发访问,确保数据的一致性。但是加锁会降低并发性能。需要自己根据业务需要添加共享锁还是排它锁。
  2. 调整事务隔离级别:数据库提供了不同的事务隔离级别,如读未提交、读已提交、可重复读和串行化。可以根据具体情况选择合适的隔离级别来避免并发问题。

事务的基本特性和隔离级别有哪些?

事务的基本特性包括ACID:

  1. 原子性(Atomicity):一个事务中的所有操作要么全部成功提交,要么全部失败回滚。事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。
  2. 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏。事务的操作会将数据库从一个一致性状态转换为另一个一致性状态。
  3. 隔离性(Isolation):并发执行的事务之间应该相互隔离,一个事务的执行不应该被其他事务干扰。隔离性确保每个事务在并发环境中都能独立执行,不会受其他事务的影响。
  4. 持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中。即使发生系统崩溃或电源故障,数据库也能够恢复到事务提交后的状态。

隔离级别是控制事务隔离性的一个参数,常见的隔离级别包括:

  1. 读未提交(Read Uncommitted):最低级别的隔离级别,允许一个事务读取另一个事务未提交的数据。会出现脏读问题。
  2. 读已提交(Read Committed):保证一个事务只能读取到其他事务已经提交的数据,解决了脏读问题。但是可能会出现不可重复读问题。
  3. 可重复读(Repeatable Read):保证在一个事务中多次读取同一数据时,得到的结果是一致的。解决了不可重复读问题。但是可能会出现幻读问题。
  4. 串行化(Serializable):最高级别的隔离级别,要求事务串行执行,避免了幻读问题。但是会降低并发性能。

MySQL的锁有哪些?什么是间隙锁?

MySQL的锁可以根据锁的粒度进行划分,包括行锁、表锁和全局锁。下面是对每种锁的详细说明:

行锁:InnoDB引擎支持行锁,它的粒度很小,可以提供较好的并发性能,但是会消耗更多的资源。行锁又可以细分为以下两种:

  • 共享锁:使用SELECT ** LOCK IN SHARE MODE语句来获取共享锁,读取操作期间可以共享,但会阻塞写操作。
  • 排它锁:使用SELECT ** FOR UPDATE语句来获取排它锁,各种操作都会被阻塞,而且在执行INSERT、DELETE、UPDATE语句时会自动添加排它锁。
  • 自增锁:当涉及到自增字段时,每次获取自增值时都会进行阻塞。需要注意的是,自增锁与业务逻辑无关。

表锁:直接锁住整张表而不是单独的行,表锁消耗的资源比较少,但是锁的粒度较大,导致并发性能较低。表锁可以细分为以下两种:

  • 表共享锁:多个会话可以同时获取表的共享锁,读操作可以并发进行,但是写(INSERT、DELETE、UPDATE)会被阻塞。
  • 表排它锁:获取表排它锁的会话会阻塞其他会话的所有操作,包括读和写。

全局锁:使用FLUSH TABLES WITH READ LOCK语句来获取全局锁,通常用于表数据备份等场景。

间隙锁(Gap Lock)主要针对带有索引的字段。例如,对于一个拥有user_id索引的user表(user_id, name),数据有(1,a)(4,b)(9,c),当执行UPDATE user SET name = d WHERE user_id = 5时,会锁定 5-9 之间的记录(不包括自身)。而执行UPDATE user SET name = 5 WHERE user_id = 4时,则是记录锁,只锁住一条记录。

另一种类型是Next-Key锁,它实际上是右侧界的记录锁。对于上述user表的索引,Next-Key锁会在(1, a)、(4, b)、(9, c)之间进行锁定。表示从左开区间到右开区间封闭,即( -∞, 1], (1, 4], (4, 9], (9, +∞)。这样可以确保范围内的记录都受到锁的保护。

通过使用间隙锁和Next-Key锁,可以更精确地控制并发操作,提高数据库的数据一致性和并发性能。

MySQL的索引结构是什么样的?聚簇索引和非聚簇索引又是什么?

MySQL是一种广泛使用的关系型数据库管理系统,具有多种存储引擎和索引结构可供选择。存储引擎是MySQL用来处理数据的核心组件,而索引结构则用于提高数据检索的效率。

在MySQL中,最常见和常用的存储引擎是InnoDB和MyISAM。InnoDB是一个支持事务处理和行级锁定的存储引擎,适用于处理大量并发操作和高可靠性要求的应用。而MyISAM则是一个更适合于读写不频繁的应用,它不支持事务处理,但速度较快。

索引结构是用来加快数据检索速度的一种数据结构。

  • B+树索引是MySQL中最常见的索引结构。它使用B+树的数据结构来存储索引值和对应的数据行位置。非叶子节点只存储索引值,叶子节点存储索引值和对应的数据行位置。B+树索引的叶子节点按照索引值的顺序排列,并且通过双向链表连接,使得范围查询和最左前缀匹配查询更高效。
  • 哈希索引将索引值通过哈希函数映射为一个唯一的哈希值,并将哈希值和对应的数据行位置存储在哈希表中。哈希索引适用于等值查询,但不支持范围查询和模糊查询。

聚簇索引是索引值和表的数据存储在一起的索引结构。在InnoDB存储引擎中,聚簇索引使用B+树来实现,叶子节点存储数据行的实际数据。一个表只能有一个聚簇索引,如果没有显式指定主键,那么会找第一个unique字段当做主键索引,否则将会使用隐藏的rowid作为主键索引。

非聚簇索引是索引值和表的数据分开存储的索引结构。在MyISAM存储引擎中,每个索引都是一个独立的文件,存储索引值和对应的数据行位置。一张表可以有多个非聚簇索引,比如表的普通索引。

MySQL的覆盖索引和回表

覆盖索引是指索引包含了查询所需的所有字段,这样在查询时就可以直接使用索引中的数据,而无需回表去读取数据行。这种方式可以减少磁盘I/O操作,提高查询性能。

当一个查询只需要从索引中获取数据而不需要回表时,就可以称之为覆盖索引查询。在这种情况下,数据库引擎只需要读取索引页,而不需要再去读取数据页,从而节省了磁盘I/O开销。

使用覆盖索引可以提高查询性能的原因是,索引通常比数据行小很多,所以从索引中读取数据比从数据行中读取数据更快。此外,覆盖索引还可以减少内存的使用,因为不需要将数据行加载到内存中进行处理。

为了使用覆盖索引,需要确保查询语句中只包含索引字段,并且索引能够满足查询条件和排序需求。如果查询语句中包含了非索引字段,那么数据库引擎仍然需要回表去读取数据行,无法实现覆盖索引查询的优化效果。

MySQL的集群是如何搭建的?读写分离是怎么做的?

image

MySQL的集群搭建通常使用主从复制的方式,并结合读写分离来提高数据库的性能和可用性。

首先,在搭建MySQL集群之前,需要确定一个主节点和多个从节点。主节点负责处理写操作,从节点负责处理读操作。

在主节点接收到写操作时,会将修改的数据记录到binlog日志中。binlog是二进制日志,用于记录数据库的所有修改操作。从节点会定期读取主节点的binlog日志,并将这些操作应用到自己的数据库中,实现主从数据的同步。

通常情况下,当一个未提交的事务进行操作数据时,首先写入到undolog,其次写入redolog和binlog,但是提交事务之前并不会写入磁盘,只是在内存中,这种设计可以提高数据库的性能,因为将数据写入磁盘是比较耗时的操作,而将数据暂时保存在内存中可以减少磁盘访问的次数,从而提高数据库的处理速度。

在读写分离的架构中,还需要考虑主从复制的延迟问题。由于主从复制是异步的,所以从节点上的数据可能不是实时同步的。可以通过设置合适的复制延迟时间来平衡数据的一致性和性能的需求。

半同步复制是MySQL主从复制的一种机制,它在传输binlog日志时,主节点需要等待至少一个从节点确认收到并写入日志后才能继续进行下一步操作。

具体的工作流程如下:

  1. 当主节点完成一次事务的提交后,它会将binlog日志发送给一个或多个从节点。
  2. 主节点会等待至少一个从节点将binlog日志写入磁盘并发送一个确认消息给主节点。
  3. 一旦主节点收到至少一个从节点的确认消息,它才会认为该次提交已经完成,可以继续进行下一次操作。

谈谈如何对MySQL进行分库分表?多大数据量需要进行分库分表?分库分表的方式和分片策略由哪些?分库分表后,SQL语句的执行流程是怎样的?

分库分表是一种常用的数据库架构优化技术,用于应对数据规模不断增长的情况。分库分表可以通过纵向拆分和横向拆分两种方式进行。

  • 纵向拆分是将不同的业务数据分开存储在不同的数据库中,每个数据库对应一个业务。这样可以有效避免单一数据库数据量过大导致的性能问题,但无法解决单个业务数据量过大的查询问题。
  • 横向拆分是将单个表中的数据按照某些字段进行拆分,将数据分散存储在多个表中。这样可以减小单个表的数据量,提高查询效率。常见的分片策略有按照范围、按照哈希和按照取模等。

分库分表会引入新的问题,例如数据的拆分和合并、开发和维护的复杂度增加等。因此,在选择分库分表之前,需要根据业务的增长速度和数据量来判断是否需要进行分库分表。根据阿里的开发规范手册,一般在数据量达到500万或单个表文件大小增长到2G时,可以考虑进行分库分表的规划。

通常,可以使用一些开源的分库分表中间件,如Mycat或ShardingSphere,来实现分库分表功能。这些中间件支持DDL、DML等语句的执行,能够进行排序、分组聚合等操作。但对于一些复杂的SQL语句,如子查询,可能存在一定的限制。

image

SQL语句的执行流程一般包括解析、优化、路由、分片和归并结果集等步骤。首先,数据库会对SQL语句进行解析,将其转换成内部数据结构。然后,通过优化器对SQL语句进行优化,生成最优的执行计划。接下来,根据分片策略,确定需要执行的数据库和表。然后,将SQL语句发送到相应的数据库节点执行。最后,将执行结果进行归并,返回给用户

总结

本次种子题目主要涵盖了MySQL的存储引擎和索引结构,如B+树索引和哈希索引,以及覆盖索引和回表的概念。此外,还包含了MySQL事务的ACID特性和隔离级别。另外,对MySQL主从集群中的binlog日志的执行顺序和作用进行了讨论。最后,还涉及了分库分表和读写分离的概念。这些内容涵盖了MySQL数据库的核心知识和重要技术,不仅在面试中起到关键作用还对于优化数据库性能和应用开发都具有重要意义。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位掘金优秀作者、腾讯云内容共创官、阿里云专家博主、华为云云享专家。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

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

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

相关文章

手机怎么远程控制电脑屏幕?手机远程控制电脑方法分享

手机与电脑之间的互联互通变得越来越便捷。 无论是工作还是学习,有时我们需要在手机上远程控制电脑屏幕,以完成一些复杂的操作或查看电脑上的文件。 本文将详细介绍几种实用的手机远程控制电脑屏幕的方法,帮助读者轻松实现这一目标。 一、使…

美容院节假日可以做哪些营销活动?博弈美业系统源码|美容院管理系统

美容院在节假日期间开展各种类型的营销活动是必不可少的,可以吸引用户消费或充值、开发新客户、提高客户忠诚度。 在举办各类活动时,可针对不同的用户群体采取不同的活动策略,下面给大家简单列举一些活动策略,门店可在此基础上根…

【Nessus破解及20220412插件】漏洞扫描工具之一,windows版本安装

一、双击安装程序 安装路径默认即可,记住安装的路径在哪里。 一般默认路径都是——C:\Program Files\Tenable\Nessus 等待初始化加载完成。 选择第四个。 选择Tenable.sc,继续下一步。 填写username和密码继续。 安装完是以下界面,目前还不能…

【机器学习之深度学习】神经元、层的基本概念,神经网络以及神经元与线性回归和逻辑回归的相似之处

引言 神经元、层和神经网络是深度学习模型的核心组成部分,它们共同工作,使得深度学习能够处理复杂的数据和任务。通过叠加多个层,可以构建出能够学习复杂函数的深度神经网络 一、神经元和层 深度学习中的神经元和层是构建复杂预测模型的基础…

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法(一)修改颜色(二)修改大小(三)换行(四&…

SQL注入实例(sqli-labs/less-15)

0、初始页面 1、确定闭合符号 确定符号的闭合 2、爆库名 python脚本爆库名 def inject_database(url):name for i in range(1,20):low 32high 128while low < high:mid (low high) // 2payload "-1 or ascii(substr(database(),%d,1))>%d # " %(i,mid…

从今天开始深入学习 SQL 优化

SQL优化 .SQL优化12.1 selet具体字段 12.2 多用limit 12.3 用union all替换 union 12.4 优化group by 12.5 优化order by 12.6 小表驱动大表 12.7 字段类型使用合理 12.8 优化linit分页 12.9 exist& in的合理利用 12.10 join关联的表不宜过多 12.11 deletein自查询不走索引…

学习记录——day29 网络编程

目录 一、网络编程引入 1.1、IPC通信方式 1&#xff09;内核提供&#xff1a; 无名管道 有名管道 信号 2&#xff09;system V: 消息队列 共享内存 信号量集 1.2、网络通信使用缘由 二、网络发展阶段 2.1 APRAnet阶段 2.2 TCP/IP两个协议阶段…

Java收发邮件笔记

1 关于邮箱的前置知识 1.1 概念部分 邮箱服务器和协议是电子邮件系统中不可或缺的两个组成部分&#xff0c;它们共同确保了电子邮件的顺利发送、接收和管理。 1.1.1 服务器和协议 邮箱服务器 比如常见的QQ邮箱,网易邮箱。 邮箱服务器是一种负责电子邮件收发管理的计算机系…

Rust学习---Hello World

编写 Rust 程序 1.程序文件后缀名: rs 2.文件命名规范:hello_world.rs 3.(例子) 使用命令创建项目&#xff0c;命名为"hello world" 打开 cmd 输入: mkdir hello_world cd hello_world 新建文件 main.rs编译与运行 Rust 程序 1.编译:rustc main.rs&#xff0c;…

【无标题】Unity Asset Hunter 插件

Asset Hunter PRO是Unity的一款插件&#xff0c;用于分析工程内的资源使用情况&#xff0c;资源大小&#xff0c;分析资源依赖关系&#xff0c;可以用来清理项目中未使用的资源。尤其是项目较大时&#xff0c;删除没有使用的资源很有帮助。 对于项目UI图片修改次数过多时&…

Linux 进程概念

Linux 进程概念 硬件理解冯 诺依曼体系结构五大组成部件强调存储 引子操作系统&#xff08;Operator System&#xff09;概念作用认识为什么要有操作系统&#xff1f; 结构 示意图理解操作系统system call库函数概念 进程什么是进程概念误区认识 描述进程 - PCBtask_struct - P…

colResizable插件实现网页中表格列宽自定义

需求&#xff1a;页面上每个字段的列宽&#xff0c;可以通过页面拖动的形式进行调整。 解决方法&#xff1a;使用jQuery的一个插件&#xff0c;名称叫 colResizable&#xff0c;可以实现。 插件官网 colResizable – 可调整大小的列和表 (bacubacu.com) 说明&#xff1a; 该…

汽车线路保护设计

汽车线路保护设计 线路保护就是要对导线加以保护&#xff0c;兼顾对回路电器件的保护。保护装置主要有熔断器、断路器和易熔线等。 保险、继电器、导线、电瓶的选择和计算 熔断器的选取原则 发动机ECU、ABS等对整车性能及安全影响大&#xff0c;另外&#xff0c;易受其他用…

从零安装pytorch并在pycharm中使用

背景介绍 目前主流使用的工具有Facebook搞的pythorch和谷歌开发的tensorflow两种&#xff0c;二者在实现理念上有一定区别&#xff0c;pytorch和人的思维模式与变成习惯更像&#xff0c;而tensorflow则是先构建整体结构&#xff0c;然后整体运行&#xff0c;开发调试过程较为繁…

算法工程师必知必会的数学基础之微积分上

系列文章&#xff1a; 第一篇&#xff1a;算法工程师必知必会的数学基础之线性代数第二篇&#xff1a;算法工程师必知必会的数学基础之微积分上&#xff08;本文&#xff09;。 文章目录 2. 微积分2.1 极限&#xff08;Limits&#xff09;和 连续性&#xff08;Continuity&…

WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…

学习笔记 韩顺平 零基础30天学会Java(2024.8.8)

P492 第三代日期使用 P493 第三代日期方法 P495 String翻转 作业代码见chapter12homework 对于需要异常处理的情况&#xff0c;可以通过这种想法得到&#xff1a; P495 注册处理题 P496 字符串统计 P497 String内存布局测试题 P498 常见类阶段梳理 P499 集合介绍 集合的使用并不…

xxljob--入门使用

1.简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 2.下载 网址&#xff1a;xxljob 3. 导入数据库 3.1请下载项目源码并解压&#xff0c;获取 “调…

ElasticSearch(九)— 聚集查询2

一、 范围分桶聚集 如果使用 SQL 语言类比&#xff0c;桶型聚集与 SQL 语句中的 group by 子句极为相似。桶型聚集(Bucket Aggregation)是 Elasticsearch 官方对这种聚集的叫法&#xff0c;它起的作用是根据条件对文档进行分组。 可以将这里的桶理解为分组的容器&#xff0c;…