1. MySQL 的存储引擎有哪些?它们之间有什么区别?默认使用哪个?

MySQL 的存储引擎主要包括 InnoDB、MyISAM、Memory、CSV、Archive 等。

  • InnoDB 支持事务、外键和行级锁定,适合高并发写操作;
  • MyISAM 不支持事务和外键,表级锁定,但查询速度快,适合读多写少的场景;
  • Memory 使用内存存储数据,速度快但数据易丢失;
  • CSV 和 Archive 适合存储大批量数据。
  • MySQL 默认使用 InnoDB。

2. MyISAM 与 InnoDB 有什么区别?如何选择?

  • MyISAM 不支持事务和外键,使用的是表级锁进行锁定,适合读多写少的场景;
  • InnoDB 支持事务、外键和行级锁定,适合高并发写操作。
  • 选择时根据应用需求决定:需要事务和高并发写入时选 InnoDB,读多写少时可选 MyISAM。(Mysql默认使用InnoDB)

3. InnoDB 是如何存储数据的?

InnoDB 通过表空间、页和行的结构化方式存储数据,将数据保存在磁盘上的数据文件中,采用聚簇索引来组织数据行,支持事务、外键和行级锁定,从而实现高效的数据检索和管理。
页默认为16kb,页是InnoDB最小的存储单位,行是数据的最基本的存储单位。

4. MySQL 一行记录是怎么存储的?

  • MySQL的行数据存储在数据页中,包含行头信息,实际数据和可变字段的偏移量以及NULL值字段表,具体结构由存储方式决定,
  • 如果是b + 树的存储方式,那么就是只有叶子节点存放数据;
  • 如果是 b 树的存储方式,那么就是数据和结构一起存放在节点之中

5. 详细描述一条 SQL 在 MySQL 中的执行过程

  • 首先客户端通过连接器连接Mysql服务器,连接器会校验身份、建立连接
  • 然后分析器通过词法和语法分析,校验SQL是否合法,生成对应的语法树
  • 再通过优化器确定是否需要使用索引等方式,选择最佳执行计划
  • 再通过执行器调用存储引擎按照计划存取数据
  • 再由执行器处理结果后返回给客户端
  • 最终关闭连接或空闲连接

6. MySQL 的查询优化器如何选择执行计划?

  • MySQL 的查询优化器通过分析 SQL 语句的多种执行路径,结合表的统计信息、索引的可用性、查询条件等因素,评估每种路径的成本,选择代价最低的执行计划。
  • 优化器会考虑使用索引、表连接顺序、排序和分组等操作,以提高查询效率。最终,优化器生成的执行计划将被传递给执行器执行。

7. SQL 中 select、from、join、where、group by、having、order by、limit 的执行顺序?

  • from确定来源
  • join进行连接
  • where筛选匹配条件
  • group by进行分组合并
  • having对分组结果进行筛选过滤
  • select进行计算(函数),选择目标列(别名)
  • order by对select后的结果集进行排序
  • limit限制排序后的结果集数据(尺寸)

8. MySQL 中的数据排序(ORDER BY)是如何实现的?

MySQL排序方式主要有索引排序,文件排序,优先队列排序。
索引排序直接利用索引返回结果,不需要额外的排序,效率最高。
如果使用索引排序找不到目标索引,则需要文件排序,当查询数据小于max_length_for_sort这个参数的时候使用单路排序,所有排序字段都存储在内存中。
如果大于这个字段,则会只根据字段进行排序,排序完了还需要返回表查询所有数据,也就是双路排序。
当排序数据大于内存限制,则利用外部磁盘进行外部排序,一般使用归并排序算法来做

9. 为什么阿里巴巴 Java 手册不推荐使用存储过程?

因为存储过程的可移植性差、调试困难、维护复杂、且容易导致业务逻辑分散,不利于系统的统一管理和拓展。

10. 如何实现数据库不停服迁移?

将新数据库定义为老数据库的从节点,使用主从复制或者数据同步复制,将老数据库中的数据同步到新数据库中。
等待确认老数据已经在新数据库中同步完成,且新数据库能够实时跟上老数据库的写入(延迟较小),这是就可以切换为双写模式。
对数据进行校验和灰度切换(从新数据库中读,如果有问题则马上切换到老数据库中读(回滚)),当确认新数据库稳定且一致时,才关闭老数据库。只保留新数据库,老数据库下线

11. UNSIGNED 属性有什么用?

  • 增加正数范围,0~255
  • 节省存储空间:高效利用空间
  • 数据完整性:确保非负值
  • 性能优化:提高计算效率

12. MySQL 中 int(11) 的 11 表示什么?

括号里的数表示对齐后的长度,如果数据不足11位,会在前面补0,补到11位

13. CHAR 与 VARCHAR 有何区别?

  • char是固定长度的字符串类型,最长支持255字节,超过的长度字符串会被截断,适合存储具有固定长度且不超过最长255字节的数据,比如国家代码,邮编。
  • varchar是可变长度的字符串类型,最长65535字节,与行大小有关。会根据你存储的字符长度动态增加或减少,不会占用固定空间。

14. VARCHAR(100) 与 VARCHAR(10) 的区别?

两者的区别在于可以存储最大的字符是不同的

  • varchar(100)最多可以存储100个字符,
  • 而varchar(10)最多只能存储10个字符。
  • 他们都可以根据要存储的字符串分配存储空间

15. DECIMAL 与 FLOAT/DOUBLE 的区别?

  • DECIMAL是用于存储精确小数的定点数类型,适合财务计算,
  • 而FLOAT和DOUBLE是用于存储近似小数的浮点数类型,适合科学计算,FLOAT和DOUBLE在存储时可能会有精度损失。

16. DATETIME 与 TIMESTAMP 的区别?

  • datetime 不受时区影响,绝对时间 占8个字符 需要手动更新
  • timestamp 受时区影响 相对时间,占4个字节 自动更新

17. NULL 与 ‘’ 有什么区别?

  • NULL代表未知的是空的,没有数据,不占用空间 ,NULL需要特殊判断,
  • 而‘ ’代表空字符串,有内容,但是为空,占用空间 ,‘ ’可以直接比较

18. Boolean 类型在 MySQL 中如何表示?

在 MySQL 中,Boolean 类型通常用TINYINT(1)表示,其中0代表false,1代表true。

19. 为什么不推荐使用 TEXT 和 BLOB?

因为它们会导致性能下降、索引和查询效率低、且占用较多存储空间,影响数据量的整体性能。

  • 访问性能低:TEXT/BLOB 数据通常存放在表外,需要额外 I/O 读取。
  • 索引限制多:不能直接建立普通索引,只能做前缀索引,影响查询效率。
  • 存储占用大:大对象会增加表大小和碎片,备份和迁移成本高。
  • 开发维护复杂:ORM 映射、数据库迁移和备份等操作都更麻烦。

20. 在 MySQL 中存储金额应使用什么数据类型?

在 MySQL 中存储金额应使用DECIMAL数据类型,因为它能够精确存储小数(定点小数),避免浮点数类型可能导致的精度损失。

21. MySQL 如何存储 IP 地址?

  • 1.varchar:直观但占空间,可以存储ipv4和ipv6
  • 2.int:高效但仅支持IPv4.
  • 3.varbinnary:支持IPv6,节省空间但需转换

22. 什么是数据库视图?

数据库视图是基于一个表或者多个表的查询结果创建的虚拟表,不存储数据,但是可以简化复杂的查询逻辑,以及提高安全性和提供数据抽象

23. 什么是数据库游标?

  • 数据库游标是一个数据库对象,用于逐行查询结果集,用于查询,搜索,新增,删除逐行数据,适合于逐行操作。
  • 游标是一个指针,指向结果集中的某一行,适合于复杂操作,但是操作比较慢性能较差,需要谨慎使用。
  • 游标支持多种类型比如只进游标,可滚动游标

24. 为什么不建议直接存储大对象(图片 / 音频 / 视频)?

  • 主流数据库大多采用 行存储结构 页大小默认为16kb 大对象一般为MB级别 远超存储限制 造成行溢出
  • 数据库索引(如 B + 树)主要针对结构化数据(如数字、字符串)设计,对二进制大对象无法建立有效索引,导致:
  • 无法通过内容快速检索(如按图片颜色、视频关键词查询),需全表扫描。
  • 即使使用 UUID 等标识索引,也无法避免大对象本身的 IO 开销。
  • 大对象的读取 / 写入属于随机 IO(需频繁跳转不同数据页或溢出页),而数据库的优势在于顺序 IO(如批量查询结构化数据)。
  • 大对象传输占用大量带宽和数据库连接资源

25. 数据库的三大范式是什么?

  • 第一范式:数据库中的每一列都是不可分割的原子项;
  • 第二范式:在第一范式的基础上,非主键的字段必须依赖于主键字段
  • 第三范式:在第二范式的基础上,非主键的字段不能依赖于非主键字段。