新版博客SEO优化基本完成,新老博客内容正在整合中,保证每篇文章高质量。 SiteMap RSS Github
数据库面试题---长期更新
嘉美伯爵   2019年5月20日 12:01   面试   MySQL Redis MongoDB   221  

MySQL

事务

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。

Mysql的四种事务隔离级别( transaction_isolation)

  • 读未提交:别的事务可以读取到未提交的修改

  • 读已提交:能读取已提交的数据

  • 可重复读(REPEATABLE-READ默认):同一事务先后查询结果不一样

  • 串行化:事务完全串行化的执行,隔离级别高,但是执行效率低

MyISAM和InnoDB

  • MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。

  • InnoDB支持行锁和表锁,于是在写操作比较多的时候,会更优秀;MyISAM只支持表锁

  • MyISAM不支持事务,InnoDB支持事务

  • MyISAM不支持外键,InnoDB支持外键

  • MyISAM索引是非聚集的(数据和索引分离),InnoDB是聚集索引

如何高并发下的插入重复

  • 使用数据库的唯一索引

  • 使用队列异步写入

  • 使用redis实现分布式锁

乐观锁和悲观锁

  • 悲观锁:先获取锁在进行操作。一锁二查三更新

  • 乐观锁:先修改,更新的时候发现数据变了就回滚

什么时候创建索引

  • 经常用作查询条件的字段

  • 经常用作连接的字段

  • 出现在group by,order by后的字段

创建索引应该注意的

  • 非空字段,由于B+ Tree的特点,Mysql很难对NUll值进行优化

  • 作为索引的字段值尽量不要有大量的重复值

  • 索引的长度不要太长,否则会比较耗时

索引失效的情况

  • 以 % 开头的like语句

  • 没有满足最左匹配

  • 出现隐式类型的转换

如何排查慢查询

  • 开启并且查询慢查询日志

  • 通过explain排查索引问题

  • 调整数据修改索引

Redis

数据类型

string:实现简单的KV键值对存储,比如计数器
list:实现双向链表,比如用户的关注、粉丝列表
hash:用来存储彼此相关的键值对
set:存储不重复元素,比如用户的关注者
sorted set:实时信息排行榜

优点

  • 快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
  • 持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
  • 自动操作:对不同数据类型的操作都是自动的,很安全

缺点

  • 是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

持久化方式

Redis事务

分布式锁

如何使用缓存模式

缓存穿透

缓存击穿

缓存雪崩

用途

  • 缓存
  • 分布式锁
  • 缓存用户行为历史,进行恶意行为过滤 (zset,hash)
  • 记录热榜帖子 ID 列表,总热榜和分类热榜 (zset)
  • 先查redis,再查数据库,缓解数据库查询压力
  • 客户端临时认证的数据,如session、队列消息
  • 记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)
  • 记录帖子的点赞数、评论数和点击数 (hash)