数据库高频面试总结

1. MySQL的事务隔离级别,可重复读是什么样的概念?

可重复读(Repeatable Read)是MySQL的默认事务隔离级别。在这个隔离级别下,事务中的SELECT操作会给涉及的所有数据上读锁,确保在同一个事务内多次读取相同记录的结果是一致的。这样就避免了非重复读问题,即在一个事务内读取到其他事务已经修改的数据。然而,它并不能完全防止所有并发问题,比如“幻读”,在MySQL中通过使用多版本并发控制(MVCC)来解决。

2. MySQL联合索引最左匹配原则

最左前缀匹配原则指的是,在使用联合索引时,MySQL会从索引的最左边开始匹配。查询条件中使用的字段必须与索引中的字段从左到右顺序一致,并且不能跳过索引中的字段。

3. MySQL的慢查询是怎么解决的?

慢查询可以通过开启和配置MySQL的慢查询日志来诊断。具体步骤包括:

  • 启用慢查询日志,设置慢查询阈值。
  • 分析慢查询日志,找出执行时间长的查询语句。
  • 对慢查询进行SQL优化,比如建立合适的索引、优化查询语句结构、调整配置参数等。
  • 使用EXPLAIN命令分析查询的执行计划。
  • 监控服务器性能,确保硬件资源不是瓶颈。
4. Redis遍历key的命令,可否用keys命令?

是的,可以用KEYS命令来遍历Redis中的键。但是在生产环境中通常不推荐使用,因为它可能会阻塞当前数据库实例,导致性能问题。对于大数据集,应该使用SCAN命令来迭代键,SCAN提供了一种方式来增量地遍历键空间,不会阻塞服务器。

5. MySQL的优化?

MySQL优化可以包括以下几个方面:

  • 索引优化:创建适当的索引,优化查询速度。
  • SQL语句优化:避免复杂的关联查询,减少子查询,优化WHERE子句等。
  • 数据库表结构优化:如使用合适的数据类型,合理设计表结构等。
  • 配置优化:根据服务器性能调整MySQL配置。
  • 硬件优化:升级硬件以提高性能,比如增加内存、使用更快的磁盘等。
6. MongoDB和MySQL的区别,MongoDB的索引了解过么?

MongoDB是一个基于文档的NoSQL数据库,而MySQL是一个关系型数据库。两者的主要区别有:

  • 数据模型:MongoDB使用文档模型存储数据,没有固定的模式;MySQL使用表格模型,需要预定义数据结构。
  • 查询语言:MongoDB使用JSON风格的查询语言;MySQL使用SQL查询语言。
  • 事务:传统上,MongoDB只支持单个文档的原子性,而MySQL支持ACID事务。尽管MongoDB也开始支持多文档事务,但这是近期的发展。
  • 扩展性:MongoDB天生支持水平扩展,支持分片;MySQL通常依赖于垂直扩展,虽然也可以通过复制和分区来实现一定程度的扩展。
  • 索引:MongoDB支持多种类型的索引,包括单字段索引、复合索引、地理空间索引等。索引可以极大地提高查询效率。
7. Redis的数据类型?

Redis支持多种数据类型,包括:

  • 字符串(Strings)
  • 列表(Lists)
  • 集合(Sets)
  • 有序集合(Sorted Sets)
  • 哈希表(Hashes)
  • 位图(Bitmaps)
  • 超日志(HyperLogLogs)
  • 地理空间索引(Geo)
8. Redis持久化的方式

Redis有两种主要的持久化方式:

  • RDB(Redis Database):周期性地保存数据快照到磁盘。
  • AOF(Append Only File):记录每个写操作到AOF文件,可以在服务器重启时重新播放这些操作以恢复数据。
9. MySQL的索引,聚簇索引和非聚簇索引的区别?索引是用什么实现的(b+ tree)?
  • 聚簇索引:数据行和索引是在一起的,即索引结构的叶子节点就是数据节点。InnoDB的主键索引就是聚簇索引。
  • 非聚簇索引:索引和数据行是分开的。叶子节点包含数据行的引用。MyISAM使用非聚簇索引。
    MySQL的索引通常是使用B+树数据结构实现的,因为B+树在范围查询方面性能优异,并且磁盘读写友好。
10. MySQL事务隔离级别(RU/RC/RR/S),可重复读是怎么实现的?幻读是怎么解决的?
  • MySQL实现可重复读(Repeatable Read,RR)主要依靠MVCC(Multi-Version Concurrency Control,多版本并发控制)。每当数据被更新时,旧的数据版本会被保留,使得同一事务里的SELECT可以看到一致的快照数据。至于幻读问题,在可重复读隔离级别下,通过Next-Key Locking来防止幻读,即锁定索引记录以及索引记录之间的间隙。
11. Redis ZSet底层是怎么实现的(压缩链表、跳表)?
  • Redis中的有序集合ZSet在元素数量较少时使用压缩列表(ziplist)作为底层实现,这样可以节省内存。当元素数量增加或者某个元素的大小超过一定限制时,Redis会转换成跳表(skiplist)和字典(hash)的结合。跳表为有序数据提供了快速的插入、删除和查找功能,而字典则用于通过元素值快速访问跳表节点。
12. Redis的持久化机制?RDB的原理(save、bgsave)?
  • RDB(Redis Database)持久化会在指定的时间间隔内生成数据集的时间点快照。这是通过SAVE命令或者后台进程BGSAVE命令完成的。SAVE命令将会阻塞Redis服务器,直到RDB文件创建完毕,而BGSAVE命令则会派生一个子进程来创建RDB文件,父进程继续处理客户端请求。RDB是一个紧凑的二进制文件,可以用于灾难恢复,备份和复制等场景。
  • 33
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值