【面试】数据库部分 @ systemime | 2022-02-16T15:06:41+08:00 | 3 分钟阅读 | 更新于 2022-02-16T15:06:41+08:00

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失效

解决方案

  1. 缓存不失效
  2. 缓存失效时,进程查询数据库时增加分布式锁,写入缓存后再释放锁,使其他进程可以在缓存中拿到数据

穿透

大量请求查询不存在的key,造成DB压力瞬间增大

解决方案

  1. 任意查询无论结果是否存在,都将结果或空值进行缓存
  2. 布隆过滤器(bitmap)
  3. 布谷鸟过滤器
  4. 参数校验

雪崩

大量缓存在同一时间失效
解决方案

  1. 缓存有效期加上随机事件,防止大量热点key同时失效;
  2. 分布热点key到不同的集群节点中
  3. 业务代码访问热点数据时,如果发现缓存失效,使用分布式锁读取数据库,将数据更新到缓存后再释放锁,其他进程如果发现分布式锁等待锁解除后优先从缓存中获取数据
  4. 暴力不设置过期时间
  5. 定时任务刷新缓存

布隆过滤器

大数据key是否存在的过滤,如果通过布隆过滤器无法查询到,那么该数据一定不存在,否则可能存在 是一个很长的二进制向量和一系列随机映射函数

优点
插入、查询速度快

缺点

  1. 删除困难(多个hash可能相同)
  2. 可能误判

降低误判:可以增大长度并增加hash函数,但同时性能会下降

© 2018 - 2022 systemime 的博客

Powered by Hugo with theme Dream.

---

avatar
关于我

systemime 的博客

记录一些生活与技术的事或思考

毕业于 🏫 山东科技大学泰山科技学院

目前职位为Python后端开发工程师

热爱代码,热爱开源

主要的技术栈是:

  • python
  • celery
  • django
  • shell
  • sql
  • go
  • nginx

爱好

  • 羽毛球
  • 编码
我的一些开源项目

计划或项目:

  • skill_test ➡️ 一个包含项目常用的django模板:常用脚本、单测方法、数据库连接池、异步请求池,restful风格的回调接口管理器 60%
  • Vbox ➡️ 一个基于k8s和docker的容器云平台,早期项目代码较简单 90%
  • YuQue-Assistant ➡️ 用于批量拉取语雀工作区文章,使用进程池+协程
  • 一个代理池 60%
  • simple_db_pool ➡️ 一个简单数据库连接池 100%
  • 一个电报消息转发脚本 90%
  • 使用flutter做一个app 计划中
  • 其他若干脚本(bilibili、微博图片视频下载、文件对比、图片颜色提取…)
其他

如果你喜欢我的博客、开源项目或者它们可以给你带来帮助,可以赏一杯咖啡 ☕ 给我。~

If you like my open source projects or they can help you. You can buy me a coffee ☕.~

PayPal

https://paypal.me/systemime

支付宝赞赏码

alipay

微信赞赏码

wechat

最好附加一下信息或者留言,方便我可以将捐助记录 📝 下来,十分感谢 🙏。

It is better to attach some information or leave a message so that I can record the donation 📝, thank you very much 🙏.