news 2026/4/8 4:27:36

MySQL相关面试题总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL相关面试题总结
1. MySQL事务的ACID是什么?

考察点:事务的4个特征

  • 原子性Atomicity
    • 一个事务必须是不可分割的最小工作单元,整个事务操作要么全部成功,要么全部失败,一般就是通过commitrollback来控制;
  • 一致性Consistency
    • 事务必须是使数据库从一个一致性状态变到另一个一致性状态。通俗的来说就是,事务的结果必须和预期相符
  • 隔离性Isolation
    • 一个事务相对于另一个事务是隔离的,一个事务所做的修改是在最终提交以前,对其他事务是不可见的,一个事务对一个数据进行操作时,其他事务不允许对同一个数据进行操作;
  • 持久性Durability
    • 事务一旦提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失;
2. MySQL中的脏读、幻读、不可重复读度你知道多少?

考察点:事务的隔离级别以及导致的相关问题

幻读和不可重复度的区别:

3. 事务隔离级别由低到高有哪几种?MySQL默认是哪种?

考察点:事务的隔离级别、MySQL的事务隔离级别

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

4. MySQL如何解决不可重复度和幻读问题?

对于MVCC,在《高性能MySQL》中有如下解释:

4.1 MySQL解决不可重复读问题
-- MySQL中,默认使用的事务隔离界别是可重复读,为了解决不可重复读问题,InnoDB采用了MVCC(多版本并发控制)【基于乐观锁】来解决! -- MVCC(多版本并发控制)是利用在每条数据后面加了隐藏的两列(创建版本号和删除版本号),每个事务在开始的时候都会有一个**递增的当前事务版本号**! -- MVCC新增 begin; -- 假设获取的 当前事务版本号=1 insert into user (id,name,age) values (1,"张三",10); -- 新增,当前事务版本号是1 insert into user (id,name,age) values (2,"李四",12); -- 新增,当前事务版本号是1 commit; -- 提交事务

AI写代码sql

idnameagecreate_versiondelete_version
1张三101NULL
2李四121NULL
-- 上表可以看到,插入的过程中会把当前事务版本号记录到列 create_version 中去! -- MVCC删除:删除操作是直接将行数据的删除版本号更新为当前事务的版本号 begin; --假设获取的 当前事务版本号=3 delete from user where id = 2; commit; -- 提交事务

AI写代码sql

idnameagecreate_versiondelete_version
1张三101NULL
2李四1213
-- MVCC更新操作:采用 delete + add 的方式来实现,首先将当前数据标志为删除,然后再新增一条新的数据 begin;-- 假设获取的 当前事务版本号=10 update user set age = 11 where id = 1; -- 更新,当前事务版本号是10 commit; -- 提交事务

AI写代码sql

idnameagecreate_versiondelete_version
1张三10110
2李四1213
1张三1110NULL
-- MVCC查询操作: begin;-- 假设拿到的系统事务ID为 12 select * from user where id = 1; commit; -- 提交事务

AI写代码sql

查询操作为了避免查询到旧数据或已经被其他事务更改过的数据,需要满足如下条件:

1、查询时当前事务的版本号需要大于或等于创建版本号create_version

2、查询时当前事务的版本号需要小于删除的版本号delete_version,或者当前删除版本号delete_version=NULL

即:(create_version <= current_version < delete_version) || (create_version <= current_version && delete_version-=NULL)这样就可以避免查询到其他事务修改的数据,同一个事务中,实现了可重复读

执行结果应该是:

idnameagecreate_versiondelete_version
1张三1110NULL
4.2 MySQL解决幻读问题

什么是幻读,如下:

InnoDB实现的RR通过mvcc机制避免了这种幻读现象

快照读和当前读

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

让数据变得可重复读,但我们读到的数据可能是历史数据,不是数据库最新的数据。这种读取历史数据的方式,我们叫它快照读 (snapshot read),而读取数据库最新版本数据的方式,叫当前读 (current read)。

快照读介绍

当执行select操作时,innodb默认会执行快照读,会记录下这次select后的结果,之后select的时候就会返回这次快照的数据,即使其他事务提交了也不会影响当前select的数据,这就实现了可重复读了。

快照的生成当在第一次执行select的时候,也就是说假设当A开启了事务,然后没有执行任何操作,这时候Binsert了一条数据然后commit,这时候A执行select,那么返回的数据中就会有B添加的那条数据。之后无论再有其他事务commit都没有关系,因为快照已经生成了,后面的select都是根据快照来的。

当前读

对于会对数据修改的操作(update、insert、delete)都是采用当前读的模式。在执行这几个操作时会读取最新的版本号记录,写操作后把版本号改为了当前事务的版本号,所以即使是别的事务提交的数据也可以查询到。假设要update一条记录,但是在另一个事务中已经delete掉这条数据并且commit了,如果update就会产生冲突,所以在update的时候需要知道最新的数据。也正是因为这样所以才导致幻读。

Next-Key Lock即在事务中select时使用如下方法加锁,这样在另一个事务对范围内的数据进行修改时就会阻塞(为什么有共享锁会阻塞?不能在有共享锁的记录上加X锁)

select * from table where id<6 lock in share mode; --共享锁 select * from table where id<6 for update; --排他锁

AI写代码sql

关于next-key locks请参考https://www.cnblogs.com/zhoujinyi/p/3435982.html

5. MySQL常见的存储引擎?
区别项InnoDBMYISAM
事务支持不支持
锁粒度行锁,适合高并发表锁,不适合高并发
是否默认默认非默认
支持外键支持外键不支持
适用场景读写均衡,写多读少场景,需要事务读多写少场景,不需要事务
全文索引不支持(可以借助插件或者使用ElasticSearch)支持
6. MySQL的行锁与表锁,乐观锁悲观锁问题?
8. 数据库设计三大范式?
9. MySQL查询的指令顺序为?
select -- 查看哪些结果字段 from -- 从哪个表查询 where -- 初步过滤条件 group by -- 过滤后进行分组[重点] having -- 对分组后的数据进行二次过滤[重点] order by -- 按照怎样的顺序进行排序返回[重点] SELECT * num FROM chapter GROUP BY video_id HAVING num >10 ORDER BY video_id DESC

AI写代码sql

10. MySQL中字段类型CHAR 和 VARCHA 的区别?
对比项char(16)varchar(16)
长度特点长度固定,存储字符长度可变,存储字符
长度不足情况插入的长度小于定义长度时,则用空格填充小于定义长度时,按实际插入长度存储
性能存取速度比varchar得多存取速度比char得多
使用场景适合存储很短的,固定长度的字符串,如手机号,MD5值等适合用在长度不固定场景,如收货地址,邮箱地址等

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

11. MySQL中字段类型DATETIME 和 TIMESTA的区别?
类型占据字节范围时区问题
datetime8 字节1000-01-01 00:00:00到 9999-12-31 23:59:59存储与时区无关,不会发生改变
timestamp4 字节1970-01-01 00:00:01 到 2038-01-19 11:14:07存储的是与时区有关,随数据库的时区而发生改变
-- MySQL的timestamp类型是4个字节,最大值是2的31次方减1,结果是: 2147483647 -- 转换成北京时间就是: 2038-01-19 11:14:07

AI写代码sql

12. Mybatis中 # 和 $的区别?
SELECT * FROM users WHERE `username` = ''OR' 1=1'

AI写代码sql

有图看到,我虽然没有输入对正确的用户名,但是一次性查出了很多用户信息,这就是SQL注入!

13. MySQL大数据量sql分页优化思路?

问题:线上数据库的一个商品表数据量过千万,做深度分页的时候性能很慢,有什么优化思路?

- 现象:千万级别数据很正常,比如数据流水、日志记录等,数据库正常的深度分页会很慢 - 慢的原因:select * from product limit N,M - MySQL执行此类SQL时需要先扫描到N行,然后再去取M行,N越大,MySQL扫描的记录数越多,SQL的性能就会越差

AI写代码markdown

解决思路:

-- 1、可以使用后端缓存Redis、前端缓存localstorage -- 2、使用ElasticSearch分页搜索 -- 3、合理使用 mysql 索引 -- 比如title,cateory被设置为该表的复合索引,可以提高查询效率 select title,cateory from product limit 1000000,100 -- 4、如果id是自增且不存在中间删除数据,使用子查询优化,定位偏移位置的 id -- 这种方式比较耗时,因为需要先检索前1000000行数据,再检索1000000-1000500的目标数据 select * from oper_log where type='BUY' limit 1000000,100; -- 5秒 -- 因为id是主键索引,查询速度快,先检索前1000000行记录的id值,并找到第1000000行记录的id值 select id from oper_log where type='BUY' limit 1000000,1; -- 0.4秒 -- 再做一个子查询,因为是主键递增,所以id>=第1000000行记录的id值,这样就相当于跳过扫描前100000行数据,直接从第1000000开始往后检索100条数据 select * from oper_log where type='BUY' and id>=(select id from oper_log where type='BUY' limit 1000000,1) limit 100; -- 0.8秒

AI写代码sql

14. MySQL常见日志种类和作用?
- 1. redo 重做日志: - 作用:确保事务的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,到达事务一致性 - 2. undo 回滚日志 - 作用:保证数据的原子性,记录事务发生之前的数据的一个版本,用于回滚。innodb事务的可重复读和读取已提交 隔离级别就是通过mvcc+undo实现 - 3. errorlog 错误日志 - 作用:Mysql本身启动、停止、运行期间发生的错误信息 - 4. slow query log 慢查询日志 - 作用:记录执行时间过长的sql,时间阈值可以配置,只记录执行成功 - 5. binlog 二进制日志 - 作用:用于主从复制,实现主从同步 - 6. relay log 中继日志 - 作用:用于数据库主从同步,将主库发送来的binlog先保存在本地,然后从库进行回放 - 7. general log 普通日志 - 作用:记录数据库操作明细,默认关闭,开启会降低数据库性能

AI写代码markdown

15. MySQL事务的特性是通过什么实现的?
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 12:17:12

错过Open-AutoGLM,等于错过未来5年文创产业红利期

第一章&#xff1a;错过Open-AutoGLM&#xff0c;等于错过未来5年文创产业红利期在人工智能与内容创作深度融合的今天&#xff0c;Open-AutoGLM 正成为驱动文创产业升级的核心引擎。它不仅能够自动化生成高质量文本、图像与多媒体内容&#xff0c;还能根据用户偏好进行个性化推…

作者头像 李华
网站建设 2026/4/3 10:56:48

【AutoGLM-Phone-9B模型部署全攻略】:从下载到本地运行的9个关键步骤详解

第一章&#xff1a;AutoGLM-Phone-9B 模型部署概述AutoGLM-Phone-9B 是基于 GLM 架构专为移动端优化设计的大语言模型&#xff0c;具备高效的推理性能与低资源占用特性&#xff0c;适用于在边缘设备上实现本地化自然语言处理任务。该模型通过量化压缩、算子融合与硬件适配等技术…

作者头像 李华
网站建设 2026/4/6 3:39:56

【好写作AI】让每个人都拥有“写作自由”:打破论文写作的枷锁,释放思想的无限潜能

你是否曾因“不知如何下笔”而将绝妙的科研灵感搁置&#xff1f;是否因“害怕格式错误”而在繁琐的排版中耗尽热情&#xff1f;是否因“语言表达苍白”而无法让论文匹配你思想的深度&#xff1f;这些无形的枷锁&#xff0c;正剥夺着研究者最宝贵的财富——自由表达思想的权利。…

作者头像 李华
网站建设 2026/4/3 10:56:43

缺陷就是Bug?对了,但没完全对……

我叫缺陷&#xff0c;从被创建至关闭&#xff0c;到最后做缺陷分析&#xff0c;这是我的完整生命周期。我的整个生命周期贯穿着整个项目的项目周期&#xff0c;因此&#xff0c;掌握我的生命周期&#xff0c;不止是测试人员必修的课程&#xff0c;也是测试人员的灵魂。缺陷的定…

作者头像 李华