Java面试题 -数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Java面试题 -数据库
1. MySQL InnoDB、MyISAM的特点?

InnoDB:

  1. ⽀持事务处理
  2. ⽀持外键
  3. ⽀持⾏锁
  4. 不⽀持FULLTEXT类型的索引(在Mysql5.6已引⼊)
  5. 不保存表的具体⾏数,扫描表来计算有多少⾏
  6. 对于AUTO_INCREMENT类型的字段,必须包含只有该字段的索引
  7. DELETE 表时,是⼀⾏⼀⾏的删除
  8. InnoDB 把数据和索引存放在表空间⾥⾯
  9. 跨平台可直接拷⻉使⽤
  10. 表格很难被压缩

MyISAM:

  1. 不⽀持事务,回滚将造成不完全回滚,不具有原⼦性
  2. 不⽀持外键
  3. ⽀持全⽂搜索
  4. 保存表的具体⾏数,不带where时,直接返回保存的⾏数
  5. DELETE 表时,先drop表,然后重建表
  6. MyISAM 表被存放在三个⽂件 。frm ⽂件存放表格定义。 数据⽂件是MYD (MYData) 。 索引⽂件是MYI(MYIndex)引伸
  7. 跨平台很难直接拷⻉
  8. AUTO_INCREMENT类型字段可以和其他字段⼀起建⽴联合索引
  9. 表格可以被压缩

选择:因为MyISAM相对简单所以在效率上要优于InnoDB。如果系统读多,写少。对原⼦性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接⽤备份覆盖恢复。如果系统读少,写多的时候,尤其是并发写⼊⾼的时候。InnoDB就是⾸选了。两种类型都有⾃⼰优缺点,选择那个完全要看⾃⼰的实际情况。

2. ⾏锁,表锁;乐观锁,悲观锁?

⾏锁:数据库表中某⼀⾏被锁住。

表锁:整个数据库表被锁住。

乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别⼈不会修改,具体实现是给表增加⼀个版本号的字段,在执⾏update操作时⽐较该版本号是否与当前数据库中版本号⼀致,如⼀致,更新数据,反之拒绝。

悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别⼈会修改。读数据的时候会上锁,直到update完成才释放锁,使⽤悲观锁要注意不要锁住整个表。

3. 数据库隔离级别是什么?有什么作⽤?

ISOLATION_READUNCOMMITTED 这是事务最低的隔离级别,它允许另外⼀个事务可以看到这个事务未提交的数据。这种隔离级别会产⽣脏读,不可重复读和幻读。

ISOLATION_READCOMMITTED 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。

ISOLATION_REPEATABLEREAD 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻读。它除了保证⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免不可重复读。

ISOLATION_SERIALIZABLE 这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏读,不可重复读外,还避免了幻读。

未提交读(Read Uncommitted):允许脏读,也就是可能读到其他会话中未提交事务修改的数据。

提交读(Read Committed):只能读取到已经提交的数据,Oracle等多数数据库默认都是该级别(不重复读)。

可重复读(Repeated Read):可重复读。在同一事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻读。

串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

4. MySQL主备同步的基本原理

mysql主备复制实现分成三个步骤:

  1. master将改变记录到⼆进制⽇志(binary log)中(这些记录叫做⼆进制⽇志事件,binary log events,可以通过show binlog events进⾏查看);
  2. slave将master的binary log events拷⻉到它的中继⽇志(relay log);
  3. slave重做中继⽇志中的事件,将改变反映它⾃⼰的数据。

5. select * from table t where size > 10 group by size order by size的sql语句执⾏顺序?

sql语句执⾏顺序如下:

  • where -> group by -> having -> select -> orderby
6. 如何优化数据库性能(索引、分库分表、批置操作、分⻚算法、升级硬盘SSD、业务优化、主从部署)
  1. 选择合适的数据库引擎,合理使⽤索引
  2. 分⻚获取数据,只获取需要的字段
  3. 优化业务逻辑,减少数据库IO
  4. 分库分表
  5. 部署主从数据库
  6. 升级硬件
7. SQL什么情况下不会使⽤索引(不包含,不等于,函数)
  1. select * 可能导致不⾛索引;
  2. 空值会导致不⾛索引,因为hashset不能存空值;
  3. 索引列有函数运算,不⾛索引,可以在索引列建⽴⼀个函数的索引。
  4. 隐式转换可能导致不⾛索引;
  5. 表的数据库⼩或者需要选择⼤部分数据,不⾛索引;
  6. !=或者<>可能导致不⾛索引;
  7. 字符型的索引列会导致优化器认为需要扫描索引⼤部分数据且聚簇因⼦很⼤,最终导致弃⽤索引扫描⽽改⽤全表扫描⽅式
  8. like ‘%liu’ 百分号在前不⾛索引;
  9. not in, not exist不⾛索引;
8. —般在什么字段上建索引(过滤数据最多的字段)
  1. 表的主键、外键必须有索引;
  2. 数据量超过300的表应该有索引;
  3. 经常与其他表进⾏连接的表,在连接字段上应该建⽴索引;
  4. 经常出现在Where⼦句中的字段,特别是⼤表的字段,应该建⽴索引;
  5. 索引应该建在选择性⾼的字段上;
  6. 索引应该建在⼩字段上,对于⼤的⽂本字段甚⾄超⻓字段,不要建索引;
9. 如何从⼀张表中查出name字段不包含"XYZ"的所有⾏?
select * from table where name not like '%XYZ%';
10. HRedis, RDB和A0Ff如何做⾼可⽤、集群
11. 如何解决⾼并发减库存问题

消息队列,异步处理,减库存加锁

12. mysql存储引擎中索引的实现机制
13. 数据库事务的⼏种粒度

表锁定:对整个表的锁定。

⾏锁定:只锁定进⾏更改的⾏,例如:insert,update,delete,都隐式采⽤⾏锁定。

数据库锁机制可分为多种粒度的: 数据库,表,⻚⾯,⾏粒度越⼤,DBMS管理越容易,但是实现并发处理的能⼒就越差,表,⻚⾯,⾏。

14. mysql调优
  1. explain select语句;
  2. 当只要⼀条数据时使⽤limit 1;
  3. 为搜索字段建索引;
  4. 避免select *;
  5. 字段尽量使⽤not null;
  6. 垂直分割;
  7. 拆分⼤的delete和insert语句:delete和insert会锁表;
  8. 分表分库分区。
15. 说说事务的四种特性(ACID)?

16. innodb如何实现mysql的事务?

事务进⾏过程中,每次sql语句执⾏,都会记录undo log和redo log,然后更新数据形成脏⻚,然后redo log按照时间或者空间等条件进⾏落盘,undo log和脏⻚按照checkpoint进⾏落盘,落盘后相应的redo log就可以删除了。此时,事务还未COMMIT,如果发⽣崩溃,则⾸先检查checkpoint记录,使⽤相应的redo log进⾏数据和undo log的恢复,然后查看undo log的状态发现事务尚未提交,然后就使⽤undo log进⾏事务回滚。事务执⾏COMMIT操作时,会将本事务相关的所有redo log都进⾏落盘,只有所有redo log落盘成功,才算COMMIT成功。然后内存中的数据脏⻚继续按照checkpoint进⾏落盘。如果此时发⽣了崩溃,则只使⽤redo log恢复数据。

17. 让你设计⼀个索引,你会怎么设计?

mysql默认存储引擎innodb只显式⽀持B树索引,对于频繁访问的表,innodb会透明建⽴⾃适应hash索引,即在B树索引基础上建⽴hash索引,可以显著提⾼查找效率,对于客户端是透明的,不可控制的,隐式的。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
NoSQL Java API
在Java环境下如何进行Redis数据库的操作
总的来说,使用Jedis在Java环境下进行Redis数据库的操作,是一种简单而高效的方法。只需要几行代码,就可以实现复杂的数据操作。同时,Jedis的API设计得非常直观,即使是初学者,也可以快速上手。
166 93
|
1月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
56 15
|
1月前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
101 17
|
3月前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
233 60
|
2月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
129 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
2月前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
140 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
2月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
251 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
2月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
174 14
|
2月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
77 13
|
3月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
136 16

热门文章

最新文章