Java面试题学习(数据库)

1.Java 基础

2.Spring & SpringBoot

3.数据库(正在浏览)

4.网络

目录

一、MySQL

1.DDL(Data Definition Language:数据定义语言,操作表--create、alter、drop)

2.DML(Data Manipulation Language:数据操纵语言-select、insert、update、delete

3.索引的基本原理

4.聚簇索引和非聚簇索引的异同点?

5.B树和B+树有什么区别?为什么MySQL索引结构使用B+树?

6.MySQL有哪些锁?

7.如何优化慢查询sql?

8.MySQL主从复制原理

二、Redis

9.什么是Redis?

10.Redis基本命令

11.Redis 事务

12.Redis缓存穿透、击穿、雪崩分别是什么?

13.Redis 为什么这么快?

14.Redis持久化(默认RDB)

15.Redis 怎么实现高可用?/ Redis 有哪些集群策略?

一、MySQL

1.DDL(Data Definition Language:数据定义语言,操作表--create、alter、drop)

-- 创建表
create table if not exists student (
    id varchar(40) NOT NULL COMMENT '主键',
    name varchar(40) DEFAULT NULL COMMENT '姓名',
    age int DEFAULT NULL COMMENT '年龄',
    class_name varchar(40) DEFAULT NULL COMMENT '班级',
    creator_id varchar(40) NOT NULL COMMENT '创建人',
    create_time datetime NOT NULL COMMENT '创建时间',
    ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    delete_flag int DEFAULT 0 COMMENT '逻辑删除字段 0.正常 1.删除',
    PRIMARY KEY (id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT = 10000 DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

-- 新增表字段
alter table student add sex varchar(16) DEFAULT null comment '性别';

-- 修改表字段
alter table student modify class_name varchar(40) DEFAULT null comment '班级名称';

-- 表字段重命名
alter table student rename column class_name to class;

-- 删除表
drop table student;

2.DML(Data Manipulation Language:数据操纵语言--select、insert、update、delete)

-- select
select * from student;

select 
    s.name '姓名',
    s.age '年龄',
    c.class_name '班级'
from student s
left join class c on c.id=s.classNo
where c.id='1'
order by s.age;

-- insert
insert into student(id,name,age,classNo) values ('5','韶君',20,2),('6','tom',19,2);

-- update
update student set age=21 where name='韶君';

-- delete
delete from student where name='韶君';

3.索引的基本原理

        索引将数据按照某种方式进行排序,从而加快数据查询。

        (1)创建索引列,生成倒排表

        (2)在倒排表内容上拼接数据地址链

        (3)查询时,使用二分查找或其他查询算法查询倒排表,然后根据数据地址链访问目标数据。这样不需全表扫描,加快数据查询。

4.聚簇索引和非聚簇索引的异同点?

聚簇索引

非聚簇索引

相同点

都是基于B+树数据结构

数据存储

数据和索引顺序存储

数据和索引分开存储

索引结构

B+树的叶子节点存储索引和数据

B+树的叶子节点存储索引和指针,不存储数据

查询性能

基于主键查询,查询效率高

需二次查询,查询效率低

(先查询索引,在根据指针查询数据)

更新性能

更新主键可能导致数据重排,影响性能

只需更新索引指针,性能较高

数据一致性

数据物理顺序和逻辑顺序一致,

提高了数据的一致性

索引和数据分离,一致性依赖于事务

5.B树和B+树有什么区别?为什么MySQL索引结构使用B+树?

(1)B树特点:

        1.节点递增排序

        2. 一个节点可以存储多个元素,多个元素之间也递增排序

        3.每个节点既存索引,又存数据

(2)B+树特点:

        1.拥有B树的特点

        2.非叶子节点存储索引和指针,不存储数据。叶子节点既存储索引,又存储数据。

        3.叶子节点之间有指针

(3)B+树叶子节点存储了所有数据并进行了排序,并且叶子节点之间有指针,可以很好的支持全包扫描、范围查找等SQL语句。

6.MySQL有哪些锁?

行锁

锁某行数据,细粒度小,并发度高

表锁

锁某张表,细粒度大,并发度低

间隙锁

锁一个区间,可解决“幻读”

共享锁

也就是读锁,一个事务加了共享锁,

其他事务也可以读,但是不能写

排他锁

也就是写锁,一个事务加了排他锁,

其他事务不能读,也不能写

乐观锁

读数据时或更新前不加锁,等到实际更新时检查数据是否一致。

如果一致,则正常更新数据并递增版本号;如果不一致,则更新失败。

适用于读多写少。

悲观锁

读数据时或更新前加锁,保证事务的一致性和完整性。

行锁、表锁是悲观锁。

适用于写多读少。

7.如何优化慢查询sql?

(1)避免使用 select * :查出所有数据耗时,按需查询列。

(2)用union all代替union:union会去重和排序耗时,union all获取所有数据(包含重复的数据)

(3)小表驱动大表:in 适用于左边大表,右边小表; exists 适用于左边小表,右边大表。

(4)批量操作:不要使用循环插入(请求n次数据库耗时),使用批量插入(请求1次数据库,使用.saveBatch()))

(5)使用join连接查询,而不是子查询:子查询需要创建临时表(耗时)

        left join:求两个表的交集 + 左表剩下的数据。

        inner join:求两个表交集的数据。

(6)使用索引并且使用最优索引

(7)控制索引数量:mysql使用B+树结构保存索引,在insert、update和delete操作时,需要更新B+树索引。如果索引过多,会消耗很多额外的性能。

(8)尽可能缩小数据范围,提升sql整体性能:先用where过滤数据,再group by进行去重分组

(9)优化索引:使用explain命令,查看mysql的执行计划( explain select * from `order` where code='002'; )

(10)分库分表

8.MySQL主从复制原理

        MySQL主从复制中有3个线程:master(binlog dump thread)、slave(I/O thread、SQL thread)

(1)master的binlog是数据库服务器启动后,保存所有修改的数据库结构和内容的文件

(2)当binlog有变动时,master的binlog dump thread 读取binlog内容并发送给slave

(3)slave的I/O thread 接收binlog内容,并将其写入relay log文件中

(4)slave的SQL thread 读取relay log内容对数据进行更新和重放,从而保证主从数据的一致性。

二、Redis

9.什么是Redis?

        Redis 是一个单线程且基于内存的键值型、可持久化NoSQL数据库

        Redis 特性:

                (1)支持多种数据结构(String、List、Set、Zset、Hash)

                (2)单线程

                (3)基于内存、IO多路复用,实现高性能、低延迟

                (4)数据可持久化(RDB、AOF)

                (5)集群

                (6)事务

10.Redis基本命令

set name Dragon     # 按键值对赋值,设置key=name,value=Dragon
get name            # 根据key获取value
keys *              # 查看数据库所有的key
flushdb             # 清空当前数据库
flushall            # 清空全部数据库
exists name         # 判断key=name是否存在
move name 1         # 移除key=name,1表示当前数据库
expire name 10      # 设置key 10s后过期
type name           # 查看key的类型
strlen name         # 获取字符串长度 
append name "666"   # 在name后追加字符串,输出 "Dragon666",如果key不存在,相当于set name "666"

11.Redis 事务

        Redis 事务的本质是一组命令集合。一个事务中的命令会被序列化,按序执行。具有一次性、顺序性、排他性。

        Redis 事务:

                (1)watch(是一个乐观锁,开启key监控,监控一个或多个key,一旦其中有被修改或删除,事务执行失败)

                (2)开启事务(multi)

                (3)命令入队(...)

                (4)执行事务(exec)

                (5)取消事务(discard)

                (6)unwatch(取消key监控)

12.Redis缓存穿透、击穿、雪崩分别是什么?

(1)缓存穿透:大量请求的key不在缓存,大量请求直接请求数据库,给数据库造成很大压力,甚至崩掉。

        解决:1.使用布隆过滤器(一个Hash表,存在设置为1,不存在设置为0,不能解决hash冲突,会覆盖原值)

                   2.缓存设置空对象(key-null)

                   3.校验请求的合法性

(2)缓存击穿:大量请求某个热点key,当该key突然失效,大量请求直接请求数据库,给数据库造成很大压力,甚至崩掉。

        解决:1.加互斥锁

                   2.设置热点key永不过期

(3)缓存雪崩:大量缓存过期,大量请求直接请求数据库,给数据库造成很大压力,甚至崩掉。

        解决:设置缓存过期时间

13.Redis 为什么这么快?

        (1)基于内存存储的数据库,没有读写磁盘(耗时)

        (2)单线程模型,避免CPU不必要的上下文切换和锁的消耗

        (3)I/O多路复用:让单线程高效处理多个网络连接请求

14.Redis持久化(默认RDB)

(1)RDB(Redis Database Backup):在指定时间间隔内将内存的数据快照(.rdb文件)写入磁盘。

        优点: 1.适合大规模数据恢复

                    2.对数据完整性要求不高

                    3.比AOF性能更好

        缺点: 1.需要一定的时间间隔才能完成操作,期间突然断电,数据会丢失

                    2.使用fork进程将内存数据快照写入磁盘,fork进程占用一定的内存和CPU,影响性能

(2)AOF(Append Only File):将所有的命令(除了读命令)保存到.aof文件,恢复时将文件全部执行(耗时)。

        优点:数据一致性和完整性高

        缺点:aof文件远大于rdb文件,占用更多的磁盘空间。AOF修复时,速度比较慢、效率低

15.Redis 怎么实现高可用?/ Redis 有哪些集群策略?

(1)主从模式:主节点负责写,从节点负责读,并定期同步主节点数据。适用于简单的读写分离场景。

        优点:容易实现和维护

        缺点: 1.不易扩展:所有写操作在主节点上,可能导致写性能瓶颈

                    2.主节点单点故障:主节点宕机,无法自动恢复服务

(2)哨兵模式:在主从模式的基础上增加了哨兵节点。哨兵节点负责监控主节点和从节点状态,如果主节点宕机,会自动选举一个从节点为新的主节点。适用于对服务连续性有较高要求的场景。

        优点:主从切换、故障转移、提高了系统的稳定性和容错能力

        缺点:哨兵模式基于主从模式,实现了读写分离,但每个从节点存储的数据都一样,浪费内存且不便在线扩容。

(3)Cluster模式:是一种分布式集群架构,支持多主多从。适用于高并发、大容量数据存储的场景。

        优点: 1.分布式存储,能提高整体的数据容量

                    2.高并发:数据分散存储,提高了系统的并发性

                    3.可扩展性:添加新节点实现动态扩容

        缺点:不易管理和维护,节点之间的通信和数据同步增加了管理和维护复杂度

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值