跳转到内容

mysql典型面试题

梳理一下可能会遇到的典型mysql面试题

lyonmu
约 5 分钟阅读

事务隔离级别有哪些,mysql默认的事务隔离级别是什么

事务隔离级别

  • 读未提交(Read Uncommitted):最低的隔离级别。事务可以读到其他事务未提交的数据,会产生“脏读”问题。
  • 读已提交(Read Committed):事务只能读到其他事务已提交的数据。解决了脏读,但会产生“不可重复读”问题(即同一个事务内,两次读取同一条数据结果不一样)。
  • 可重复读(Repeatable Read):保证在同一个事务内,多次读取同一条数据的结果是一致的。解决了不可重复读问题。
  • 串行化(Serializable):最高的隔离级别。强制所有事务串行执行,完全避免了脏读、不可重复读和幻读,但并发性能最低。

mysql默认事务隔离级别

  • MySQL 默认的事务隔离级别是 可重复读(Repeatable Read)。
  • 选择这个级别是因为它在 一致性 和 并发性 之间提供了合理的折衷,能够解决 不可重复读 和 幻读 等常见问题,并且在大多数应用场景下提供了较高的性能。
  • 可重复读 隔离级别是 InnoDB 引擎的默认选择,它通过 下一键锁 减少了幻读问题的影响,因此在多数情况下都能满足大部分数据库应用的需求。

事务有哪些特性

  • 原子性(atomicity):表示事务是一个不可再分割的工作单元,事务中的操作要么全部执行成功,要么全部执行失败。
  • 一致性(consistency):表示事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
  • 隔离性(isolation):表示多个事务并发访问时,事务之间是隔离的互不干扰的,一个事务不应该影响其它事务运行效果。
  • 持久性(durability):一个事务一旦提交成功,它对数据库中的数据的操作是永久的。

mysql有哪些表引擎,为什么会使用InnoDB

存储引擎

  • InnoDB:MySQL 的默认引擎(5.5 版本之后),支持事务、行级锁和外键,适合高并发的在线事务处理(OLTP)。
  • MyISAM:早期版本的默认引擎,不支持事务和行级锁,但读取速度快,适合读多写少的场景。
  • Memory:将所有数据存储在内存中,读写速度极快,但服务重启后数据会丢失,适合做临时表或缓存。
  • Archive:支持高压缩比,只支持插入和查询,专门用于存储大量的历史归档数据或日志。

InnoDB核心优势

InnoDB 之所以成为默认引擎,是因为它在数据安全和并发性能上具备四大核心优势:

  • 支持事务(ACID):这是最关键的。InnoDB 完整支持事务的原子性、一致性、隔离性和持久性,能够保证业务数据的一致性(比如转账操作要么全成功,要么全回滚)。
  • 支持行级锁:相比于 MyISAM 的表级锁(一写全表阻塞),InnoDB 在更新数据时只锁定相关的行。这极大地提升了高并发场景下的读写吞吐量。
  • 崩溃恢复能力强:它通过重做日志(Redo Log)机制,即使在数据库意外宕机后,也能自动恢复已提交的数据,保证数据不丢失。
  • 支持外键约束:InnoDB 是 MySQL 中唯一原生支持外键的常用引擎,可以在数据库层面强制维护表与表之间的数据完整性。

在生产上是如何优化mysql查询性能

  1. 数据类型最小化 能用字节小的数据类型就用小的。比如状态字段用 TINYINT 而不是 VARCHAR,IP地址用 INT UNSIGNED 存储,时间用 DATETIME 而不是字符串。这样不仅能节省存储空间,还能提升索引效率和查询速度
  2. 字段尽量 NOT NULL 能设置 NOT NULL 就尽量设置。因为 NULL 值会使索引、索引统计和值的比较都变得更复杂,增加索引的复杂度,甚至可能导致索引失效。通常建议用默认值(如 0 或空字符串)来代替 NULL
  3. 避免宽表 不要把几十个字段都塞进一张表里。对于不常用或体积很大的字段(比如用户简介 TEXT、头像URL等),应该通过垂直分表拆分到单独的副表中。这样主表只保留高频查询的核心字段,能大幅提升查询效率
  4. 高频查询字段增加索引 为 WHERE、ORDER BY、GROUP BY 和 JOIN 中高频使用的字段创建合适的索引。特别是复合索引,要遵循最左前缀匹配原则。但也要注意“少而精”,避免创建过多索引,因为每次增删改操作都需要同步更新索引,会降低写入性能
  5. Redis 热点数据作缓存 对于读多写少的热点数据(如商品详情、用户信息),使用 Redis 作为缓存层。这能拦截掉绝大部分的数据库查询请求,极大地减轻 MySQL 的压力,提升系统的整体响应速度

数据表你们选取的是什么字符集,为什么这样选择

我们数据库统一使用的是 utf8mb4 字符集。

因为 MySQL 里的 utf8 其实是 utf8mb3 的别名,最多只支持 3 个字节。而真正的 UTF-8 标准是支持 4 个字节的。为了支持完整的 Unicode 字符,我们必须用 utf8mb4。

使用 utf8mb4 最大的好处是完美支持 Emoji 表情和一些生僻汉字。如果用普通的 utf8,用户输入表情时数据库会直接报错,而 utf8mb4 彻底避免了这个问题,且对常用中英文的存储开销没有影响。

上一篇
RTX 4060 8GB 部署 Qwen3-0.6B-FP8:vLLM 启动与显存调优
下一篇
redis典型面试题

搜索笔记

输入关键词搜索文章 · 打开搜索页 ↗