hooyantsing's Blog

P044-P066 MySQL

字数统计: 1.7k阅读时长: 6 min
2022/03/09

视频源:阿里P8爆肝2个月呕心整理,挑战30天打卡春招上岸!

P044 B 树和 B+ 树之间的区别

B 树(B-Trees)

image-20220309102113664

B+ 树(B+Trees)

image-20220309102206261

  • B 树和 B+ 树的结点有多个元素;
  • B+ 树在叶子结点有非叶子结点的元素冗余;
  • B+ 树的叶子节点有指针(MySQL是双向指针)。

P045 Innodb 中的 B+ 树是怎么产生的

image-20220309111722403

  • INSERT用户数据区域 插入数据时,会根据主键值排序,因此是有序的;
  • 为了加快查询速度,会对 用户数据区域 分组,将目录写到 页目录
  • 当页(MySQL默认 16 KB)满了存不下数据时,会新建一个页,指针连接。
  • 从内存向磁盘写入,从磁盘向内存读取,都是按 作为单位操作。

P046 高度为 3 的 B+ 树能存多少条数据

MySQL 的 B+ 树的结构

image-20220309114224903

  • 每个结点都是一页(MySQL默认 16 KB)。

P047 Innodb 是如何支持范围查找能走索引的

image-20220309115545679

  • Innodb B+ 树结点分为:索引页数据页
  • 主键默认使用 主键索引,只有查询条件为主键才能使用主键索引加快查询速度。若查询条件为其他字段,则是全表扫描。
    • 主键索引:从树的根结点开始向下查找数据;
    • 全表扫描:从树的左侧叶结点向右侧叶节点扫描。

P054 MySQL 中有哪些存储引擎

1. InnoDB 存储引擎

InnoDB 是 MySQL 默认事务形引擎,也是最重要、使用最广泛的存储引擎。

它被设计用来处理大量的短期(short-lived)事物,应该优先考虑 InnoDB 引擎。

2. MyISAM 存储引擎

在 MySQL 5.1 及之前的版本,MyISAM 是默认的存储引擎。

但是 MyISAM 不支持事物和行级锁,而且崩溃后无法安全恢复。

同时 MyISAM 对整张表加锁,很容易因为表锁的问题导致典型的性能问题。

3. Memory 引擎

4. Archive 引擎

5. CSV 引擎

P056 MyISAM 和 InnoDB 的区别是什么

  1. InnoDB 支持事物,MyISAM 不支持事物;
  2. InnoDB 支持外键,MyISAM 不支持外键;
  3. InnoDB 是聚集索引,MyISAM 是非聚集索引;
  4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度块;
  5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。

P057 数据表设计时,字段你会如何选择

字段类型优先级

整型 > date,time > enum,char > varchar > blob,text

选用字段长度最小、优先使用定长型、数值型字段中避免使用 “ZEROFILL” ;

P059 请说一下事物的基本特性

ACID:原子性、一致性、隔离性、持久性。

  • 原子性:一个事物中的操作要么全部成功,要么全部失败;
  • 一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态;
    • eg:比如 A 转账给 B 100 块钱,假设中间sql执行过程中系统崩溃 A 也不会损失 100 块钱,因为事物没有提交,修改也就不会保存到数据库。
  • 隔离性:一个事务的修改在提交之前,对其他事物是不可见的;
  • 持久性:一旦事务提交,所做的修改就会永久保存到数据库中。

P060 事务并发可能会引发什么问题

1. 脏读

1、在事物 A 执行过程中,事物 A 对数据资源进行了修改,事物 B 读取了事物 A 修改后的数据;

2、由于某些原因,事物 A 并没有完成提交,发生了 RollBack 操作,则事物 B 读取的数据就是脏读数据。

这种 读取到另一个事物未提交的数据的现象 就是脏读(Dirty Read)。

image-20220310160101258

2. 不可重复读

事物 B 读取了两次数据资源,在这两次读取的过程中事物 A 修改了数据,导致事物 B 在这两次读取出来的数据不一致。

这种在 同一事物中,前后两次读取的数据不一致的现象 就是不可重复读(Nonrepeatable Read)。

image-20220310162702516

3. 幻读

事物 B 前后两次读取同一个范围的数据,在事物 B 两次读取的过程中事物 A 新增了数据,导致事物 B 后一次读取到前一次查询没有看到的行。

幻读和不可重复读有些类似,但是 幻读强调的是集合的增减,而不是单条数据的更新

image-20220310163453730

P061 简单描述下 MySQL 各种索引

1. 主键索引

建立在主键上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表时一起创建。

2. 唯一索引

建立在 UNIQUE 字段上的索引被成为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突。

3. 普通索引

建立在普通字段上的索引被称为普通索引。

4. 前缀索引

前缀索引是指对字符类型字段的前几个字符或对二进制类型字段的前几个 bytes 建立的索引,而不是在整个字段上建立索引。前缀索引可以建立在类型为 char、varchar、binary、varbinary 的列上,可以大大减少索引占用的存储空间,也能提升索引查询效率。

前缀索引是一种能使索引更小更快的有效方法,但是也包含缺点:MySQL 无法使用前缀索引做 order by 和 group by。

P065 什么是全局锁、共享锁、排他锁

1. 全局锁

对整个数据库实例加锁,它的典型使用场景就是做全库逻辑备份。这个命令可以使整个库处于只读状态。使用该命令之后,数据更新语句、数据定义语句、更新类事物的提交语句等操作都会被阻塞。

2. 共享锁

又称读锁(read lock),是读取操作创建的锁。其他用户可以并发的读取数据,但任何事物都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。当如果事物对读锁进行修改操作,很可能会造成死锁。

3. 排他锁

又称写锁(writer lock),若某个事物对某一行加上了排他锁,只能这个事物对其进行读写,在此事物结束之前,其他事物不能对其进行加任何锁,其他进程可以读取,不能进行写操作,需等待其释放。排他锁是悲观锁的一种实现。

CATALOG
  1. 1. P044 B 树和 B+ 树之间的区别
    1. 1.0.1. B 树(B-Trees)
    2. 1.0.2. B+ 树(B+Trees)
  • 2. P045 Innodb 中的 B+ 树是怎么产生的
  • 3. P046 高度为 3 的 B+ 树能存多少条数据
    1. 3.0.1. MySQL 的 B+ 树的结构
  • 4. P047 Innodb 是如何支持范围查找能走索引的
  • 5. P054 MySQL 中有哪些存储引擎
    1. 5.1. 1. InnoDB 存储引擎
    2. 5.2. 2. MyISAM 存储引擎
    3. 5.3. 3. Memory 引擎
    4. 5.4. 4. Archive 引擎
    5. 5.5. 5. CSV 引擎
  • 6. P056 MyISAM 和 InnoDB 的区别是什么
  • 7. P057 数据表设计时,字段你会如何选择
    1. 7.0.1. 字段类型优先级
  • 8. P059 请说一下事物的基本特性
  • 9. P060 事务并发可能会引发什么问题
    1. 9.1. 1. 脏读
    2. 9.2. 2. 不可重复读
    3. 9.3. 3. 幻读
  • 10. P061 简单描述下 MySQL 各种索引
    1. 10.1. 1. 主键索引
    2. 10.2. 2. 唯一索引
    3. 10.3. 3. 普通索引
    4. 10.4. 4. 前缀索引
  • 11. P065 什么是全局锁、共享锁、排他锁
    1. 11.1. 1. 全局锁
    2. 11.2. 2. 共享锁
    3. 11.3. 3. 排他锁