目录
1.DDL(Data Definition Language:数据定义语言,操作表--create、alter、drop)
2.DML(Data Manipulation Language:数据操纵语言-select、insert、update、delete)
一、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.可扩展性:添加新节点实现动态扩容
缺点:不易管理和维护,节点之间的通信和数据同步增加了管理和维护复杂度