Java数据库10个经典的面试题及答案整理

Java面试 潘老师 7个月前 (02-14) 512 ℃ (0) 扫码查看

对于出去找工作的java工程师,Java数据库面试题基本是必备的,因为面试官基本肯定会问到数据库相关知识,因此潘老师整理了Java数据库10个经典的面试题和答案,题目数量虽少,但都很实用,都是高频面试题型,掌握了定能助你面试一臂之力。
Java数据库10个经典面试题
Java数据库面试题的题型一般涉及数据库基础知识,数据库优化,数据库底层原理以及结合Java项目的应用实践等,针对这几个方面潘老师列出了一些面试官必问的10个经典题目。

第1题:说一下MySQL事务的四大特性(ACID)以及实现原理

答案整理:
1)1)四大特性:
  • 原子性(Atomicity):一个事务被作为一个整体执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。不会结束在中间某个环节。事务在执行过程中如果发生异常,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性(Consistency):指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转100块钱,不管成功与否,A和B的总金额是不变的。
  • 隔离性(Isolation):多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
  • 持久性(Durability):表示事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中,即便系统故障也不会丢失。

2)实现原理:
  • 原子性:是使用 undo log来实现的,如果事务执行过程中出错或者用户执行了rollback,系统通过undo log日志返回事务开始的状态。
  • 持久性:使用 redo log来实现,只要redo log日志持久化了,当系统崩溃,即可通过redo log把数据恢复。
  • 隔离性:通过锁以及MVCC,使事务相互隔离开。
  • 一致性:通过回滚、恢复,以及并发情况下的隔离性,从而实现一致性。

第2题:说一下什么是幻读,脏读,不可重复读?

什么是幻读,脏读,不可重复读呢?

答案整理:
1)脏读 :脏读就是指当一个事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务B也访问这个数据,然后使用了这个数据。

2)不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

3)幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没修改的数据行,就好象发生了幻觉一样。

第3题:说一下什么是内连接、外连接、交叉连接、笛卡尔积呢?

答案整理:

1)内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
2)外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足匹配关系的记录。
3)交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。比如A表有10条记录,B表有100条记录,那么笛卡尔积关联查询结果就是10*100=1000条记录,一般我们要避免笛卡尔积的出现。

第4题:说一下数据库表设计的三大范式原则?

答案整理:

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。在实际开发中最为常见的设计范式有三个:
第一范式:确保每列保持原子性——用来确保每列的原子性,要求每列(或者每个属性值)都是不可再分的最小数据单元(也称为最小的原子单元)。
第二范式:确保表中的每列都和主键相关——在第一范式的基础上更进一层,要求表中的每列都和主键相关,即要求实体的唯一性。如果一个表满足第一范式,并且除了主键以外的其他列全部都依赖于该主键,那么该表满足第二范式。
第三范式:确保每列都和主键列直接相关,而不是间接相关——在第二范式的基础上更进一层,第三范式是确保每列都和主键列直接相关,而不是间接相关,即限制列的冗余性。如果一个关系满足第二范式,并且除了主键以外的其他列都依赖于主键列,列和列之间不存在相互依赖关系,则满足第三范式。

第5题:MySQL索引使用有哪些注意事项呢?

可以从以下三个方面回答这个问题:
1)哪些情况会导致索引失效

答案整理:
  • like通配符可能导致索引失效。
  • 查询条件包含or,可能导致索引失效
  • 如何字段类型是字符串,where时一定用引号括起来,否则索引失效
  • 对索引列运算(如,+、-、*、/),索引失效。
  • 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
  • 在索引列上使用mysql的内置函数,索引失效。
  • 索引字段上使用is null, is not null,可能导致索引失效。
  • 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
  • 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
  • mysql估计使用全表扫描要比使用索引快,则不使用索引。

一般重点背上几个就可以了。
2)索引不适合哪些场景
  • 数据量少的不适合加索引
  • 更新比较频繁的也不适合加索引
  • 区分度低的字段不适合加索引(如性别)

3)索引规则
  • 覆盖索引
  • 回表
  • 索引数据结构(B+树)
  • 最左前缀原则
  • 索引下推

第6题:在日常工作中你是如何优化SQL的?

答案整理:
可以从这几个维度回答这个问题:
  • 加索引
  • 避免返回不必要的数据
  • 适当分批量进行
  • 优化sql结构
  • 分库分表
  • 读写分离

具体的可以查看SQL优化查询速度常用的几种方法

第7题:数据库的分库与分表有哪几种常用方案?

答案整理:
分库分表方案:
  • 水平分库:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。
  • 水平分表:以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。
  • 垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。
  • 垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。

第8题:数据库索引结构为什么要用B+树,为什么不用二叉树?

这主要考察数据库索引的底层设计原理,需要掌握一定的算法知识,尤其对各种树的结构、优缺点要有所了解:

答案整理:
为什么不是一般二叉树?
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。
为什么不是平衡二叉树呢?

我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。

那为什么不是B树而是B+树呢?
1)B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。

2)B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。

第9题:从锁的类别角度讲,MySQL都有哪些锁呢?

答案整理:
分为如下两类:
共享锁: 又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁: 又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。

第10题:在项目中,某个SQL查询速度过慢,成为性能瓶颈,该如何去分析优化?

答案整理:
SQL查询速度过慢有很多方面的原因,但重点我们还是要使用explain查看SQL执行计划,尤其针对全表扫描涉及的SQL进行优化,更多具体的可以参考Oracle数据库SQL执行计划怎么查看?如何分析?

总结

以上就是Java数据库的10个经典面试题和答案的整理汇总,希望同学们能尽量掌握,面试无忧!


版权声明:本站所有文章,如无特殊说明,均为本站原创。转载请务必注明文章来源,谢谢支持。
本文链接:https://www.panziye.com/javainterview/4365.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】