MySQL索引事务

MySQL索引事务

索引

概念

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

作用

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

索引带来的好处,提高了查找的速度.带来的坏处,占用了更多的空间,拖慢了增删改的速度(这个查找是在内存中完成的,而MySQL中的比较是在硬盘上完成的)

使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

1.查看索引

show index from 表名;

案例:查看学生表已有的索引

show index from student;

在这里插入图片描述

2.创建索引

对于非主键、非唯一约束、非外键的字段,可以创建普通索引(这是个低效的操作,数据非常大的时候会消耗很多时间)

create index 索引名 on 表名(列名);

案例:创建班级表中,name字段的索引

create index name_index on student(name);

在这里插入图片描述

3.删除索引

这也是个低效的操作,数据非常大的时候会消耗很多时间(推荐创建表的时候就创建好)

drop index 索引名 on 表名;

案例:删除班级表中name字段的索引

drop index name_index on student;
索引背后的数据结构

二叉搜索树:查找时间复杂度O(n)(最坏情况下单枝树也就是链表)可是它要求过于苛刻后续的增删改太耗时间了

红黑树: 虽然要求宽松点平衡二叉树,但是二叉树主要的问题是元素多了,树的高度就高了.比较次数就多了(每次比较都是磁盘IO,耗时大)

哈希表: 虽然查找时间复杂度O(1),但是哈希表只能对"相等"进行判断,不能对"大于小于"以及范围进行查找(不合适)

堆: 只能找到最大值或者最小值(不适合)

多叉搜索树(n搜索叉树):在数据库索引中最常见的数据结构是B+树 (B树最大的意义就是减少了磁盘IO的次数(依次读取多个数在内存中比较))

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

事务

事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。(原子性)

SQL中,有的复杂的任务需要多个SQL来执行.在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。有的时候,也同样需要打包在一起,前一个SQL是为了给后一个SQL.提供支持.如果后一个SQL不执行了或者执行出问题了,前一个SQL也就失去意义了.

事务的应用场景

典型的就是转账

事务是如何实现保证上述机制的: 核心就是回滚.(回滚的依据就是MySQL要记录之前执行的一些过程)

使用
--(1)开启事务:start transaction;
--(2)执行多条SQL语句
--(3)回滚或提交:rollback/commit;
-- 说明:rollback即是全部失败,commit即是全部成功。

start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;
事务的基本特性

四个基本特性:

  1. 原子性:要么全都执行完,要么一个都不执行.任务不可以被再细分了.

  2. 一致性: 在事务执行之前,和执行之后,数据库中的数据都得是合理合法的数值

  3. 持久性: 事务一旦提交了之后,数据就持久化的存储起来了(数据就写入硬盘了)

  4. 隔离性: 隔离性描述的是,事务并发执行的时候产生的情况!!!(并发执行就像大家一起线上填写一张表格,有人不小心填写了你的那一栏表格的数据)

    脏读问题:就是某个进程没有读取之前进程最终的数据,而是其中临时的值去操作(写的时候不能读)

    不可重复读问题: 读的时候不能写.

在这里插入图片描述

总之: 提高隔离性就会降低并发效率,它们是互斥的

幻读问题: 彻底串行化执行(隔离性最高,并发性最低,数据最可靠,速度最慢)

在这里插入图片描述

MySQL中事务的隔离级别
  1. read uncommitted:允许读取未提交的数据.并发程度最高,隔离程度最低会引入脏读+不可重复读+幻读问题~~

  2. read committed:只允许读取提交之后的数据相当于写加锁.并发程度降低了- -些,隔离程度提高了- -些解决了脏读,会引入不可重复读+幻读.

  3. repeatable read:相当于给读和写都加锁.并发程度又降低了.隔离程度又提高了.解决了脏读和不可重复度,会引入幻读.

  4. serializable:串行化.并发程度最低(串行执行),隔离程度最高.解决了脏读,不可重复度,幻读问题,但是执行速度最慢~

可以通过修改my.ini这个配置文件,来设置当前的隔离级别.根据实际需求场景,来决定使用那种隔离级别.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值