数据库中常见面试题整理

本文深入探讨数据库三范式,分享数据库优化经验,解析常用索引类型及索引工作机制,对比悲观锁与乐观锁,并提供MySQL基础操作命令,助力数据库性能提升。

一、 数据库三范式是什么?

  1. 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
  2. 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
  3. 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一个值 >>2. 每一行都能区分。 >>3. 每一个表都不包含其他表已经包含的非主关键字信息。

二、 有哪些数据库优化方面的经验?

  1. 用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql
    发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。
  2. 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。
  3. 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
  4. UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用 UNION
    ALL。 >>UNION 和 UNION ALL 关键字都是将两个结果集合并为一
    个,但这两者从使用和效率上来说都有所不同。 >1. 对重复结果的处
    理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除重复记录。 >2. 对排序的处理:Union 将会按照字段的顺序进行排
    序;UNION ALL 只是简单的将两个结果合并后就返回。

三、 请简述数据库中常用的索引有哪些种类?

  1. 普通索引: 即针对数据库表创建索引
  2. 唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值必须唯一,但允许有空值
  3. 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
  4. 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。

四、 mysql 数据库中索引的工作机制是什么?

       数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

五、 mysql 的基础操作命令:

  1. MySQL 是否处于运行状态:Debian 上运行命令 service mysql
    status,在 RedHat 上运行命令 service mysqld status
  2. 开启或停止 MySQL 服务 :运行命令 service mysqld start 开启服
    务;运行命令 service mysqld stop 停止服务
  3. Shell 登入 MySQL: 运行命令 mysql -u root -p
  4. 列出所有数据库:运行命令 show databases;
  5. 切换到某个数据库并在上面工作:运行命令 use databasename; 进入
    名为 databasename 的数据库
  6. 列出某个数据库内所有表: show tables;
  7. 获取表内所有 Field 对象的名称和类型 :describe table_name;

六、何谓悲观锁与乐观锁?

       乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。

  1. 悲观锁

           总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁( 共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java 中 synchronized 和ReentrantLock 等独占锁就是悲观锁思想的实现。

  2. 乐观锁

           总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CAS 算法实现。 乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于 write_condition 机制,其实都是提供的乐观锁。在 Java 中 java.util.concurrent.atomic 包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。

  3. 两种锁的使用场景

           从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像 乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行 retry,这样反倒是降低了性能,所以 一般多写的场景下用悲观锁就比较合适。

<think>首先,用户想查找数据库常见面试题。我之前的回答是关于快速排序的,但用户现在切换到了数据库面试题。所以,我需要参考用户提供的引用内容来回答问题。 用户提供了四个引用: - 引用[1]:数据库常见面试题。提到数据库优化,包括加索引、表结构优化、SQL优化等。 - 引用[2]:软件测试|数据库常见面试题。讨论索引的定义和表的连接查询方式。 - 引用[3]:数据库常见面试题(开发者必看)。解释数据库范式(第一范式、第二范式、第三范式)。 - 引用[4]:数据库常见面试题都给你准备好了。这是一个推广性的引用,鼓励用户加入群聊获取更多资料。 用户的查询是:“我想查找数据库常见面试题 请问数据库常见面试题”。所以,我需要列出数据库常见面试题。 系统指令要求: - 使用中文回答。 - 结构清晰,逐步解决问题。 - 确保回答真实可靠。 - 在行内数学表达式中使用$...$格式(但数据库面试题可能涉及数学表达式,除非有计算)。 - 独立公式用$$...$$格式并单独成段(同样,可能适用)。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识,如[^1]。 此外,指令说“回答中引用的段落末尾自然地添加引用标识”,所以我需要从提供的引用中提取内容并添加引用标识。 关键点:用户说“上述引用仅供参考,并是用户真正的需求”,但我应该参考这些引用来构建回答,因为它们提供了具体内容。 常见数据库面试题通常包括: - SQL查询 - 索引 -范式 -事务和并发控制 - 数据库优化 - 各种数据库类型(如SQL vs NoSQL) 从引用中提取: - 引用[1]:索引无效时加缓存、表结构优化(数据类型、范式)、SQL优化(用*、减少连接、in代替or、避免!=或null判断、避免函数、避免模糊查询)。 - 引用[2]:索引定义、连接查询方式(如内连接、外连接等)。 - 引用[3]:范式(1NF, 2NF, 3NF)。 - 引用[4]:推广性内容,太有用。 所以,我可以组织回答如下: 1. **索引相关**:基于引用[1]和[2]。 2. **范式相关**:基于引用[3]。 3. **SQL优化**:基于引用[1]。 4. **连接查询**:基于引用[2]。 我应该结构化回答,列出常见面试题类别和示例问题。 最后,生成相关问题。 回答结构: - 开头:简要介绍数据库面试题。 - 主体:列出主要类别和具体问题或解释。每个点基于引用添加标识。 - 结尾:生成相关问题。 确保中文回答。 可能的类别: 1. 数据库基础概念:如什么是数据库、DBMS等(但引用没提到,所以可能跳过)。 2. SQL查询:写SQL语句(引用没直接说,但隐含在优化中)。 3. 索引:定义、优点、缺点。 4. 范式:1NF,2NF,3NF。 5. 优化技巧。 6. 事务:ACID属性(引用没提到,但常见)。 7. 连接类型:内连接、左连接等。 引用中提到索引、范式、优化、连接查询。我应该覆盖这些。 添加常见面试题,如事务、锁等,但引用没提供,所以我主要基于引用。 系统指令说“尽可能多的参考用户上一次的问题和你的回答”,但上一次是快速排序,相关,所以忽略。 最终回答结构: - 标题:数据库常见面试题 - 列出要点: - 索引相关 - 范式相关 - SQL优化 - 连接查询 - 其他常见(如事务等,但基于引用有限) 在回答中自然地添加引用标识。例如,说到索引时,引用[1]和[2]。 生成相关问题在末尾。 </think>### 数据库常见面试题 以下是数据库常见面试题总结,涵盖了核心概念、优化技巧和实际应用。这些内容基于标准数据库知识和常见面试要点整理而成,我会参考您提供的引用内容进行说明,确保回答真实可靠。主要内容包括索引、范式、SQL优化和连接查询等方面。 #### 1. **索引相关** - **什么是索引?**:索引是一种单独的物理结构,用于对数据库表中一列或多列的值进行排序,提高查询速度。它本质上是一个指向数据页的指针清单,能加速WHERE子句、JOIN操作等[^2]。 - **索引的优缺点**: - 优点:大幅提升查询性能,尤其在大型表中。 - 缺点:索引可能失效的场景包括数据量极大时(这时需加缓存层),以及频繁写操作(索引维护会降低插入/更新速度)[^1]。 - **常见面试题示例**: - 解释索引的类型(如B-tree索引、哈希索引)。 - 如何在特定查询中优化索引? #### 2. **范式相关** - **数据库范式的作用**:范式用于减少数据冗余和确保数据一致性,主要通过规范化表结构实现。 - **第一范式 (1NF)**:要求数据库表中的每个段都是单一属性且可再分(如段应为整型、符型等基础类型)[^3]。 - **第二范式 (2NF)**:在1NF基础上,确保所有非关键段都完全依赖于候选关键(即存在部分函数依赖)。例如,避免组合关键中的部分段决定非关键段[^3]。 - **第三范式 (3NF)**:在2NF基础上,消除传递函数依赖。即能有“关键段 → 非关键段x → 非关键段y”的依赖关系,以防止数据冗余[^3]。 - **常见面试题示例**: - 描述各范式的区别和适用场景。 - 如何识别和修复违反范式的表设计? #### 3. **SQL优化技巧** - **优化原则**:SQL优化的核心是减少查询开销和提高效率,参考引用中的建议: - 避免使用`SELECT *`,而是明确列出所需列以减少数据传输量。 - 减少表的连接次数(如通过子查询或JOIN优化)。 - 用`IN`代替`OR`条件,提升条件判断效率。 - 在WHERE子句中避免使用`!=`、`<>`、`NULL`判断(改用`IS NULL`或索引优化)。 - 避免在`=`操作符前使用表达式或函数(如`WHERE YEAR(date) = 2023`改为`WHERE date >= '2023-01-01'`)。 - 谨慎使用模糊查询:优先使用`xxx%`(前缀匹配可用索引),避免`%xxx%`(可能导致全表扫描)[^1]。 - **常见面试题示例**: - 分析一个低效SQL语句并提供优化方案。 - 如何通过缓存优化大数据量查询? #### 4. **表的连接查询** - **连接类型**:数据库连接查询包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN),区别在于如何处理匹配失败的行: - 内连接只返回匹配的行。 - 左连接返回左表所有行及匹配的右表行(匹配则为NULL)。 - 这类连接会影响查询性能和结果集完整性[^2]。 - **常见面试题示例**: - 比较INNER JOIN和LEFT JOIN的差异及应用场景。 - 如何优化多表连接查询? #### 其他常见面试题类别 - **事务和ACID属性**:事务确保操作的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。常见问题如解释事务隔离级别(Read Committed、Repeatable Read等)。 - **数据库类型**:SQL vs NoSQL的比较(如MySQL vs MongoDB),包括优缺点。 - **性能调优**:结合硬件优化(如分区表、读写分离)和软件优化(如查询缓存)。 以上内容涵盖了数据库面试的核心主题。如需深入学习实践资源(如电子书或模板),可以参考相关社区或文档[^4]。如果您有具体数据库(如MySQL、PostgreSQL)或场景,可以提供更多细节,我可以进一步细化解答。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monika、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值