数据库面试题集

这是我第一次这么干,以前总觉得,大概了解下就行,但是很多时候,面试ing就不知所措,所以,这次铁下心来,老老实实准备一下。注明:部分答案是从网上提取的。

1. 什么是MongoDB分片,分片的作用

分片是使用多个机器来存储数据的方法,为了支持巨大的数据存储和数据操作。

高数据量和吞吐量的数据库应用对单机的性能造成较大的压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。分片作为一种水平扩展,来解决这个问题。

2. 什么是复制集,复制集的作用

复制集是由一组mongod实例组成,包括一个Primary节点和多个Secondary节点,MongoDB Driver将数据都写入到Primary节点,Secondary从Primary节点同步数据,以保证复制集内所有节点存储相同的数据,提供数据冗余和高可用,在Primary节点查询压力较大的时候,可以查询Secondary节点,减轻Primary节点的压力。

3. Mysql与MongoDB的区别

Mysql是一个关系型数据库,数据存储方面使用表格、行列形式表示,必须先定义表格结构才能写入数据;使用标准的SQL查询,支持不同表的连接,支持事务。

MongoDB则是一个面向文档存储的nosql(not only sql)数据库,数据存储方面使用集合、文档形式表示,文档数据结构灵活,不用预先定义结构;只能单个集合查询,不支持集合连接,不支持事务;具有高性能、高可用、易扩展等特性。

4. MongoDB的ObjectId一定唯一性?

ObjectId是由一组16进制字符构成,共12个字节的存储空间。前4个字节表示utc时间戳,接着3个字节表示机器,接着2个字节表示进程ID,最后3个字节表示自增计数,确保在同一秒生成的ObjectId不会冲突,这种方式很好地解决了分布式环境下高并发情况主键唯一性问题。

5. MongoDB相对其他Nosql数据库有什么特点

  • 面向文档的数据库
  • 高性能
  • 高可用
  • 易扩展
  • 丰富的查询语言

6. MongoDB中怎么进行性能分析

MongoDB内部有一个查询优化器,将我们提供的查询条件,生成优化的查询计划,我们可以使用explain()方法 查看 queryPlanner、executionStats和allPlanExecution。可以看到对应查询的计划以及执行情况。

7. MongoDB如何执行事务/加锁

MongoDB没有使用传统的锁或者复杂的带回滚的事务,因为设计的宗旨是轻量、快速以及可预计的高性能。可以把它类比成Mysql MyIsam的自动提交模式。通过精简对事务的支持,性能得到提升,特别是在一个可能会穿过多个服务器的系统里。

8. 块移动操作失败了,需要手动清除部分转移的文档吗?

不需要。移动操作是一致性和确定性的,一次失败后,移动操作会不断重试,当完成后,数据只会出现在新的分片。

9. MongoDB日志的作用

MongoDB有三种日志模块:log,journal,oplog

  • log就是用户日志文件,记录mongod实例的一些重要流程,并持久化到log文件
  • journal主要用于解决因系统宕机时,内存中的数据未写入磁盘而造成的数据丢失,默认100ms刷一次盘,数据库的更改则是60s
  • oplog主要是负责记录写服务器上所有对数据的更改,其他Secondary节点就能通过oplog进行差异同步

10. 数据分片的方式有哪种,各自优缺点?

基于范围的分片和基于哈希分片两种。

  • 基于范围的分片提供更高效的范围查询,分发路由可以简单地确定数据块的位置。但是导致数据在分片上不均衡,导致小部分分片承载里集群大部分的数据,难以扩展。
  • 基于哈希的分片,保证集群中数据的均衡,可以将数据随机分布在不同分片中。但是范围查询则需要请求所有分片。

11. mongos怎么进行路由以及处理结果?

mongos将查询以及写入请求分发到分片中,如果查询条件有对应的shard key,则按照shard key 分到部分分片,否则分到所有分片上,每个分片都是一个mongod实例,处理对应的查询,并且在所有目标分片上建立游标。取回结果的时候,对所有分片的游标依次轮询取得结果。

12. MongoDB3.x和2.x的区别?

  • 更安全的数据库:WriteConcern默认为1,更安全的SCRAM-SHA-1算法鉴权,支持对数据进行加密
  • 更高的服务性能:MMAPV1有了集合级别锁,新引擎WT还支持文档级别锁
  • 更低的存储成本:WT存储引擎支持snappy,zlib压缩,100g -> 30g
  • 更快的复制:增量同步数据,拉取、重放oplog完成流水线化,效率更高
  • 更简单高效的分片集群:3.2开始,config server也是一个集群;3.4开始分片集群迁移由config server负责,并支持同时发起迁移任务,效率更高
  • 增加只读视图,让复杂的查询写起来更简单

13. 复制集怎么选出Primary节点?

复制集成员间每两秒进行心跳检测,如果10s没返回,则标记为不可用,就用重新选出Primary节点。

选举过程是每个成员投票,得到大多数票数的那位则为Primary节点,大多数为N/2+1,其中priority属性为0的节点和arbiter节点,不会被选为Primary。

15. 如何做Mysql性能优化?

  • 为查询缓存优化查询
  • explain select 查询
  • 当只要一行数据时使用LIMIT 1
  • 为搜索字段建索引
  • 在Join表时使用相当类型的列,并将其索引
  • 不要ORDER BY RAND()
  • 避免SELECT *
  • 永远为每张表设置一个ID
  • 尽可能的使用NOT NULL
  • 把IP地址存成 UNSIGNED INT
  • CHAR优于VARCHAR
  • 拆分大的DELETE或INSERT
  • 选择正确的存储引擎

16. 如何做性能调优?

  • 查看操作系统负载:CPU -> IO -> 内存 -> 网络带宽
  • 常见的性能优化策略:空间换时间(缓存),时间换空间(压缩),简化代码(循环、递归…),并行处理。
  • 算法调优:多虑算法,哈希算法(减少碰撞),分而治之和预处理
  • 代码调优:避免字符串操作,能用整型就别用字符串;多线程调优;内存分配;异步操作;语言和代码库
  • 网路调优
  • 数据库引擎调优:数据库锁的方式;数据库的存储机制,例如MyIsam和Innodb,varchar和char;分布式策略
  • SQL语句优化:避免全表检索;避免对索引字段做操作;多表查询,避免嵌套;尽量用limit;避免用字符串;避免全文检索;避免select *;避免Having;尽可能用UNION ALL 取代 UNION;避免索引过多

17. MyIsam和InnoDB存储引擎的区别?

MyIsam不支持事务,提供高速存储和检索,以及全文检索的能力,不支持外键,支持表级锁,存储空间相对较小,保存了行数,不用count

InnoDB支持事务,支持外键,查询相对没那么快,支持行级锁,使用sphinx插件支持全文检索,效果更好

18. Innodb的事务与日志的实现方式?

总共有5种日志:binlog,查询日志,慢查询,错误日志,中继日志,其中binlog,中继日志以二进制存储,其它三种则是文本。

InnoDB日志需要开启显式提交,日志过程:缓存进log_buffer,每秒或每十秒刷入redo_log,提交后就刷入磁盘。宕机后,恢复先redo,恢复之前没把结果刷入磁盘的操作,再undo,回滚之前没提交的事务。

19. Mysql连接突然断开,可能会什么原因?

  • 连接超时
  • 连接数量过多
  • 网络问题,不稳定or中断
  • mysqld 挂了

20. ACID是什么?

指数据库管理系统(DBMS)在写数据过程,为确保事务的正确可靠,所必须具备的四大特性。

  • 原子性:一个事务的所有操作,要么全部完成,要不全部不完成
  • 一致性:事务前后,数据库的完整性没有被破坏
  • 隔离性:防止多个事务并发执行时由于交叉执行导致数据不一致
  • 持久性:事务后,对数据的修改是永久的

21. Mysql的索引使用哪种数据结构,和Mongodb的索引有什么区别

Mysql普遍使用BTree实现索引结构,MongoDb也是使用BTree索引,除了其地理位置索引外,数据索引本质上和Mysql的BTree索引没什么差别。

22. 简述Mysql中Innodb支持的四种事务隔离级别名称,以及逐级之间的区别?

未提交读、提交读、重复读、串行读

这四种隔离级别逐个提高,区别表现在脏读,非重复读,幻读这3点,还有对并发的影响,隔离级别越高,并发性越差。

  • 脏读:在同一事务中,会读取还未提交的事务修改的数据
  • 非重复读:同一事务,在t1时刻,读取某行数据时为A,t2时刻读取同一行数据时,由于其他事务更新,这行数据已经发生改变
  • 幻读:在同一个事务中,同一查询多次进行,由于其他事务提交,插入新记录,导致每次查询的结果都不同

23. Mysql相对于其他数据库有哪些特点?

Mysql是一个小型的关系型数据库管理系统,相对其他大型数据库,例如Oracle,Sql server功能稍弱,其特点有:

  • 可以处理拥有上千万条记录的大型数据
  • 支持常见的SQL语句规范
  • 可移植性高,安装简单小巧
  • 良好的运行效率,有丰富信息的网络支持
  • 调试、管理、优化简单

24. 使用Redis有哪些好处,or为什么使用Redis

  • 数据存在内存中,时间复杂度都是O(1),速度快
  • 支持丰富的数据类型,string,list, set, sorted set, hash
  • 支持事务,操作都是原子性
  • 丰富的特性:可用于缓存、消息,支持过期自动删除

25. Redis相比memcached有哪些优势

  • memcached所有值均为字符串,redis提供更丰富的类型
  • redis的速度比memcached快很多
  • redis可以持久化数据