基础篇


事务

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);

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值。


文章作者: 冯廷鑫
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冯廷鑫 !
  目录