MySQL索引和事务

索引和事务

  • 1. 索引
    • 1.1 概念
    • 1.2 作用
    • 1.3 使用
    • 1.4 索引的存储方式
  • 2. 事务
    • 2.1 概念
    • 2.2 使用
    • 2.3 事务的基本特性
    • 2.4 事务的隔离级别

1. 索引

1.1 概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,
并指定索引的类型,各类索引有各自的数据结构实现.

1.2 作用

  1. 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系.
  2. 索引所起的作用类似书籍目录,可用于快速定位、检索数据.
  3. 索引对于提高数据库的性能有很大的帮助

但是索引会消耗空间,所以适用于查询较多的程序中,反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引.

1.3 使用

当我们创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建
对应列的索引。例如 :
在这里插入图片描述

但是其他情况下就需要手动创建索引.
语法:

create index 索引名 on 表名(字段名);

例如 :
在这里插入图片描述
删除的语法类似

drop index 索引名 on 表名;

在这里插入图片描述
注意 : 只能删除手动创建的索引, 删除自动创建的索引会报错.
在这里插入图片描述

1.4 索引的存储方式

索引保存的数据结构主要为B+树,这是在B 树的基础上专门为数据库设计的一种数据结构,其结构和二叉搜索树类似但是B+树的每个节点都可以存储多个数据.
MySQL索引和事务_第1张图片
B+树的特点:

  1. B+树也是N叉搜索树,但是N个key分出了N个区间,其节点上最后一个key就是最大值了.
  2. 父节点的key会在子节点中出现,并且是最大值,这样叶子节点就可以包含这个数据集.
  3. 把叶子节点按照链表的方式首尾相连,此时就可以通过叶子节点之间的这个连接快速的找到"下一个", “上一个” 元素, 进一步方便了"范围查询".

B+树的优势

  1. 适用于范围查询.
  2. 所有的查询操作,都会执行到叶子节点,所以比较次数是均衡的, 查询时间比较稳定.
  3. 由于叶子节点上是完整的数据集, 所以表的每一行数据的其他列都可以保存到叶子节点上, 所以非叶子节点只存储构建索引的key就可以了.因此非叶子节点占用的存储空间比较小, 可以在内存中缓存一份,进行数据查询的时候就可以通过内存直接比较减少了硬盘io次数,提高了效率.

2. 事务

2.1 概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

2.2 使用

  1. 开启事务:start transaction;
  2. 执行多条SQL语句
  3. 回滚或提交:rollback/commit;

2.3 事务的基本特性

  1. 原子性: 保证多个操作被打包成一个整体, 要么全部执行正确, 要么一个不执行.
  2. 一致性: 事务执行之前和事务执行之后, 数据能对上.
  3. 持久性: 事务执行的各种操作都是持久生效的(写入到硬盘上).
  4. 隔离性: 并发执行事务的时候隔离性会在执行效率和数据可靠之间做出权衡.
    "隔离"描述的是同时执行的事务之间, 相互影响
    隔离性越高并发性越低数据越可靠性能越低.

2.4 事务的隔离级别

在并发执行的事务过程中,可能产生以下问题:

  1. 脏读: 读到了写事务提交前的中间数据(脏数据).
  2. 不可重复读: 一个事务内, 多次读取同一个事务发现数据不一样.
  3. 一个事务之内,多次读取到的数据值相同,但是结果集不同,

针对以上可能发生的问题MySQL提供了四种事务的隔离级别

  1. read uncommitted 允许读未提交的数据.(隔离性低, 并发性高,数据可靠性低,效率高)
  2. read committed 允许读已经提交的数据.(给写加锁,解决了脏读).
  3. repeatable read 可重复读取数据(给写和读都加锁,解决了脏读和不能重复读)
  4. serializable 事务彻底串行执行, 解决了以上问题但是效率大大降低
    尽管MySQL提供了这四种隔离级别,但是大部分情况下使用默认的就可以

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