数据库面试

数据库


数据库引擎的理解

  • 和大多数数据库不同,MySQL有一个存储引擎的概念,Oracle、SqlServer这些数据库都没有存储引擎。可以针对存储需求选择最优的存储引擎。数据库引擎有很多,InnoDB、MyISAM、CSV、memory。存储引擎是基于表的,而不是基于库的。所以存储引擎也可称为表的类型。
  • 现在用的最多的是InnoDB和Myisam。MySQL的默认引擎是InnoDB。
    • InnoDB支持外键,支持事务,也可以说InnoDB是唯一支持外键的和事务的。提供了提交、回滚、崩溃回复能力的事务安全。
    • 他们的锁机制不同,InnoDB是行级锁,而MyISAM是表级锁。所以InnoDB更加适合高并发场景。而相比InnoDB的话,MyISAM的访问速度更快,因为它不支持事务。
  • 选择数据库引擎的时,应该根据业务场景和系统特点选择合适的存储引擎。
    • 如果要在并发的环境下要求数据的一致性,或者需要事务的完整提交和回滚,那么InnoDB很适合
    • 如果以读操作和插入操作为主,只要很少的更新删除。并且对事务完整性、并发性要求不高,可以使用MyISAM。

B+树相较于B树的优点

  • 每个节点存储的key数量更多,查询的IO次数更少

  • 所有的具体数据都存在叶子节点上,所以每次查询都要查到叶子节点,查询速度比较稳定

  • 所有的叶子节点构成了一个有序链表,做区间查询时更方便

支持事务的好处

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

事务提供了一种机制,可用来将一系列数据库更改归入一个逻辑操作。更改数据库后,所做的更改可以作为一个单元进行提交或取消。事务可确保遵循原子性、一致性、隔离性和持续性(ACID)这几种属性,以使数据能够正确地提交到数据库中。
使用事务机制的好处非常明显,例如银行转账之类的交易操作中,事务有着重要的作用。事务的成功取决于事务单元帐户相互依赖的操作行为是否能全部执行成功,只要有一个操作行为失败,整个事务将失败。例如:客户A和客户B的银行账户金额都是10000元人民币,客户A需要把自己帐户中的5000元人民币转到客户B的账户上。这个过程看似简单,实际上涉及了一系列的数据库操作,可以简单地视为两步基本操作,即从客户A帐户的金额中扣除5000元人民币,以及将客户B帐户中金额添加5000元人民币。假设第1步数据库操作成功,而第二步失败的话,将导致整个操作失败,并且客户A帐户金额将被扣除5000元人民币。事务机制可以避免此类情况,以保证整个操作的完成,如果某步操作出错,之前所作的数据库操作将全部失效。

数据库的ACID

可以简单记忆为原、一、隔、持

  • 原子性(Atomicity):是指事务是一个不可再分割的工作单位,事务中的操作哟啊么都发生,要么都不发生。
  • 一致性(Consistency):一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行效果。
  • 持久性(Durability):意味着在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

事务的四大隔离级别

读未提交,读已提交,可重复读,串行化

问题含义
丢失更新(Lost Update)当两个或多个事务选择同一行,最初的事务修改的值,会被后面的事务修改的值覆盖。
脏读(Dirty Reads)当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。(简而言之:一个事务读取了另一个事务没有提交的数据,例如:a事务插入了一条数据,但是并没有提交,此时b读取到了,但是之后a又发生了回滚)
不可重复读(Non-Repeatable Reads)一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现和以前读出的数据不一致。(同一个事务读取相同的数据,读出来却不一样。产生的原因是另一个事务对数据做了修改)
幻读(Phantom Reads)一个事务按照相同的查询条件重新读取以前查询过的数据,却发现其他事务插入了满足其查询条件的新数据。(用户名注册时,先查询用户名是否存在,a,b两个线程去注册张三这个名字,同时查询发现都不存在。然后a插入了张三并且提交,b插入时却发生了报错。)
隔离级别丢失更新脏读不可重复读幻读
Read uncommitted 读未提交×
Read committed 读已提交××
Repeatable read(默认)可重复读×××
Serializable 串行化××××

备注 : √ 代表可能出现 , × 代表不会出现 。

数据库连接池工作机制

服务器启动时会开启一定数量的数据库连接,并维持不少于这个数目的池连接。

客户端程序需要此连接时,池驱动程序会返回一个未使用的池连接并标记为忙。

如果当前没有空闲连接,池驱动程序则会新建一定数量的连接,当然咯这个数量是由配置参数决定。

当使用的池连接调用完之后,池驱动程序将此连接标记为闲,其他调用就可以使用此连接。

NOSql,Redis优点

NOSql指的是Not Only SQL,非关系型数据库,数据存储不需要固定的模式,无需多余的操作就可以横向扩展。

优点:高可扩展,架构灵活,没有复杂关系。

缺点:查询功能有限,无法实现关系型数据库的那种多表联合查询。

Redis持久化

持久化就是把内存的数据写到硬盘上。

Redis提供两种持久化方式:RDB(默认)和AOF

  • 【RDB是RedisDatabase】

    RDB,在指定的时间间隔能对数据进行快照存储,是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。

    • 优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了Redis的高性能

    • 缺点:RDB是间隔一段时间进行持久化,如果持久化之间Redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候。

      【这个间隔时间不能频繁,因为要完整的保存整个数据集是一个比较繁重的工作,当数据集比较大

      .的时候,会降低响应速率】

  • 【AOF是Append-Only-File的缩写】

    记录每次对服务器写的操作,以Redis协议追加保存每次写的操作到文件末尾,当服务器重启的时候会重新执行这邪恶命令来恢复原始的数据。

    • 优点:可以保持更高的数据完整性,使用默认每秒fsync【fsync是指把缓存中的写指令记录到磁盘中】策略,Redis的性能依然很好,自动地在后台对AOF进行重写:重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合
    • 缺点:AOF文件比RDB文件大,且恢复速度慢。

缓存穿透、缓存雪崩

  • 缓存穿透:一般的缓存系统,都是按照key去进行缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫缓存穿透。

    1:对查询结果为空的情况也进行缓存,缓存时间设置为短一点,或者该key对应的数据insert了之后清理缓存。
    2:对一定不存在的key进行过滤。把可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤
  • 缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。

    1:在缓存失效之后,通过加锁或者队列来控制数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据库和写缓存,其他线程等待。
    2:做二级缓存,A1为原始缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
    3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值