Java 数据库面试题解析(中)

10. 事务并发引发的问题?【重点】

脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。

不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,先后两次读到的数据结果会不一致。

幻读:事务A对一个表中所有的行的某个数据项做了从"1"修改为"2"的操作,这时事务B又对这个表中插入了一行数据项,而这个数据项的数值还是为"1"并且提交给数据库。而操作事务A的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务B中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务,所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

11. MyISAM与InnoDB两种存储引擎在事务、锁级别各自的适用场景?【了解】

事务处理上方面:

MyISAM:强调的是性能,其执行数度比InnoDB更快,但是不提供事务支持。

InnoDB:提供事务支持,外键等高级数据库功能。具有事务提交、回滚和崩溃修复能力的事务安全型引擎。

锁级别:

MyISAM:只支持表级锁,用户在操作表时select、update、delete、insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是InnoDB的最大特色。行锁大幅度提高了多用户并发操作的性能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

12. 非关系型数据库和关系型数据库区别,优势比较?【重点】

非关系型数据库的优势:

性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,是内存型数据库,所以性能非常高。

可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

复杂查询:可以用SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。

事务支持:使得对于安全性能很高的数据访问要求得以实现。

13. 什么是内连接、外连接、交叉连结、笛卡尔积等?【重点】

内连接: 只连接匹配的行;

左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行;

右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行;

全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行;

交叉连接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配。

14. SQL 语言分类【重点】

数据操纵语言DML;

数据定义语言DDL;

数据控制语言DCL。

15. count(*)、count(1)、count(column)的区别?【了解】

COUNT(*)对行的数目进行计算,包含NULL。

COUNT (COLUMN)对特定的列的值具有的行数进行计算,不包含NULL 值。

COUNT ()还有一种使用方式,COUNT (1)这个用法和COUNT (*)的结果是一样的。

16. 什么是索引?【重点】

一种用于提升查询效率的数据库对象;

通过快速定位数据的方法,减少磁盘I/0操作;

索引信息与表独立存放。

17. 索引的作用?【重点】

协助快速查询、更新数据库表中数据。

为表设置索引要付出代价的:

一是增加了数据库的存储空间;

二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

18. 索引的优缺点?【重点】

创建索引可以大大提高系统的性能(优点):

通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

增加索引也有许多不利的方面(缺点):

创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

19. 什么样的字段适合建索引?【重点】

唯一、不为空、经常被查询的字段。

相关推荐
Tapdata13 分钟前
《实时分析市场报告 2025》上线 | 从批处理到实时洞察,2025 年全球实时分析市场全景解读
数据库
Miraitowa_cheems18 分钟前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
海梨花24 分钟前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
共享家952724 分钟前
linux-高级IO(上)
java·linux·服务器
橘子郡12331 分钟前
观察者模式和发布订阅模式对比,Java示例
java
指针满天飞32 分钟前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
Java技术小馆33 分钟前
重构 Controller 的 7 个黄金法则
java·后端·面试
金銀銅鐵1 小时前
[Java] 以 IntStream 为例,浅析 Stream 的实现
java·后端
代码的余温2 小时前
SQL性能优化全攻略
数据库·mysql·性能优化
曳渔2 小时前
UDP/TCP套接字编程简单实战指南
java·开发语言·网络·网络协议·tcp/ip·udp