MySQL
This commit is contained in:
@ -31,13 +31,13 @@
|
||||
|
||||
### 1.1 InnoDB
|
||||
|
||||
InnoDB 是 MySQL 5.5 之后默认的存储引擎,它是一种兼具高可靠和高性能的存储引擎,主要具备以下优势:
|
||||
InnoDB 是 MySQL 5.5 之后默认的存储引擎,它兼具高可靠和高性能的特性,主要具备以下优势:
|
||||
|
||||
+ DML 操作完全遵循 ACID 模型,支持事务,支持崩溃恢复,能够极大的保护用户的数据安全;
|
||||
+ InnoDB 支持多版本并发控制,它会保存旧版本的数据信息,以支持并发和事务的回滚;
|
||||
+ DML 操作完全遵循 ACID 模型,支持事务,支持崩溃恢复,能够极大地保护用户的数据安全;
|
||||
+ 支持多版本并发控制,它会保存数据的旧版本信息,从而可以支持并发和事务的回滚;
|
||||
+ 支持行级锁,支持类似 Oracle 的一致性读的特性,从而可以承受高并发地访问;
|
||||
+ InnoDB 组织数据时默认按照主键进行聚簇,从而可以提高主键查找的效率。对于频繁访问的数据,InnoDB 还会为其自建立哈希索引,从而提高等值查询的效率,这称为自适应哈希索引。
|
||||
+ InnoDB 基于磁盘进行存储,所有存储记录按**页**的方式进行管理。为弥补 CPU 速度与磁盘速度之间的鸿沟,InnoDB 引用缓存池 (Buffer Pool) 来提高数据的整体性能。查询时,会将目标页读取缓存中;修改时,会先修改缓冲池中的页,然后再遵循 CheckPoint 机制将页刷回磁盘。所有缓存页通过最近最少使用原则 ( LRU ) 来进行定期清理。
|
||||
+ InnoDB 组织数据时默认按照主键进行聚簇,从而可以提高主键查找的效率。对于频繁访问的数据,InnoDB 还会为其建立哈希索引,从而提高等值查询的效率,这称为自适应哈希索引。
|
||||
+ InnoDB 基于磁盘进行存储,所有存储记录按 **页** 的方式进行管理。为弥补 CPU 速度与磁盘速度之间的鸿沟,InnoDB 引用缓存池 (Buffer Pool) 来提高数据的整体性能。查询时,会将目标页读取缓存中;修改时,会先修改缓冲池中的页,然后再遵循 CheckPoint 机制将页刷回磁盘。所有缓存页通过最近最少使用原则 ( LRU ) 来进行定期清理。
|
||||
+ InnoDB 支持两次写 (DoubleWrite) ,从而可以保证数据的安全,提高系统的可靠性。
|
||||
|
||||
一个 InnoDB 引擎完整的内存结构和磁盘结构如下图所示:
|
||||
@ -45,7 +45,6 @@ InnoDB 是 MySQL 5.5 之后默认的存储引擎,它是一种兼具高可靠
|
||||
|
||||
|
||||
<div align="center"> <img src="../pictures/innodb-architecture.png"/> </div>
|
||||
|
||||
### 1.2 MyISAM
|
||||
|
||||
MyISAM 是 MySQL 5.5 之前默认的存储引擎。创建 MyISAM 表时会创建两个同名的文件:
|
||||
@ -120,19 +119,15 @@ mysql> SELECT * FROM total;
|
||||
**平衡二叉树数据结构**:
|
||||
|
||||
<div align="center"> <img src="../pictures/avl-tree.png"/> </div>
|
||||
|
||||
**红黑树数据结构**:
|
||||
|
||||
<div align="center"> <img src="../pictures/red-black-tree.png"/> </div>
|
||||
|
||||
**Btree 数据结构**:
|
||||
|
||||
<div align="center"> <img src="../pictures/btree.png"/> </div>
|
||||
|
||||
**B+ Tree 数据结构**
|
||||
|
||||
<div align="center"> <img src="../pictures/B+Trees.png"/> </div>
|
||||
|
||||
> 以上图片均通过数据结构可视化网站 [Data Structure Visualizations](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) 自动生成,感兴趣的小伙伴也可自行尝试。
|
||||
|
||||
从上面的图示中我们可以看出 B+ Tree 树具有以下优点:
|
||||
@ -144,7 +139,7 @@ mysql> SELECT * FROM total;
|
||||
|
||||
### 2.2 B+ tree 索引
|
||||
|
||||
对于 InnoDB ,因为主键索引是聚集索引,所以其叶子节点存储的就是实际的数据。而非主键索引存储则是主键的值 :
|
||||
对于 InnoDB ,因为主键索引是聚集索引,所以其叶子节点存储的就是实际的数据。而非主键索引存储的则是主键的值 :
|
||||
|
||||
<div align="center"> <img src="../pictures/mysql-innodb-索引.png"/> </div>
|
||||
对于 MyISAM,因为主键索引是非聚集索引,所以其叶子节点存储的只是指向数据位置的指针:
|
||||
@ -288,25 +283,21 @@ InnoDB 存储引擎完全支持 ACID 模型:
|
||||
一个事务的更新操作被另外一个事务的更新操作锁覆盖,从而导致数据不一致:
|
||||
|
||||
<div align="center"> <img src="../pictures/mysql-修改丢失.png"/> </div>
|
||||
|
||||
**2. 脏读**
|
||||
|
||||
在不同的事务下,一个事务读取到其他事务未提交的数据:
|
||||
|
||||
<div align="center"> <img src="../pictures/mysql-脏读.png"/> </div>
|
||||
|
||||
**3. 不可重复读**
|
||||
|
||||
在同一个事务的两次读取之间,由于其他事务对数据进行了修改,导致对同一条数据两次读到的结果不一致:
|
||||
|
||||
<div align="center"> <img src="../pictures/mysql-不可重复读.png"/> </div>
|
||||
|
||||
**4.幻读**
|
||||
|
||||
在同一个事务的两次读取之间,由于其他事务对数据进行了修改,导致第二次读取到第一次不存在数据,或第一次原本存在的数据,第二次却读取不到,就好像之前的读取是 “幻觉” 一样:
|
||||
|
||||
<div align="center"> <img src="../pictures/mysql-幻读.png"/> </div>
|
||||
|
||||
### 4.4 隔离级别
|
||||
|
||||
想要解决以上问题,可以通过设置隔离级别来实现:InnoDB 支持以下四个等级的隔离级别,默认隔离级别为可重复读:
|
||||
|
Reference in New Issue
Block a user