2021最详细面试题(五)Mysql

一 Mysql

文章目录

    • 一 Mysql
      • 1.1 三大范式
      • 1.2 ACID原则
      • 1.3 事务隔离级别
    • 二 mysql进阶
      • 2.1 什么是索引?
      • 2.2 Mysql的索引?
      • 2.3 聊聊BTREE 索引?
      • 2.4 说一下索引优化原则?
      • 2.5 数据库引擎有哪些?
      • 2.6 数据库优化有哪些手段?
      • 2.7 说一下 mysql 的行锁和表锁?

1.1 三大范式

  • 1NF:原子性 字段不可再分,否则就不是关系数据库
  • 2NF:唯一性 一个表只说明一个事物
  • 3NF:每列都与主键有直接关系,不存在传递依赖

1.2 ACID原则

  • 原子性(Atomicity):要么同时成功,要么同时失败
  • 一致性(Consistency):事务前后数据的完整性必须保持一致
  • 隔离性(Isolation):不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
  • 持久性(Durability):事务一旦提交,不可逆

1.3 事务隔离级别

  • 脏读:指一个事务读取了另外一个事务未提交的数据。
  • 可重复读: 可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据**更新(UPDATE)**操作。
  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。
  • 幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

隔离级别:

  • 读未提交(READ UNCOMMITTED)
  • 读提交 (READ COMMITTED)
  • 可重复读 (REPEATABLE READ)
  • 串行化(SERIALIZABLE)
  • 从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,可重复读MySQL 的默认级别。

2021最详细面试题(五)Mysql_第1张图片

二 mysql进阶

2.1 什么是索引?

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据 库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数 据结构上实现高级查找算法,这种数据结构就是索引,总结,索引就是一种高效的数据结构

2.2 Mysql的索引?

  • BTREE 索引 : 最常见的索引类型,大部分索引都支持 B 树索引。
  • HASH 索引:只有Memory引擎支持 , 使用场景简单 。
  • R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常 使用较少,不做特别介绍。
  • Full-text(全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDBMysql5.6版本开始支持全文索引。

2.3 聊聊BTREE 索引?

演示网站:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

BTREE又叫多路平衡搜索树,一颗m叉的BTREE特性如下:

  • 树中每个节点最多包含m个孩子(m个叶子节点)。
  • 除根节点与叶子节点外,每个节点至少有[向上取值(m/2)]个孩子节点(叶子节点)。
  • 若根节点不是叶子节点,则至少有两个孩子。
  • 所有的叶子节点都在同一层。 每个非叶子节点由n个key与n+1个指针域组成,其中[向上取值(m/2)-1] <= n <= m-1
  • 每一次超过N则向上分裂

2021最详细面试题(五)Mysql_第2张图片

B+TreeBTree的变种,B+TreeBTree的区别为:

  • n叉B+Tree最多含有n个key,而BTree最多含有n-1个key。
  • B+Tree的叶子节点保存所有的key信息,依key大小顺序排列。
  • 所有的非叶子节点都可以看作是key的索引部分。

2021最详细面试题(五)Mysql_第3张图片

  • MySql索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指 针,就形成了带有顺序指针的B+Tree,提高区间访问的性能

2021最详细面试题(五)Mysql_第4张图片

2.4 说一下索引优化原则?

  • 对查询频次较高,且数据量比较大的表建立索引。
  • 索引字段的选择,最佳候选列应当从where子句的条件中提取
  • 使用唯一索引,区分度越高,使用索引的效率越高。
  • 使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率
  • 利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引

2.5 数据库引擎有哪些?

  • InnoDB:存储引擎是Mysql的默认存储引擎。InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全。 但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
  • MyISAM 不支持事务、也不支持外键,其优势是访问的速度快,对事务的完整性没有要求或者以SELECT、INSERT 为主的应用基本上都可以使用这个引擎来创建表 。
  • Memory存储引擎将表的数据存放在内存中。每个MEMORY表实际对应一个磁盘文件,格式是.frm ,该文件中只 存储表的结构,而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。MEMORY 类型的表访问非常地快,因为他的数据是存放在内存中的,并且默认使用HASH索引 , 但是服务一旦关闭,表中的 数据就会丢失。
  • MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,MERGE表本身并没有存储数据,对 MERGE类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行的。

2.6 数据库优化有哪些手段?

  • 使用 explain 命令查询 SQL语句执行计划。
  • 查看sql频率,通过show [session|global] status 命令可以提供服务器状态信息
  • show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否 锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化。
  • 开启慢日志记录
  • show profile分析SQL
  • trace分析优化器执行计划

2.7 说一下 mysql 的行锁和表锁?

2021最详细面试题(五)Mysql_第5张图片

你可能感兴趣的:(Java面试,数据结构,数据库,mysql,索引)