源本科技 | 码上会

MySQL 高频面试题及参考答案

2026/04/05
1
0

MySQL中InnoDB和MyISAM存储引擎的区别

InnoDB 是 MySQL 默认的事务型存储引擎,MyISAM 是早期非事务引擎,核心区别很明显。InnoDB 支持事务、行级锁、外键和崩溃恢复,适合高并发、数据一致性要求高的场景,比如电商订单。MyISAM 不支持事务和外键,用表级锁,查询速度快但并发差,支持全文索引,适合只读、查询多的静态数据。InnoDB 底层是聚簇索引,数据和索引存一起;MyISAM 是非聚簇索引,数据和索引分离。此外 InnoDB 支持 MVCC 多版本并发控制,能提升读写并发性能,现在生产环境几乎都用 InnoDB,MyISAM 仅用于老旧项目。

MySQL中的索引类型及其使用场景

MySQL 索引主要分 B-Tree、哈希、全文、空间索引,最常用 B-Tree。普通索引用于基础查询加速;唯一索引保证列值唯一,允许一个 NULL;主键索引是特殊唯一索引,非空且唯一,每张表必设;联合索引将多列组合,适合多条件查询,遵循最左匹配原则;覆盖索引查询时直接从索引取数据,不用回表。哈希索引查询极快但只支持等值查询,不支持范围查询。全文索引用于文本关键词搜索,空间索引用于地理数据。日常开发优先用 B-Tree 联合索引,覆盖索引优化高频查询。

MySQL中如何实现高效的分页查询

MySQL 分页常用 limit offset,offset 过大会全表扫描,效率极低。高效方案:主键索引分页,用where id > 页码*每页条数 limit 条数,利用主键索引快速定位,避免全表扫描。联合索引优化,查询字段建立覆盖索引,直接从索引取数,无需回表。延迟关联法,先查主键 id 再关联查询数据,减少扫描行数。大数据量分页用书签记录上次最后一条 id,下次从该 id 开始查询。禁止使用limit 100000,20这种大偏移分页,生产环境优先主键 id 分页,配合覆盖索引,性能提升几十倍。

MySQL中的锁机制有哪些类型

MySQL 锁按粒度分全局锁、表级锁、行级锁。全局锁锁定整个库,用于全库备份;表级锁锁定整张表,开销小、加锁快,但并发低,MyISAM 默认使用。行级锁锁定单行数据,并发高、开销大,InnoDB 默认使用,支持事务。按性质分共享锁(读锁),允许多个事务同时读,互斥写;排他锁(写锁),独占资源,读写都互斥。InnoDB 还有意向锁,协调表锁和行锁,避免冲突。行锁基于索引实现,索引失效会升级为表锁,高并发场景要合理设计索引,避免锁升级。

MySQL中的事务隔离级别及其特点

MySQL 有四种事务隔离级别,解决脏读、不可重复读、幻读问题。读未提交:最低级别,允许读取未提交数据,会出现脏读、不可重复读、幻读,基本不用。读已提交:只能读取已提交数据,解决脏读,仍有不可重复读、幻读,Oracle 默认级别。可重复读:MySQL 默认级别,同一事务内读取数据一致,解决脏读、不可重复读,通过 MVCC 避免幻读。串行化:最高级别,事务串行执行,完全避免所有问题,但并发极低,仅用于数据强一致场景。日常用可重复读,兼顾并发和数据安全。

MySQL如何处理死锁

死锁是多个事务互相持有对方需要的锁,循环等待导致僵持。InnoDB 内置死锁检测机制,能实时发现循环等待,立即回滚代价最小的事务,释放锁让其他事务执行。预防死锁的方法:统一按固定顺序访问表和行,避免循环依赖;事务保持短小,尽快提交释放锁;使用低隔离级别,减少锁持有时间;合理设计索引,避免行锁升级为表锁。还能设置锁等待超时时间,超时自动释放锁。生产环境通过查看死锁日志分析原因,优化业务逻辑和索引,从根源减少死锁发生。

MySQL中的ACID是什么

ACID 是事务的四大特性,保证数据安全可靠。原子性:事务是最小单元,要么全部执行成功,要么全部回滚失败,比如转账扣钱和加钱必须同时完成。一致性:事务执行前后数据完整性不变,约束、索引、外键都保持有效。隔离性:多个事务并发执行,互不干扰,一个事务看不到另一个事务的中间状态。持久性:事务提交后,数据永久保存到磁盘,即使数据库崩溃也不会丢失。InnoDB 通过 redo log 保证持久性,undo log 保证原子性和一致性,锁 +MVCC 保证隔离性,是事务的核心保障。

MySQL的索引覆盖是什么及其优点

索引覆盖是查询的所有字段都包含在索引中,MySQL 直接从索引树获取数据,不用回表查询聚簇索引。比如建立(name,age)联合索引,查询select name,age from user where name='张三',就能触发覆盖索引。优点:大幅提升查询速度,避免回表的 IO 开销;减少数据页加载,降低内存使用;避免行锁竞争,提升并发性能;减少随机 IO,转为顺序 IO。使用场景:高频查询、报表统计、分页查询,只需给查询字段建立联合索引,就能实现覆盖索引,是 SQL 优化的核心手段。

MySQL中的GROUP BY与ORDER BY有什么区别

GROUP BY 是分组聚合,ORDER BY 是排序,功能完全不同。GROUP BY 将相同字段值的数据分为一组,配合聚合函数 sum、count、avg 使用,比如统计每个部门的员工数,分组后每组只返回一条结果。ORDER BY 对查询结果按指定字段升序或降序排序,不改变数据行数,只是调整展示顺序。执行顺序上,先 GROUP BY 分组聚合,再 ORDER BY 排序结果。GROUP BY 会产生临时表和文件排序,性能较低,可建立索引优化。简单说,分组是合并数据,排序是整理数据顺序。

MySQL中的慢查询日志及其如何使用

慢查询日志记录执行时间超过阈值的 SQL 语句,用于定位性能瓶颈。开启方法:在配置文件设置slow_query_log=1long_query_time=1(单位秒),指定日志文件路径。也可动态开启,无需重启数据库。分析工具用 mysqldumpslow,能统计最慢的 SQL、执行次数、锁定时间。生产环境建议开启,阈值设为 1 秒,定期分析日志,优化慢 SQL。慢查询会记录全表扫描、无索引、大偏移分页等低效语句,优化后能大幅提升数据库性能,是 DBA 日常排查的核心工具。

MySQL中的JOIN类型有哪些,它们是如何工作的

MySQL 常用 JOIN 分内连接、左连接、右连接、全连接。内连接(INNER JOIN):只返回两张表匹配的数据,取交集,最常用。左连接(LEFT JOIN):左表数据全部返回,右表匹配则显示,不匹配为 NULL。右连接(RIGHT JOIN):右表数据全部返回,左表匹配则显示,不匹配为 NULL。全连接(FULL JOIN):返回两张表所有数据,MySQL 不直接支持,用 union 替代。JOIN 底层通过嵌套循环、哈希连接实现,匹配条件用索引会大幅提升性能,建议小表驱动大表,关联字段建立索引,避免笛卡尔积。

MySQL中的二级索引是什么

二级索引也叫辅助索引,是 InnoDB 除主键索引外的所有索引,比如普通索引、唯一索引、联合索引。二级索引的叶子节点存储索引列值和主键值,不存储完整数据。查询时先通过二级索引找到主键,再用主键回表查询聚簇索引获取完整数据。如果是覆盖索引,就不用回表。二级索引能加速查询,一张表可以建立多个二级索引,满足不同查询场景。但索引会占用磁盘空间,降低增删改效率,所以要按需创建,避免冗余索引,高频查询字段优先建立二级索引。

MySQL中的正则表达式(RE)匹配是如何工作的

MySQL 通过REGEXP关键字实现正则匹配,用于复杂的字符串模糊查询。语法:字段 REGEXP '正则表达式',支持匹配开头、结尾、包含、数字、字母、任意字符等规则。比如name REGEXP '^张'查询姓张的用户,phone REGEXP '[0-9]{11}'验证手机号。正则匹配是全表扫描,无法使用索引,性能较低,仅适合小数据量、复杂规则的查询。大数据量优先用普通索引 +like 查询,正则仅用于无法用 like 实现的复杂匹配场景,使用时要注意性能损耗。

MySQL中的B-Tree索引和HASH索引的区别

B-Tree 是 MySQL 默认索引,哈希索引仅 Memory 引擎支持。B-Tree 支持等值、范围、模糊、排序、分组查询,底层是平衡多叉树,查询稳定。哈希索引仅支持等值查询,通过哈希算法计算哈希值定位数据,查询速度极快,但不支持范围、排序、模糊查询。B-Tree 有序存储,支持联合索引和最左匹配;哈希索引无序,联合索引无效。B-Tree 适合绝大多数业务场景,哈希索引仅用于内存表、等值查询极高的场景。InnoDB 不支持哈希索引,会自适应哈希索引优化 B-Tree 查询。

MySQL优化器是什么,它如何工作

MySQL 优化器是 SQL 执行的核心组件,负责生成最优执行计划。接收到 SQL 后,先解析语法语义,再统计表、索引、数据量信息,评估不同执行方案的成本。优化器会选择索引、JOIN 顺序、连接方式,比如选成本最低的索引,小表驱动大表,决定使用嵌套循环还是哈希连接。还会优化子查询、合并过滤条件、消除无用索引。优化器基于成本模型选择最优方案,最终生成执行计划交给执行器。我们可以通过 explain 查看执行计划,根据优化器的选择调整索引和 SQL,提升执行效率。

MySQL中的MVCC(多版本并发控制)机制是什么

MVCC 是 InnoDB 的并发控制机制,通过多版本数据实现无锁读写,提升并发性能。每行数据隐藏创建版本号、删除版本号,事务根据版本号读取对应数据。读已提交和可重复读隔离级别基于 MVCC 实现,普通查询是快照读,读取历史版本数据,不用加锁,不阻塞写操作。写操作会生成新版本数据,不覆盖旧版本。MVCC 解决了脏读、不可重复读问题,实现读写并行,只有写写操作互斥。旧版本数据通过 undo log 存储,后台 purge 线程定期清理过期数据,节省空间。

MySQL中如何实现高可用架构

MySQL 高可用核心是避免单点故障,常用主从复制 + 高可用组件。主从复制:主库写数据,同步到从库,从库负责读,实现读写分离。高可用用 MGR(MySQL 组复制),分布式强一致架构,自动故障转移。也可用 Keepalived+VIP,主库故障自动切换到从库。架构分层:主库写、多从库读,中间用 MyCat、ShardingSphere 做分库分表。配合哨兵、监控告警,实时检测节点状态。存储用共享存储或云盘,数据持久化。整套架构保证数据库故障自动切换,数据不丢失,服务不间断。

MySQL中什么是二阶段提交(2PC)

二阶段提交是 InnoDB 保证事务原子性和持久性的机制,协调 redo log 和 binlog 的提交。分为准备阶段和提交阶段。准备阶段:事务执行完成,写入 redo log,标记为准备状态。提交阶段:写入 binlog,然后将 redo log 标记为提交状态。只有两个日志都写入成功,事务才算提交。如果数据库崩溃,恢复时根据 redo log 和 binlog 的状态,一致则提交,不一致则回滚。二阶段提交保证了 redo log 和 binlog 的数据一致性,是主从复制和事务持久化的核心基础,避免数据丢失或错乱。

MySQL中的视图是什么?它有什么用途

视图是虚拟表,本身不存储数据,数据来自基础表,通过查询语句定义。使用方式和普通表一样,支持查询、更新(满足条件)。用途:简化复杂 SQL,将多表 JOIN 封装成视图,方便复用。数据安全,隐藏敏感字段,只给用户开放视图,控制数据访问权限。逻辑隔离,基础表结构变更时,修改视图即可,不影响业务代码。视图不占用存储空间,查询时动态执行 SQL 获取数据。注意更新视图有严格限制,复杂视图仅用于查询,适合封装高频复杂查询、权限控制场景。

MySQL中如何优化大表的查询性能

大表优化核心是减少数据扫描和 IO 开销。首选分库分表,水平拆分按 id 分片,垂直拆分按业务字段拆分。建立合适索引,高频查询字段建联合索引,使用覆盖索引避免回表。优化 SQL,禁止 select *,只查需要字段,避免大偏移分页,用主键 id 分页。分区表,按时间、地区分区,查询只扫描对应分区。读写分离,主库写,从库读,分散查询压力。清理历史数据,归档无用数据,减少表数据量。定期优化表,分析表碎片,重建索引。配合缓存,热点数据放 Redis,减少数据库查询。

MySQL中的存储过程和函数有什么区别

存储过程和函数都是预编译的 SQL 集合,存储在数据库中。核心区别:函数必须返回一个值,存储过程可以无返回值或多个返回值。函数用 return 返回,存储过程用 out 参数返回。函数可以嵌套在 SQL 语句中使用,存储过程只能用 call 调用。函数限制多,不能写事务、动态 SQL,存储过程支持事务、循环、分支、动态 SQL。函数用于计算、数据处理,存储过程用于复杂业务逻辑。存储过程性能高,减少网络交互,但维护难、移植性差,现在微服务架构很少使用,仅用于老旧系统。

MySQL优化查询性能的常用方法

查询优化核心是减少扫描行数和 IO 开销。第一步建索引,where、join、order by 字段建索引,用联合索引遵循最左匹配,使用覆盖索引。第二步优化 SQL,避免 select *,禁止隐式类型转换,少用子查询改用 JOIN,小表驱动大表。第三步避免索引失效,不用!=、is null、like '%xx',不运算索引字段。第四步分页优化,用主键 id 替代大 offset。第五步分析执行计划,用 explain 查看索引使用情况。第六步读写分离、分库分表,配合缓存。定期清理慢查询,优化表结构,减少冗余数据,提升查询效率。

MySQL中的主从复制是如何工作的

主从复制实现数据备份和读写分离,基于 binlog 日志。主库开启 binlog,记录所有写操作。从库启动 IO 线程,连接主库读取 binlog,写入本地 relay log。从库 SQL 线程读取 relay log,重放日志中的 SQL 语句,同步主库数据。主从复制分异步、半同步、强同步三种模式,异步性能高,半同步保证数据不丢失。主库写,从库读,分散查询压力,主库故障可切换从库。复制过程有延迟,可通过优化网络、并行复制减少延迟,是 MySQL 高可用、读写分离的基础。

MySQL中的存储引擎有哪些?它们各有什么特点

MySQL 常用存储引擎:InnoDB、MyISAM、Memory、CSV、Archive。InnoDB:默认引擎,支持事务、行锁、外键、MVCC,高并发、数据安全,适合绝大多数业务。MyISAM:不支持事务,表锁,查询快,适合只读静态数据。Memory:数据存内存,速度极快,重启丢失,用于临时数据、缓存。CSV:存储 CSV 格式数据,方便数据交换。Archive:只支持插入和查询,高压缩,用于日志存储。生产环境只用 InnoDB,其他引擎仅用于特殊场景,存储引擎基于表设置,一张表对应一个引擎。

MySQL中的主键和唯一键的区别

主键和唯一键都保证列值唯一,核心区别:一张表只能有一个主键,可多个唯一键。主键不允许为 NULL,唯一键允许一个 NULL 值。主键默认创建聚簇索引,数据按主键顺序存储;唯一键创建二级索引。主键通常用自增 id,作为数据唯一标识;唯一键用于业务唯一字段,比如手机号、身份证号。主键是表的核心标识,必须设置;唯一键是业务约束,按需添加。两者都能加速查询,主键索引性能更高,设计表时优先用自增主键,业务唯一字段用唯一键约束。

MySQL中的事务是什么,如何在MySQL中使用事务

事务是一组不可分割的 SQL 操作,保证数据一致性。InnoDB 支持事务,MyISAM 不支持。使用方法:begin 或 start transaction 开启事务,执行增删改 SQL,commit 提交事务,rollback 回滚事务。事务执行出错或业务不满足条件,调用回滚恢复数据。比如转账事务,扣钱和加钱必须同时成功或失败。事务要保持短小,避免长时间占用锁,影响并发。默认自动提交模式,每条 SQL 单独事务。手动事务适合批量操作、业务逻辑强相关的操作,保证数据安全。

MySQL中的规范化是什么,为什么要进行规范化

规范化是数据库表设计的规则,分 1NF 到 5NF,核心是减少数据冗余,保证数据一致性。第一范式:列不可拆分,原子性。第二范式:消除部分依赖,非主键字段完全依赖主键。第三范式:消除传递依赖,非主键字段不依赖其他非主键字段。规范化后,表结构清晰,更新数据只需修改一处,避免数据不一致。缺点是表拆分多,查询需要 JOIN,性能降低。实际开发用三范式设计基础表,结合业务反规范化,适当冗余提升查询性能,平衡数据一致性和查询效率。

MySQL中的存储过程是什么,使用它有哪些优缺点

存储过程是预编译的 SQL 集合,存储在数据库中,可重复调用。优点:减少网络交互,批量操作只传一次请求;预编译执行,性能高;权限控制,用户只能调用存储过程,保护数据;代码复用,统一业务逻辑。缺点:移植性差,不同数据库不兼容;维护困难,调试麻烦;耦合性高,业务逻辑写在数据库,微服务架构不适用。存储过程适合老旧单体项目,现在分布式、微服务架构几乎不用,业务逻辑放在代码层,更易维护和扩展。

MySQL索引的底层实现原理是什么

MySQL InnoDB 索引底层是 B+Tree,一种平衡多叉树。B+Tree 所有数据存在叶子节点,非叶子节点存储索引键,用于导航。叶子节点形成双向链表,有序存储,支持范围查询和排序。聚簇索引:主键索引,叶子节点存储完整行数据。二级索引:叶子节点存储索引键和主键值,查询需要回表。B+Tree 高度低,一般 3-4 层,查询只需 3-4 次 IO,效率极高。索引有序存储,支持快速查找、排序、分组。增删改会调整 B+Tree 结构,所以索引会降低写入性能,合理设计索引才能平衡读写效率。