数据库基础-牛客面经八股
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. 数据库的三大范式是什么?
- 第一范式:数据库中的每一列都是不可分割的原子项;
- 第二范式:在第一范式的基础上,非主键的字段必须依赖于主键字段
- 第三范式:在第二范式的基础上,非主键的字段不能依赖于非主键字段。








