SQL、缓存相关面试题
MySQL默认引擎及特点
MySQL事务隔离级别
Redis五种数据结构
Redis淘汰策略
Mysql的char和varchar区别
-
char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的字节空间L+1(L=0到255)或L+2(L>255),并且实际字节空间L+1<=255,或者L+2<=65535.
-
如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。 如果被裁掉的字符不是空格,则会产生一条警告
-
char存储时会截断尾部空格
-
char: 定长,固定长度,最多2^8−1个字符,2^8−1个字节;例如:身份证号,手机号,电话,密码等
-
varchar: 可变长,最多2^16−1个字符,2^16−1个字节
视图
- 视图本质是一张虚拟表,数据来源于select语句,在内存中,是临时数据
- 视图可以永久保存表结构、数据来源与原始的表
- 保存的是查询语句,但是每次都是去原始的表中查询
优点:
- 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。(隐藏部分数据,如薪资查询仅能查询到自己或部分用户的)
- 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集
- 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响
// 创建视图
create view 视图名 as select语句
// 视图修改
create or replace view 视图名 as select语句;
ALTER VIEW 视图名 AS select语句
// 通过视图更新
update 视图名 set field1='xxx' where field2='xxx';
// 通过视图插入数据(注意,视图插入数据保存在原表中)
insert into 视图名 values (`field1`, `field2`)
// 删除视图
DROP VIEW [IF EXISTS] 视图名
Redis缓存击穿、雪崩、穿透
击穿
某一个热点key失效
解决方案:
- 缓存不失效
- 缓存失效时,进程查询数据库时增加分布式锁,写入缓存后再释放锁,使其他进程可以在缓存中拿到数据
穿透
大量请求查询不存在的key,造成DB压力瞬间增大
解决方案:
- 任意查询无论结果是否存在,都将结果或空值进行缓存
- 布隆过滤器(bitmap)
- 布谷鸟过滤器
- 参数校验
雪崩
大量缓存在同一时间失效
解决方案:
- 缓存有效期加上随机事件,防止大量热点key同时失效;
- 分布热点key到不同的集群节点中
- 业务代码访问热点数据时,如果发现缓存失效,使用分布式锁读取数据库,将数据更新到缓存后再释放锁,其他进程如果发现分布式锁等待锁解除后优先从缓存中获取数据
- 暴力不设置过期时间
- 定时任务刷新缓存
布隆过滤器
大数据key是否存在的过滤,如果通过布隆过滤器无法查询到,那么该数据一定不存在,否则可能存在 是一个很长的二进制向量和一系列随机映射函数
优点
插入、查询速度快
缺点
- 删除困难(多个hash可能相同)
- 可能误判
降低误判:可以增大长度并增加hash函数,但同时性能会下降