Mysql 索引与事务

1. 索引

1.1 什么是索引 

当我们看一本书时可以通过目录快速的定位到我们想要的章节 ,在数据库中查询数据也需要遍历表,而且数据库是把数据存储在硬盘上的,所以读取数据十分的慢,因此就可以给数据库引入索引,提高查询速度。

1.2 索引的特点

  1. 加快查询速度
  2. 索引自身是一种数据结构,需要占用空间
  3. 当我们对数据进行 增删改 时 ,也要对索引进行更新

1.3 适用场景

  • 储存空间比较充裕
  • 应用场景中查询操作比较多,增加,删除,修改操作比较少

1.4 索引的使用

1.4.1 查看索引 

查看某个表是否有索引,有几个索引

语法:

show index from 表名;

注意:

  • MySQL 中 primary key ,unique,foreign key 都会自动生成索引,这几个操作都会频繁涉及到查询
  • 一个表的索引可以有多个
  • 每个表的索引都是根据某个列来展开的,按照这个列来查询才能提高效率
1.4.2 创建索引 
create indext 索引名 on 表名(列名);

注意:创建索引是一个比较危险的操作,如果这个表中有大量的数据,创建索引时就会引发大量的硬盘 IO 很可能会把数据库卡死,造成大量损失

1.4.3 删除索引 
drop index 索引名 on 表名;

 注意:与创建索引相同,删除索引是一个比较危险的操作,创建索引时,一定要在建表之初就规划好

1.5 B+树

1.5.1 什么是B+树?

B+树是一种自平衡的树形数据结构,它通常用于实现关系数据库中的索引。B+树的名称中的"B"代表"平衡",而"+"意味着它的所有叶子节点都被链接在一起,形成一个有序的链表。B+树的特点包括:

  1. 所有数据都存储在叶子节点上,而非叶子节点只包含索引信息。
  2. 所有叶子节点之间通过指针连接形成一个有序链表,便于范围查询。
  3. 由于所有关键字都出现在叶子节点上,因此每次查找都需要遍历到叶子节点。
  4. B+树的高度通常比较低,使得检索速度非常快。
1.5.2 B+树的结构

B+树由根节点、内部节点和叶子节点组成,其中根节点可以同时是内部节点和叶子节点。每个节点包含多个关键字和指向子节点的指针。

  1. 根节点:

    • 根节点是B+树的起始节点,也可以同时是内部节点和叶子节点。
    • 它包含至少一个关键字和指向子节点的指针。
    • 如果根节点同时也是叶子节点,那么它会包含指向数据的指针。
  2. 内部节点:

    • 内部节点是位于根节点和叶子节点之间的节点。
    • 每个内部节点包含多个关键字和对应的子节点指针。
    • 除了关键字和指针外,内部节点还包含指向其下属子树中最大关键字的指针,这样可以快速定位到需要查询的关键字所在的叶子节点。
  3. 叶子节点:

    • 叶子节点是B+树中存储实际数据的节点。
    • 每个叶子节点包含多个关键字和对应的数据指针。
    • 所有叶子节点通过指针连接成一个有序链表,便于范围查询和区间扫描操作。 
1.5.3 B+树的操作
  1. 插入:从根节点开始,按照关键字的大小逐层向下寻找插入位置,并确保插入后该节点的关键字仍然有序。如果叶子节点满了,则进行节点分裂,同时更新父节点的信息。
  2. 删除:从根节点开始,定位到要删除的关键字所在的叶子节点,并删除之。若删除后节点关键字数量过少,则进行合并操作,同时更新父节点的信息。
1.5.4 B+树在数据库中的应用

在数据库中,B+树主要用于索引的实现。数据库中的表可以根据某一列的数值大小构建B+树索引,从而加速对该列的查询操作。B+树索引的优点在于:

  1. 支持快速的单值查询。
  2. 支持范围查询,因为叶子节点之间通过指针连接成有序链表。
  3. 适用于范围扫描,例如查找某个区间内的数据。

总的来说,B+树作为一种高效的自平衡树结构,在数据库系统中扮演着关键的角色,为快速的数据检索提供了重要的基础支持。

2. 事务

2.1 什么是事务?

事务是一组被认为是单个逻辑工作单元的SQL操作,它们要么全部成功执行,要么全部不执行。事务可以包含一个或多个数据库操作(例如插入、更新、删除等),这些操作要么全部生效,要么全部回滚,以保证数据的一致性和完整性。

例如:转账的时候,银行先在卡里扣钱,然后再把钱转到另一张卡上,这是两个步骤,如果刚把卡里的钱扣了,然后数据库崩了,“把钱转到另一个卡上”这个语句还没执行,事务就是为了避免这类情况。

注意:回滚的原理是依赖日志,当事务执行一半,数据库崩了,前面已经执行的语句会被日志记录下来,然后进行回滚恢复。

2.2 事务的特性

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,没有中间状态。
  • 一致性(Consistency):事务执行前后,数据库从一个一致的状态转变为另一个一致的状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
  • 隔离性(Isolation):并发执行的事务之间应该相互隔离,每个事务都应该感觉不到其他事务的存在,每个事务应该认为它是唯一在运行的事务。
  • 持久性(Durability):一旦事务提交,它对数据库的修改就应该是永久性的,即使系统崩溃也不会丢失。

2.3 事务的隔离级别

 MySQL支持多种事务隔离级别,用于控制并发事务之间的隔离程度。常见的隔离级别包括:

  1. 读未提交(Read Uncommitted):这是最低的隔离级别。在这个级别下,一个事务可以读取另一个事务尚未提交的数据。这意味着可能会出现脏读问题,因为一个事务可能会读取到另一个事务正在进行的修改,导致数据不一致 。

  2. 读已提交(Read Committed):这个级别确保了一个事务只能读取到其他事务已经提交的数据,从而避免了脏读的问题。在这个级别下,当一个事务正在修改数据时,其他事务不能读取到未提交的数据 。

  3. 可重复读(Repeatable Read):这个级别确保在同一个事务内多次读取同一数据时,结果是一致的。它通过在读取某行数据时加锁来实现,这样其他事务无法在此期间修改这一行数据,从而避免了不可重复读和幻读的问题 。

  4. 串行化(Serializable):这是最高的隔离级别。它通过强制事务串行执行来避免任何并发问题,确保了数据的一致性。然而,由于事务必须按顺序执行,这可能会导致性能下降 。

解释:

  • 脏读(Dirty Read):这是事务隔离级别为“读未提交”时可能出现的问题。在一个事务读取数据的过程中,另一个事务也在对这部分数据进行修改,但第一个事务并不知道这一点。如果此时第一个事务读取了这部分数据,那么它读取到的将是尚未提交的、可能是错误的数据。这就是所谓的脏读。

  • 重复读(Non-repeatable Read):这是事务隔离级别为“读已提交”时可能出现的问题。在一个事务多次读取同一行数据的过程中,另一个事务也对这部分数据进行了修改。如果此时第一个事务再次读取这一行数据,那么它将读到与第一次读取时不同的数据。这就是所谓的不可重复读。

  • 幻读(Phantom Read):这是事务隔离级别为“可重复读”时可能出现的问题。在一个事务多次读取表中的数据的过程中,另一个事务插入了新的行。如果此时第一个事务再次读取表中的所有数据,那么它将看到一些原本不存在的行。这就是所谓的幻读。

2.4 事务的使用 

在MySQL中,事务主要用于处理操作量大、复杂读较高的操作,例如插入、删除和更新多条数据。事务主要用来管理insert、delete、update语句。

举例来说,假设现在有一张仓库表,仓库表中记录了每一个物品的数量,还有一张用户表,用户购买产品时,仓库表的产品数量减少,而用户拥有产品的数量增加。但是如果仓库中的产品数量不足时,我们就需要用到事务来处理这种情况。

start transaction;
update 仓库表 set 产品数量 = 产品数量 - 1 where 产品ID = '1';
update 用户表 set 拥有产品数量 = 拥有产品数量 + 1 where 用户ID = '1';
commit;

 在这个例子中,我们首先通过start transaction开始一个事务。然后,我们分别更新仓库表和用户表中的数据。如果两个更新操作都成功执行,那么我们就通过commit提交事务,否则,我们可以通过rollback回滚事务。

这样,我们就可以确保数据的一致性和完整性。如果在执行过程中发生错误或者失败,我们可以回滚到事务开始之前的状态,避免数据的不一致。

你可能感兴趣的:(mysql,数据库)