2023.1.5-1

This commit is contained in:
aliubo 2023-01-05 16:51:23 +08:00
parent a540178dc6
commit 1b52cbb4e9
3 changed files with 116 additions and 0 deletions

43
Mysql-InnoDB/ACID.md Normal file
View File

@ -0,0 +1,43 @@
# ACID
## 介绍
A: atomicity.
C: consistency.
I:: isolation.
D: durability.
## Atomicity
ACID 模型的原子性方面主要涉及 InnoDB 事务。相关的 MySQL 特性包括
* The autocommit setting.
* The COMMIT statement.
* The ROLLBACK statement.
## Consistency
ACID 模型的一致性方面主要涉及内部 InnoDB 处理以保护数据免于崩溃。相关的 MySQL 特性包括:
* InnoDB [双写缓冲区](https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html)
* InnoDB [崩溃恢复](https://dev.mysql.com/doc/refman/8.0/en/innodb-recovery.html#innodb-crash-recovery)
## Isolation
ACID 模型的隔离方面主要涉及 InnoDB 事务,特别是应用于每个事务的隔离级别
* 自动提交(auto commit)设置
* 事务隔离级别和 SET TRANSACTION 语句。 请参阅第 15.7.2.1 节,“[事务隔离级别](https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html)”。
* InnoDB 锁定的底层细节。 可以在 INFORMATION_SCHEMA 表(参见第 15.15.2 节,[“InnoDB INFORMATION_SCHEMA 事务和锁定信息](https://dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-transactions.html)”)和 Performance Schema data_locks 和 data_lock_waits 表中查看详细信息。
## Durability
ACID 模型的持久性方面涉及与特定硬件配置交互的 MySQL 软件功能。 由于有多种可能性取决于您的 CPU、网络和存储设备的能力因此在这方面提供具体指导方针是最复杂的。
* InnoDB [双写缓冲区](https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html)
* innodb_flush_log_at_trx_commit 变量。
* sync_binlog 变量。
* innodb_file_per_table 变量。
* 还受到操作系统及环境、硬件缓冲、硬件供电、备份策略等影响

View File

@ -0,0 +1,44 @@
# Multi-Versioning 多版本控制
InnoDB 是一个多版本的存储引擎。 它保留有关已更改行的旧版本的信息,以支持并发和回滚等事务功能。
此信息存储在称为回滚段的数据结构中的撤消表空间中。请参阅第 15.6.3.4 节,“[撤消表空间](https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html)”
InnoDB 使用回滚段中的信息来执行事务回滚中所需的撤消操作。
它还使用该信息来构建行的早期版本以实现一致读取。 请参阅第 15.7.2.3 节,“[一致的非锁定读取](https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html)”。
## **在内部InnoDB 向存储在数据库中的每一行添加三个字段**
* 一个 6 字节的 **DB_TRX_ID** 字段指示**插入或更新该行的最后一个事务的事务标识符**。 此外,**删除在内部被视为更新**,其中行中的特殊位被设置为将其标记为已删除。
* 一个 7 字节的 **DB_ROLL_PTR** 字段称为滚动指针。 **回滚指针指向一条写入回滚段的撤销日志记录**。 如果该行已更新,则撤消日志记录包含在更新之前重建该行内容所需的信息。
* 一个 6 字节的 **DB_ROW_ID** 字段包含一个行 ID**该行 ID 在插入新行时单调增加。 如果 InnoDB 自动生成聚簇索引,则该索引包含行 ID 值。 否则DB_ROW_ID 列不会出现在任何索引中。**
## 回滚段
回滚段中的**undo logs**分为**insert undo logs**和**update undo logs**
称为插入撤消日志和更新撤消日志
Insert undo logs只在事务回滚时需要一旦事务提交就可以丢弃。
update undo logs也用于一致性读取但只有在不存在 InnoDB 为其分配快照的事务后才能丢弃它们,在一致读取中可能需要更新撤消日志中的信息来构建早期版本的 数据库行。
建议您定期提交事务,包括仅发出一致读取的事务。 否则InnoDB 无法丢弃更新撤消日志中的数据,回滚段可能会变得太大,填满它所在的撤消表空间。有关管理撤消表空间的信息,请参阅第 15.6.3.4 节,“[撤消表空间](https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html)”。
在 InnoDB 多版本方案中,当您使用 SQL 语句删除行时,它不会立即从数据库中物理删除。 InnoDB在丢弃为删除而写的update undo log记录时只是在物理上删除对应的行及其索引记录。 这种删除操作称为清除,速度非常快,通常与执行删除的 SQL 语句所用的时间顺序相同。
如果您以几乎相同的速率在表中插入和删除行,清除线程可能会开始滞后,并且由于所有“死”行,表会变得越来越大,从而使所有内容都受磁盘限制并且非常 减缓。 在这种情况下,通过调整 innodb_max_purge_lag 系统变量来限制新行操作,并为清除线程分配更多资源。 有关详细信息,请参阅第 15.8.9 节,“清除配置”。
## **MVCC**
多版本和二级索引
InnoDB 多版本并发控制 (MVCC) 以不同于聚集索引的方式对待二级索引。 聚集索引中的记录就地更新它们的隐藏系统列指向undo log条目从中可以重建早期版本的记录。
与聚集索引记录不同,二级索引记录不包含隐藏的系统列,也不会就地更新。
当更新二级索引列时,旧的二级索引记录被删除标记,插入新记录,并最终清除删除标记的记录。 当二级索引记录被删除标记或二级索引页面被更新的事务更新时InnoDB 在聚簇索引中查找数据库记录。 在聚簇索引中,检查记录的 DB_TRX_ID如果记录在读取事务启动后被修改则从撤消日志(undo log)中检索记录的正确版本。

View File

@ -0,0 +1,29 @@
# 聚簇索引和二级索引
[原文链接](https://www.51cto.com/article/687137.html)
主键索引是InnoDB存储引擎默认给我们创建的一套索引结构我们表里的数据也是直接放在主键索引里作为叶子节点的数据页。
但我们在开发的过程中,往往会根据业务需要在不同的字段上建立索引,这些索引就是二级索引,今天我们就给大家讲讲二级所有的原理。
比如你给name字段加了一个索引你插入数据的时候就会重新搞一棵B+树B+树的叶子节点也是数据页但是这个数据页里仅仅放了主键字段和name字段。
叶子节点的数据页的name值跟主键索引一样的都是按照大小排序的。同一个数据页里的name字段值都是大于上一个数据页里的name字段值。
name字段的B+树也会构建多层索引页这个索引页里放的是下一层的页号和最小name字段值。就像这样
![](https://s4.51cto.com/oss/202110/25/68742477e4cfcd81646d9e31f2d42e8a.jpg)
假设你要根据name字段来搜索数据比如select * from user where name=xxx'过程与主键索引一样的。从name索引的根节点开始找一层一层的向下找一直找到叶子节点定位到name字段值对应的主键值。
但此时叶子节点的数据页没有完整所有字段,就需要根据主键到主键索引里去查找,从主键索引的根节点一路找到叶子节点,就可以找到这行数据的所有字段了,这个过程就叫回表。
二级索引可以对多个字段建立联合索引比如name + age + sex
此时联合索引与单个字段的索引原理是一样的只不过叶子节点的数据页里放的是id + name + age + sex然后默认按照name排序name一样就按age排序age一样就按sex排序。
每个name + age +sex的索引页里放的就是下层节点的页号和最小的name + age + sex值。当你用name + age + sex搜索的时候就会走name + age + sex联合索引这棵树再回表查询。
-----