2021-02-01-Mysql(数据库面试题摘要)

来源于网络

1.分别说一下范式和反范式的优缺点

1.范式
减少数据冗余
表中重复数据较少,更新操作比较快
范式化的表通常比反范式化的表小

在查询的时候通常需要很多的关联,降低性能
增加了索引优化的难度

2.反范式
可以减少表的关联
更好的进行索引优化

数据重复冗余
对数据表的修改需要更多的成本

2.B+ 树和 B 树的区别

https://www.jianshu.com/p/ace3cd6526c4

3.聚簇索引和非聚簇索引

  1. 聚簇索引,又叫主键索引,每个表只有一个主键索引,叶子节点保存主键的值和数据
  2. 非聚簇索引,又叫辅助索引,叶子节点保存索引字段的值和主键的值

4.Mysql 什么情况会造成脏读、不可重复读、幻读?如何解决

  1. 脏读:有两个事务A和B,A读取已经被B修改但未提交的字段,此时B回滚,那么A读取的字段就是临时且无效的。可以提高隔离级别,改成读已提交
  2. 不可重复读: 有两个事务A和B,A读取了一个字段值,然后B更新并且提交事务,A再重新读取这个字段,就和之前不相等了。可以提高隔离级别,改成可重复读
  3. 幻读: 有两个事务A和B,A读取某个范围内的记录时,B又在该范围内插入了新的记录并提交,当事务A再次读取该范围的记录时,会产生幻行。可以升级隔离级别到串行化,或者使用 MVCC + next-key锁机制实现

5.Mysql 事务是如何实现的

原子性:通过undo log实现的。每条数据变更都伴随一条undo log日志的生成,当系统发生错误或执行回滚根据undo log做逆向操作
持久性:通过redo log实现的。redo log记录了数据的修改日志。数据持久化到磁盘,先是储存到缓冲池里,然后缓冲池中的数据定期同步到磁盘中,如果系统宕机,可能会丢失数据,系统重启后会读取redo log恢复数据
隔离性:mysql数据库通过MVCC + next-key机制实现了隔离性
一致性:以上3大特性,保障了事务的一致性

6.Innodb 和 MyISAM 的区别是什么

  1. Innodb 支持事务。MyISAM 不支持
  2. Innodb 支持外键。MyISAM 不支持
  3. Innodb 主键索引的叶子节点是数据文件,辅助索引的叶子节点是主键的值 MyISAM 的主键索引和辅助索引,叶子节点都是数据文件的指针
  4. Innodb 不保存表的行数,执行 select count(*) from tb需要全表扫描。MyISAM 用一个变量保存了整个表的行数,执行上述语句只需要读取该变量,速度很快
  5. Innodb 所有的表在磁盘上保存在一个文件中。MyISAM 存储成三个文件。
  6. Innodb 需要更多的内存和存储。MyISAM 可被压缩,存储空间较小。
  7. Innodb 移植方案拷贝文件、备份 binlog,或者用 mysqldump,移植较困难。MyISAM 数据以文件形式存储,在备份和回复时可以单独针对表进行操作
  8. Innodb 支持行锁、表锁。MyISAM 支持表锁
  9. Innodb 在5.7版本之前不支持全文索引。MyISAM 支持全文索引

7.Mysql 什么情况会造成慢查,如何查看慢查询

  1. 没有设置索引,或查询没有用到索引
  2. I/O吞吐量过小
  3. 内存不足
  4. 网络速度慢
  5. 查询的数据量过大
  6. 锁或者死锁
  7. 返回了不必要的行或列
  8. 查询语句存在问题,需要优化
  9. 慢查询日志默认是关闭的,如果非必要,不要开启,会影响性能。

使用SHOW VARIABLES LIKE 'slow_query%';
slow_query_log,慢查询开启关闭状态
slow_query_log_file,慢查询日志存储位置,用文本编辑器打开存储位置的文件,查询慢查询

8.如何处理慢查询,你一般是怎么处理慢查询的

  1. 把数据、日志、索引放到不同的I/O设备上,增加读取速度
  2. 纵向、横向分割表,减少表的尺寸
  3. 升级硬件
  4. 根据查询条件,建立索引,索引优化
  5. 提高网速
  6. 扩大服务器内存
  7. 分库分表

你可能感兴趣的:(2021-02-01-Mysql(数据库面试题摘要))