Java面试题 -数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 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索引,可以显著提⾼查找效率,对于客户端是透明的,不可控制的,隐式的。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
6月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
341 1
|
5月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
460 0
|
5月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
235 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
3月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
6月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
172 5
|
6月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
286 1
|
5月前
|
缓存 Java 关系型数据库
Java 面试经验总结与最新 BAT 面试资料整理含核心考点的 Java 面试经验及最新 BAT 面试资料
本文汇总了Java面试经验与BAT等大厂常见面试考点,涵盖心态准备、简历优化、面试技巧及Java基础、多线程、JVM、数据库、框架等核心技术点,并附实际代码示例,助力高效备战Java面试。
178 0
|
5月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
253 0