事务
MyISAM不支持事务;InnoDB支持事务.
介绍一下事务的AICD特性:(Atomicity、Consistency、Isolation、Durability)
A(Atomicity):原子性,就是说在一个事务内是一个不可分割的操作单元,要么全部执行成功,要么全部失败回滚。这保证了数据的一致性和完整性。
C(Consistency):一致性,事务执行前后,数据库的状态必须保持一致。事务的操作应满足预定义的约束和规则,不会破坏数据的完整性。在分布式系统中,可以理解为多个节点中数据的值是一致的。
I(Isolation):隔离性,并发执行的事务之间要相互隔离,互不干扰。每个事务都应该感觉不到其他事务的存在,避免数据冲突和干扰。
D(Durability):持久性,一旦事务提交成功,对数据库的修改就是永久性的,即使系统发生故障或重启,修改的数据也能恢复。
隔离性
事务的隔离级别:
| 隔离级别 | 介绍 |
|---|---|
| 读未提交(read uncommitted) | 一个事务还没提交时,它做的变更就能被别的事务看到。 |
| 读提交(read committed) | 一个事务提交之后,它做的变更才会被其他事务看到。 |
| 可重复读(repeatable read) | Innodb的默认隔离级别 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 |
| 串行化(serializable ) | 顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 |
举例:
mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);

| 隔离级别 | V1、V2、V3的结果 |
|---|---|
| 读未提交(read uncommitted) | V1=2;V2=2;V3=2 |
| 读提交(read committed) | V1=1;V2=2;V3=2 |
| 可重复读(repeatable read) | V1=1;V2=1;V3=2 |
| 串行化(serializable ) | V1=1;V2=1;V3=2 |
隔离级别为可重复读的实现方式:多版本并发控制-MVCC
InnoDB通过为每一行记录添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。但是InnoDB并不存储这些事件发生时的实际时间,相反它只存储这些事件发生时的系统版本号(LSN)。这是一个随着事务的创建而不断增长的数字。每个事务在事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。
索引
索引的常见模型
| 模型 | 简介 |
|---|---|
| 哈希表 | 以键 - 值(key-value)存储数据的结构;不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是拉出一个链表。(hashMap的处理方案) |
| 有序数组 | 有序数组在等值查询和范围查询场景中的性能就都非常优秀,只适用于静态存储引擎. |
| 搜索树 | 二叉搜索树的特点是:每个节点的左儿子小于父节点,父节点又小于右儿子。这样如果你要查 ID_card_n2 的话,按照图中的搜索顺序就是按照 UserA -> UserC -> UserF -> User2 这个路径得到。这个时间复杂度是 O(log(N))。树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。已InnoDB的一个整数字段索引为例,这个N差不多是1200,这棵树高是4的时候,就可以存1200的3次方个值,这已经是17亿了。 |
InnoDB的索引使用B+树
根据叶子节点的内容,索引类型分为主键索引和非主键索引。
主键索引(聚簇索引):叶子节点存的是整行数据
非主键索引(二级索引):叶子节点存储的是主键的值。所以当使用二级索引时,可能会有回表动作.
索引维护
插入新值:如果插入的值所在的数据页已经满了,则会新申请一个数据页,将部分数据挪过去。这个过程称之为页分裂。
有分裂就会有合并。在删除数据的时候。
问题
Q:“N叉树”的N值在MySQL中是可以被人工调整的么?
A:在MySQL中,N值在B-tree实现中是固定的,不能由用户手动调整。用户只能在创建索引时指定索引的类型和索引的列,而不能直接指定B-tree的N值。