Mysql索引事务

目录

一、索引

1、索引

2、使用

3、分类

(1)B和B+ Tree

(2)聚簇索引和非聚簇索引

(3)最左匹配原则

二、事务

1、事务的特性(ACID)

2、使用

3、并发一致性问题

(1)丢失更新

(2)脏读

(3)不可重复读

(4)幻影读

 4、隔离级别


一、索引

1、索引

使用一定的数据结构,来保存索引字段(一列或多列)对应的数据,根据索引字段来检索(是否能够命中索引,是sql性能优化的关键),可以提高检索效率。

2、使用

创建主键约束、外键约束、唯一约束时,会自动创建对应列的索引。

  • 创建索引

对于主键、外键、唯一约束之外的字段,可以创建普通索引

create index 索引名 on 表名(字段名);
  • 删除索引
drop index 索引名 on 表名;

【注】创建索引时,需要保存其对应的数据(可能要花费大量的时间)。在更新/删除索引字段,以及插入数据时,都涉及到索引的更新。

3、分类

数据库保存数据的基本单位:page(数据的一行或多行)

目的:硬盘读取文件到内存的IO操作也是要耗时的,读取数据最好能最少次读取到需要的结果集。

MySql中,有多种索引分类:

  • 从索引存储结构划分:B Tree索引、Hash索引、R Tree索引、FULLTEXT全文索引
  • 从应用层次划分:普通索引、唯一索引、主键索引、复合索引
  • 从索引键值类型划分:主键索引、辅助索引(二级索引)
  • 从数据存储和索引键值逻辑关系划分:聚簇索引、非聚簇索引

(1)B和B+ Tree

 区别:

  • 数据存储的不同:B+树保存在叶子节点中,B树保存在所有的节点中。体现出B+树的优势:节点不存储打他,这样一个节点就能存储更多的key,使得树更矮,所以IO操作次数更少;查询性能稳定:每次查询都是从根节点到叶子节点,查寻路径长度相同,即每次查询效率相当。
  • 叶子结点的指向:B+树相邻的叶子节点通过指针相连,B树没有。体现出B+树的优势:所有叶子节点形成有序链表,便于范围查找。

(2)聚簇索引和非聚簇索引

  • 主键索引(聚簇索引):默认是B+树(一张表只能有一个主键索引)

B+树的叶子节点上,存放的是主键以及整条数据。

优点:速度快

缺点:主键主要是整型,且字段长度不能太大 ,更新代价大(效率低)

  • 非聚簇索引(辅助索引):非主键约束都是。可以使用很多种类型的数据结构,如B+树、Hash索引等。

假如使用B+树:叶子节点存储的内容为(索引字段+主键值)。

此时搜索数据的方式为:

通过索引字段找到其相应的主键;再通过主键找到其所有数据(回表操作)(因为存在回表操作,意味着效率比主键操作低得多)

优点:更新代价相比聚簇索引小得多(叶子节点是索引值和主键值,没有实际数据)

缺点:也依赖有序数据;可能产生回表操作效率低。

  • 覆盖索引:索引字段包含所有需要查询的字段。覆盖操作为非聚簇索引,此时不会产生回表操作。

特殊的一些操作,不会走索引:比如(is null和is not null)

(3)最左匹配原则

最左优先,联合索引中以最左边的索引为起点,任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)立即停止。

二、事务

1、事务的特性(ACID)

  • 原子性:事务是最小的执行单位,不允许分割。事务的原子性保证动作要么全部完成,要么完全不起作用;
  • 一致性:执行事务前后,数据保持一致,例如转账业务,无论事务是否成功,转账者和收款人的总额保持不变;
  • 隔离性:并发访问数据库时,一个用户的事务不被其他的事务干扰,各并发事务之间数据库是独立的;
  • 持久性:一个事务被提交后对数据库的改变是永久的。即使数据库发生故障也不能对其产生影响。

2、使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
【注】rollback表示提交失败,commit表示提交成功

3、并发一致性问题

解决这些问题,使用隔离级别。

(1)丢失更新

 T1和T2都提交,此时T1获取到的A的值为T2修改后A的值

(2)脏读

第一个事务修改了数据但是没有提交,在第二个事务读取了数据后,第一个事务发生了回滚,此时第二个事务读取到的数据就是脏数据。

(3)不可重复读

一个事务两次数据读取,在进行一次读取后,另一个事务对数据进行了修改,此时两次读取到的数据不相同。

(4)幻影读

一个事务两次读取,中间另一个事务进行了插入操作,导致两次读取到的数据不相同。

 4、隔离级别

  • 未提交读:事务中的修改,即使没有提交,对于其它事务也是可见的;
  • 提交读:一个事务所做的修改再未进行提交前,对于其他事务是不可见的;
  • 可重复读:保证同一事务多次读取同一个数据的结果是相同的;
  • 可串行化:强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。该隔离级别需要加锁实现。要使用加锁机制保证同一时间只有一个事务执行,保证事务串行执行。

对于隔离级别,级别越高,安全性越高,对应的性能就越差。masql默认的隔离级别为可重复读。

猜你喜欢

转载自blog.csdn.net/weixin_54342360/article/details/124379382