数据库面试题(基础常考!!!)

在数据库领域,无论是日常开发还是面试场景,都有一些高频且重要的问题需要我们深入理解和掌握。本文将对这些常见面试题进行详细阐述,帮助大家更好地应对面试和实际工作中的挑战。

面试题一:三范式详解

什么是三范式

三范式是关系型数据库中用于规范数据结构的重要准则,包含第一范式、第二范式和第三范式。

假设存在一个学生成绩表,字段有:学号、姓名、课程名称、成绩、课程学分。数据如下:

学号姓名课程名称成绩课程学分
001张三数学904
001张三英语853
002李四数学884
002李四英语823
  1. 第一范式(1NF):要求每一列都是不可再分割的最小单元。在此例中,所有字段(学号、姓名、课程名称、成绩、课程学分)都已达到最小数据单元,不可分割,符合第一范式。
  2. 第二范式(2NF):在满足第一范式的基础上,非主属性必须完全依赖于主属性。若将(学号,课程名称)设为主键,其他字段(姓名、成绩、课程学分)都完全依赖于这个主键,满足第二范式。
  3. 第三范式(3NF):在满足第二范式的基础上,非主键字段不能依赖于其他非主键字段。此例中,姓名依赖于学号,成绩和课程学分依赖于(学号,课程名称),不存在非主键字段相互依赖,满足第三范式。

简单概括,第一范式是确保列的原子性;第二范式是在原子性基础上,保证非主键对主键的完全依赖;第三范式是在前两者基础上,杜绝非主键之间的相互依赖。

为什么要遵循三范式

遵循三范式主要有两个目的:一是减少数据冗余,避免数据的重复存储,节省存储空间;二是方便数据的维护和更新,确保数据的一致性,避免在数据修改时出现异常情况。

实际开发中是否一定要严格遵循三范式

实际开发中,并不一定严格遵循三范式。虽然三范式能保证数据的规范性,但在实际工作中,性能也是重要考量因素。例如,某些场景下严格遵循三范式可能需要多表联查,而多表联查在数据量较大时效率较低。为了提升查询性能,有时会引入冗余字段,将数据存储在更少的表中,这是典型的空间换时间策略。

面试题二:关系型数据库与非关系数据库的区别及应用场景

关系型数据库

关系型数据库基于关系模型,以表格结构组织和存储数据,数据按行和列存储,可通过主键和外键建立表间关系。

其特点包括:

  • 统一的数据结构:以表格形式存储,每列有特定数据类型,提供规范、结构化的数据存储方式。
  • 强一致性:遵循 ACID 原则(原子性、一致性、隔离性、持久性),保障数据一致性和事务完整性。
  • 数据完整性:支持通过主键和外键定义表间关联关系,进行数据完整性约束。
  • 丰富的查询功能:借助 SQL 查询语言,可进行复杂的关系查询、连接操作、多表查询、条件查询和聚合查询等。代表数据库有 MySQL、Oracle 等。

非关系型数据库

非关系型数据库(NoSQL)不同于传统关系型数据库,不依赖表格和关系模型,采用键值对、文档、图等多种数据模型存储和管理数据,放宽了对数据一致性的要求。

其特点如下:

  • 灵活的数据模型:可根据应用需求选择和定制合适的数据模型,如键值对形式。
  • 高可扩展:天生支持分布式计算和存储,便于横向扩展,应对大规模数据和高并发访问。
  • 高性能和高可用:由于放宽一致性要求,可进行异步读写和读写分离等优化,提升性能和可用性。代表数据库有 Redis、MongoDB、Neo4j 等。

两者区别        

  • 数据模型不同:关系型数据库基于关系模型,以表格存储数据,表间通过外键关联;非关系型数据库不采用表格和关系模型,数据存储形式多样。
  • 数据结构不同:关系型数据库数据结构严格,需预先定义结构和字段类型,数据修改遵循规范和约束;非关系型数据库数据结构灵活,无需预先定义严格模式,可随时添加或修改数据结构。
  • 查询语言不同:关系型数据库常用 SQL 查询,支持复杂查询条件、连接操作和聚合函数;非关系型数据库查询语言因类型而异,部分支持类似 SQL 语法,部分使用特定 API 或 DSL。
  • 事务支持不同:关系型数据库通常支持 ACID 事务特征,保证数据一致性和完整性;非关系型数据库事务支持程度不同,多数只提供部分 ACID 特性或采用不同一致性模型。
  • 扩展性与性能不同:传统关系型数据库水平扩展存在挑战,常通过垂直扩展提升性能;非关系型数据库设计更易于水平扩展,通过增加服务器分散数据和负载。

应用场景

  • 关系型数据库:适用于对数据一致性要求高、查询复杂的场景,如金融交易系统、企业级应用、内容管理系统等。
  • 非关系型数据库:适用于海量数据存储、日志系统、大数据分析、实时处理、Web 应用和移动应用等领域,处理半结构化和非结构化数据时优势明显。

面试题三:MySQL 常用引擎

存储引擎决定了数据的存储方式、索引建立方式以及数据更新和查询的技术实现。在 MySQL 中,常用的存储引擎有以下几种:

  • InnoDB:MySQL 5.5 + 版本的默认存储引擎,支持事务处理、行级锁定和物理外键约束。特点是能提供良好的数据一致性、崩溃恢复能力和高并发性能,适用于需要事务支持和多用户读写操作的应用场景。
  • MyISAM:MySQL 早期的默认存储引擎,不支持事务和行级锁定。它的优势是读取速度快,数据存储文件较小,适用于只读或读多写少、不需要事务的场景。
  • MEMORY:将表数据存储在内存中,提供极快的访问速度,但数据在服务器重启后会丢失。常用于临时表、缓存表或需要快速查询的小型表。

面试题四:InnoDB 和 MyISAM 的区别

  • 事务支持不同:InnoDB 支持事务,能保证数据的一致性和完整性;MyISAM 不支持事务。
  • 锁粒度不同:InnoDB 最小锁粒度为行级锁,在并发操作时,仅锁定操作的行,对其他行的影响小,可提高并发性能,但锁管理开销较大;MyISAM 最小锁粒度是表级锁,操作时锁定整个表,其他读写操作需等待锁释放,并发性能较低,但锁管理开销小。
  • 外键支持不同:InnoDB 支持物理外键,可建立表间的关联约束;MyISAM 不支持物理外键。
  • 索引存储方式不同:InnoDB 索引叶子节点存储的是当前行的数据;MyISAM 索引的叶子节点存储的是地址,需根据地址获取当前行数据。

面试题五:阿里巴巴《Java 开发手册》不建议使用物理外键的原因

使用物理外键会带来以下问题:

  • 性能问题:插入数据前需先到主键表中查询,增加了数据库的 I/O 操作和查询时间,导致性能下降。
  • 数据库更新风暴问题:在高并发场景下,可能引发数据库更新风暴,大量并发的数据库更新操作集中发生,使数据库服务器承受巨大压力,导致性能瓶颈、延迟增大甚至系统崩溃。

面试题六:物理删除和逻辑删除的区别及日常开发选择

  • 物理删除:直接从数据库中永久删除数据记录,释放相关存储空间,被删除数据无法恢复,原有的唯一标识也不再存在。
  • 逻辑删除:在程序中实现删除功能,通常通过添加标记字段或状态字段,将数据标记为已删除状态,数据实际仍存于数据库中,可通过修改查询语句筛选出删除或未删除状态的数据。

在日常开发中,选择哪种删除方式取决于具体需求和业务场景。对于重要数据,在数据库空间和性能允许的情况下,多采用逻辑删除,这样既能保留历史数据,又方便后续数据恢复,保证数据完整性;对于不重要的数据,如具有时效性的日志数据,且数据库对性能和空间有要求时,会使用物理删除以节省系统空间,提高查询性能。

面试题七:内连接、外连接和自连接

  • 内连接:是最常用的连接类型,根据两个或多个表之间的共同列值连接表,只有当连接表之间存在匹配值时才返回结果。例如:
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;
  • 外连接:可返回连接表之间所有匹配和不匹配的数据。外连接分为左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。例如:
SELECT 列名 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.列 = 表2.列;

内连接返回的是两个表都存在的数据;左(右)外连接是左(右)表的所有数据和右(左)表匹配的数据;全外连接返回两个表的所有数据,包括匹配和不匹配的数据。

这里我借用一下我觉得比较直观的图片,它们的区别是:内连接返回的是两个表都存在的数据,如图:

 左(右)外连接是左(右)表的所有数据和右(左)表匹配的数据,如图:

全外查询到的数据,如图:

  • 自连接:是一种特殊的表连接,连接的表在物理上为同一张表,但逻辑上视为多张表,常用于处理表中具有层次结构的数据。假设存在一个员工表:
员工 ID姓名经理 ID
1张三3
2李四3
3王五NULL
4赵六1

    通过自连接可查询每个员工的经理姓名:

    SELECT e1.姓名 AS 员工姓名, e2.姓名 AS 经理姓名
    FROM 员工表 AS e1
    JOIN 员工表 AS e2 ON e1.经理ID = e2.员工ID;
    

    结果如下:

    员工姓名经理姓名
    张三王五
    李四王五
    赵六张三

    面试题八:创建索引时是否锁表

    在 MySQL 5.7 之前,创建索引会锁表。因为创建索引过程中,需保证表数据不被修改,以确保索引的正确性和一致性,这会导致其他会话(除 select 外)阻塞。

    而在 MySQL 5.7 之后,引入了 Online DDL 技术,允许创建索引时不阻塞其他会话,所有 DML(INSERT、UPDATE、DELETE、SELECT)操作可并发执行。该技术使数据库在运行期间能执行表结构或其他数据库对象的更改操作,无需中断正在进行的事务和查询。

    面试题九:聚簇索引和非聚簇索引的区别

    • 聚簇索引:数据按照索引列的值顺序存储在同一页上,索引和数据存储在一起,找到索引就能找到数据。在 MySQL 的 InnoDB 引擎中,聚簇索引默认是主键。
    • 非聚簇索引:将索引和数据行分开存储,索引结构的叶子节点指向数据对应的位置,叶子节点存储的是主键 ID。使用非聚簇索引查询时,先得到主键 ID,再通过主键 ID 到聚簇索引上查找真正的行数据,这个过程称为回表查询。

    两者主要区别如下:

    • 聚簇索引叶子节点存储行数据,非聚簇索引叶子节点存储聚簇索引(通常是主键 ID)。
    • 聚簇索引查询效率更高,非聚簇索引需回表查询,性能相对较低。
    • 聚簇索引一般为主键索引,一个表中只能有一个;非聚簇索引一个表中可以有多个。

    面试题十:聚簇索引与主键索引的关系及生成规则

    聚簇索引在大多数有主键的情况下等于主键索引。若表中没有主键索引,聚簇索引的生成规则如下:

    • 无主键索引,则使用非空唯一索引:若表中无主键索引,InnoDB 会使用第一个满足唯一约束且设置了非空约束的索引作为聚簇索引。
    • 无任何满足的索引,则生成隐藏聚簇索引:若表中既无主键索引,也无符合条件的唯一索引,InnoDB 会生成一个名为 GEN_CLUST_INDEX 的隐藏聚簇索引,该索引为六字节长整型类型。

    通过对这些面试题的深入理解,我们不仅能在面试中脱颖而出,更能在实际数据库开发和管理工作中做出更合理的决策,提升系统性能和稳定性。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/976034.html

    如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

    相关文章

    Linux网络 网络层

    IP 协议 协议头格式 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 4 字节,4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…

    uniapp 微信小程序打包之后vendor.js 主包体积太大,解决办法,“subPackages“:true设置不生效

    现在是打包的时候,vendor.js 的内容全部打到了主包里面, 说一下我的方法: 1. 通过发行 小程序打包 这样打包的体积是最小的,打包之后打开微信开发工具,然后再上传 2.manifest.json,在“mp-weixin”里添加代码 "…

    python-leetcode-N 皇后

    51. N 皇后 - 力扣(LeetCode) class Solution:def solveNQueens(self, n: int) -> List[List[str]]:res []board [[.] * n for _ in range(n)]def is_safe(row, col):for i in range(row):if board[i][col] Q:return Falseif col - (row - i) >…

    【蓝桥杯单片机】客观题

    一、第十三届省赛(一) 二、第十三届省赛(二)

    如何进行ERP系统的定制开发?

    在当今数字化时代,企业资源规划(ERP)系统已然成为企业提升管理效能、优化资源配置以及实现精细化管理的关键工具。然而,鉴于不同企业在行业特性、业务流程以及管理需求等方面存在显著差异,通用型的ERP系统往往难以契合…

    基于SpringBoot的校园消费点评管理系统

    作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

    MySQL数据库——常见慢查询优化方式

    大家好,这里是编程Cookbook。本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 文章目录 什么是慢查询日志?慢查询日志的相关参数如何启用慢查询日志?方式一:修改配置文件方式二:通过命令动态启…

    【前端基础篇】Day 1

    总结: 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

    【复习】Redis

    数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…

    我与Linux的爱恋:了解信号量+共享内存+消息队列的应用

    ​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 信号量共享内存应用---Server&Client通信client.ccserver.ccnamepipe.hppShm.hpp 消息队列——实现Client&ServerCom.hppClient.ccServer.cc 信号量 信号量…

    跟着李沐老师学习深度学习(十六)

    继续学习深度学习&#xff08;十六&#xff09; 继续理解transformer 对于transformer的理解感觉还是云里雾里的&#xff0c;今天又找了一些视频进行一个梳理。 一个浅解 在B站学习发现评论区真的很不错&#xff0c;在沐神讲transformer论文的评论下&#xff0c;有一个评论…

    DeepSeek-R1本地部署保姆级教程

    一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…

    hbase集群部署

    1.hbase集群的搭建&#xff08;以及内部逻辑&#xff09; 虽然Hmaster有多个&#xff0c;但是属于热备&#xff0c;起作用的就active上的这个。 部署流程&#xff1a; 因为我配置的hadoop是一个非HA的&#xff0c;所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…

    2.1 链路层发现协议(LLDP)

    LLDP&#xff08;Link Layer Discovery Protocol&#xff0c;链路层发现协议&#xff09;是一种用于网络设备的链路层协议&#xff0c;用于在局域网&#xff08;LAN&#xff09;中自动发现和通告设备的信息。LLDP是一个开放标准协议&#xff0c;定义在IEEE 802.1AB中&#xff0…

    3dtiles平移旋转工具制作

    3dtiles平移旋转缩放原理及可视化工具实现 背景 平时工作中&#xff0c;通过cesium平台来搭建一个演示场景是很常见的事情。一般来说&#xff0c;演示场景不需要多完善的功能&#xff0c;但是需要一批三维模型搭建&#xff0c;如厂房、电力设备、园区等。在实际搭建过程中&…

    LeetCode 2506 统计相似字符串对的数目

    一、问题描述 我们面对的问题是处理一个下标从 0 开始的字符串数组 words。题目中定义了一种字符串相似的规则&#xff1a;如果两个字符串由相同的字符组成&#xff0c;那么就认为这两个字符串是相似的。例如&#xff0c;"abca" 和 "cba" 是相似的&#xf…

    【Deepseek高级使用教程】Deepseek-R1的5种高级进阶玩法,5分钟教会你Deepseek+行业的形式进行工作重构的保姆级教程

    AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 最近&#xff0c;有各行各业的小伙伴问我&#xff0c;到底应该怎么将deepseek融入进他们自身的工作流呢&#xff1f;其实这个问题很简单。我就以…

    【LeetCode刷题之路】leetcode155.最小栈

    LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

    Linux版本控制器Git【Ubuntu系统】

    文章目录 **前言**一、版本控制器二、Git 简史三、安装 Git四、 在 Gitee/Github 创建项目五、三板斧1、git add 命令2、git commit 命令3、git push 命令 六、其他1、git pull 命令2、git log 命令3、git reflog 命令4、git stash 命令 七、.ignore 文件1、为什么使用 .gitign…

    2025年信息科学与工程学院科协机器学习介绍——机器学习基本模型介绍

    机器学习 目录 机器学习一.安装基本环境conda/miniconda环境 二.数据操作数据预处理一维数组二维数组以及多维数组的认识访问元素的方法torch中tenson的应用张量的运算张量的广播 三.线性代数相关知识四.线性回归SoftMax回归问题&#xff08;分类问题&#xff09;什么是分类问题…