MySQL 复习笔记(面向大厂)

MySQL 复习笔记,对面试题进行分类,同时使用⭐️标记重点程度,使用表示遗忘程度,随着面试会逐渐更新

文章目录

  • 1.MySQL引擎
    • 1.1 InnoDB 和 MyISAM 的区别⭐️⭐️
  • 2.索引及其原理
    • 2.1 ⼆叉搜索树(binary serach tree)⭐️
    • 2.2 平衡二叉查找树(AVL)⭐️
    • 2.3 B 树(B-树)⭐️
    • 2.4 B+树⭐️
    • 2.5 查询索引为 col = 30 的例子⭐️
    • 2.6 B +树相比 B树的优势⭐️
    • 2.7 B+ 树与红黑树比较⭐️
    • 2.8 聚集索引和非聚集索引区别⭐️
  • 3.MySQL优化
    • 3.1 索引优化⭐️
    • 3.2 查询优化⭐️
        • 3.2.1 使用 Explain 进行分析⭐️
        • 3.2.2 优化数据访问⭐️
        • 3.2.3重构查询的方式⭐️
  • 4.MysQL 事务
    • 4.1 数据库 ACID 特性⭐️
    • 4.2 并发事务有哪些问题⭐️
    • 4.3 不可重复读和幻读的区别以及解决的办法⭐️
    • 4.4 四大隔离级别⭐️

1.MySQL引擎

1.1 InnoDB 和 MyISAM 的区别⭐️⭐️

存储引擎比较 InnoDB MyISAM
是否支持行级锁 支持(默认为行级别) 不支持(默认为表级别)
是否支持 MVCC 支持(高并发问题) 不支持(简单加锁)
是否支持外键 支持 不支持
是否支持事务支持 支持ACID 不支持(查询是原子性的)
是否是聚簇索引 不是

⼀般情况下我们选择 InnoDB 都是没有问题的,但是某些情况下你并不在乎并发能 ⼒,也不需要事务⽀持,也不在乎崩溃后的安全恢复问题的话,选择MyISAM也是⼀个不错的选 择。但是⼀般情况下,我们都是需要考虑到这些问题的。

2.索引及其原理

数据库索引是存放在磁盘上的,当数据量较大的时候我们不能把整个索引全部加载到内存中去,只能逐个加载每一个磁盘页,所以我们要减少 io 次数,对于树而言 io 次数就是树的高度,矮胖就是 b 树的特征之一

2.1 ⼆叉搜索树(binary serach tree)⭐️

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  3. 它的左右子树也分别为二叉搜索树

2.2 平衡二叉查找树(AVL)⭐️

  1. 具备二叉排序树的所有性质;

  2. 左子树和右子树深度差的绝对值不超过1;

  3. 左子树和右子树都是二叉平衡树。

2.3 B 树(B-树)⭐️

MySQL 复习笔记(面向大厂)_第1张图片

  1. 多路平衡搜索树,类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点
  • 数据索引和 data 在一个节点中,分别是 key 和 value
  • 数据索引从左到右递增且不重复

2.4 B+树⭐️

MySQL 复习笔记(面向大厂)_第2张图片

  1. 多路平衡搜索树
  • 所有的 data 都存放在叶子节点
  • 叶子节点用指针连接,提高访问性能

2.5 查询索引为 col = 30 的例子⭐️

  • 数据库索引都存储在磁盘上,但是如果数据量较大就不能一下子加载到内存中需要逐个加载
  • 首先load 到内存中,在内存中查找30,二分查找定位到上图的灰色部分,存放的是25 - 30磁盘的地址,继续将这个节点加载到内存中去
  • 一直向下查询到叶子结点,获取到数据

2.6 B +树相比 B树的优势⭐️

  • B+树查询效率更加稳定:每次查询都需要遍历到根节点,查询路径相同,查询效率相当
  • B+树空间利用率更高减少 IO 次数:B+树的中间节点不保存数据,是纯索引,但是B树的中间节点是保存数据和索引的,相对来说,B+树磁盘页能容纳更多节点元素,更“矮胖”
  • 范围查询效率更高: B+树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。 这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。在数据库中基于范围的查询是非常频繁的,而B树不支持这样的遍历操作。

2.7 B+ 树与红黑树比较⭐️

  • B+树更加矮胖,比红黑树,也就是IO 次数更少

  • 磁盘访问原理,节点越大越好:操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。如果数据不在同一个磁盘块上,那么通常需要移动制动手臂进行寻道,而制动手臂因为其物理结构导致了移动效率低下,从而增加磁盘数据读取时间。B+ 树相对于红黑树有更低的树高,进行寻道的次数与树高成正比(说明它的节点越小),在同一个磁盘块上进行访问只需要很短的磁盘旋转时间,所以 B+ 树更适合磁盘数据的读取。

  • 磁盘预读原理:为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的磁盘旋转时间,速度会非常快。并且可以利用预读特性,相邻的节点也能够被预先载入。

2.8 聚集索引和非聚集索引区别⭐️

  • 都是B+树,非叶子节点存放的是key,叶子节点存放 key 和 data
  • 聚集索引叶子节点存放的 data 是数据页,索引是相邻的,对应的数据也是相邻的放在磁盘上的,适合范围查询,也是它的优势
  • 非聚集索引叶子节点存放的是主键的值,叶子节点不存储数据,存放的是数据行的地址,相当于需要二次查找,也是它的优势

3.MySQL优化

3.1 索引优化⭐️

  1. 建立聚集索引:就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页

  2. 建立联合索引:联合索引是指对表上的多个列进行索引.从本质上来说,联合索引也是一棵B+树,不同的是联合索引的键值的数量不是1,而是大于等于2

  3. 最左前缀原则:建立组合索引一定要考虑最左前缀原则,如果索引了多例,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列

  4. 较长的数据建立前缀索引:当索引是很长的字符序列时,这个索引将会很占内存,而且会很慢,这时候就会用到前缀索引了。所谓的前缀索引就是取索引的前面几个字母作为索引

  5. 不要建立无意义的索引:查询较少,字段较长等索引

3.2 查询优化⭐️

3.2.1 使用 Explain 进行分析⭐️

Explain用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。

  • select_type : 查询类型,有简单查询(simple)、联合查询(使用union)、子查询(primary使用两个 select)等
  • key : 使用的索引,如果为null,则没有使用索引
  • rows : 扫描的行数

3.2.2 优化数据访问⭐️

  1. 减少请求的数据量
  • 只返回必要的列:最好不要使用 SELECT * 语句。
  • 只返回必要的行:使用 LIMIT 语句来限制返回的数据。
  • 缓存重复查询的数据:使用缓存可以避免在数据库中进行查询,特别在要查询的数据经常被重复查询时,缓存带来的查询性能提升将会是非常明显的。
  1. 减少服务器端的扫描的行数
  • 有效的方式是使用索引来覆盖查询。

3.2.3重构查询的方式⭐️

  • 将一个大连接查询分解成对每一个表进行一次单表查询,然后在应用程序中进行关联好处有以下
  • 分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到连接查询。如果其中一个表发生变化,那么整个查询缓存就无法使用
  • 减少锁竞争

4.MysQL 事务

4.1 数据库 ACID 特性⭐️

事务就是数据库的一系列操作最小单位

  1. 原子性Atomicity) : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性Consistency): 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  3. 隔离性Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性Durabilily): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

4.2 并发事务有哪些问题⭐️

  • 脏读:当⼀个事务正在访问数据并且对数据进⾏了修改,⽽这种修改还没有提交到数据库中,这时另外⼀个事务也访问了这个数据,然后使⽤了这个数据。因为这个数据 是还没有提交的数据,那么另外⼀个事务读到的这个数据是“脏数据”,依据“脏数据”所做的 操作可能是不正确的。(读未提交)

  • 不可重复读:指在⼀个事务内多次读同⼀数据。在这个事务还没有结 束时,另⼀个事务也访问该数据。那么,在第⼀个事务中的两次读数据之间,由于第⼆个事 务的修改或者删除导致第⼀个事务两次读取的数据可能不太⼀样。这就发⽣了在⼀个事务内两次读到 的数据是不⼀样的情况,因此称为不可重复读

  • 幻读:A 事务读取了 B 事务已提交的新增数据

4.3 不可重复读和幻读的区别以及解决的办法⭐️

  • 幻读是新增,不可重复读是修改或者删除,对于幻读必须要加表级锁,而对于不可重复读只需要加行锁即可

4.4 四大隔离级别⭐️

READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更, 可能会导致脏读、幻读或不可重复读。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻⽌脏读,但 是幻读或不可重复读仍有可能发⽣。

REPEATABLE-READ(可重复读): 对同⼀字段的多次读取结果都是⼀致的,除⾮数据是被 本身事务⾃⼰所修改,可以阻⽌脏读和不可重复读,但幻读仍有可能发⽣。

SERIALIZABLE(可串⾏化): 最⾼的隔离级别,完全服从ACID的隔离级别。所有的事务依 次逐个执⾏,这样事务之间就完全不可能产⽣⼲扰,也就是说,该级别可以防⽌脏读、不可 重复读以及幻读。

隔离级别 脏读 不可重复读 幻读
读未提交 ✔️ ✔️ ✔️
读已提交 ✖️ ✔️ ✔️
可重复读 ✖️ ✖️ ✔️
可串行化 ✖️ ✖️ ✖️

你可能感兴趣的:(MySQL 复习笔记(面向大厂))