【数据库】 | MySQL索引与事务

🎗️ 主页:小夜时雨
🎗️ 专栏:MySQL数据库
🎗️ 如何优雅的活着,是我找寻的方向
优雅

1、索引

1.1 概念

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

1.2 作用

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

1.3 B+树

B+树是为了数据库的索引,量身定做的数据结构
我们先来简单了解一下B树,可以看作是一个N叉搜索树
在这里插入图片描述
B+树是在B树的基础又做出了改变,也是N叉搜索树,如下图所示:
在这里插入图片描述
B+树的特点:

  1. 一个节点,可以存储N个key,N个key划分出了N个区间(注意不是N + 1 个区间)
  2. 每个节点中的key的值,都会在子节点中也存在(同时该key是子节点的最大值)
  3. B+ 树的叶子节点是首尾相连的,类似于一个链表
  4. 只在叶子节点处存储数据表的每一个数据,非叶子节点只存储key值本身

B+树的优势:

  1. 减少了树的高度,查询的时候就减少了访问硬盘的次数
  2. 所有的查询都会落在叶子节点,意味着稳定(查询任何一个数据,访问硬盘的次数是一样的)
  3. B+树的所有的叶子节点构成链表结构,更加方便进行范围查询
  4. 非叶子节点只保存key值本身,占用的空间就很小,非叶子节点就有可能在内存中缓存,进一步减少了IO的访问次数(在此指硬盘的访问次数)

2、事务

2.1 概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
事务的本质就是把多个sql语句打包成一个整体,要么全部执行成功,要么就是最后状态保持原样(会有回滚的操作:即是恢复数据),而不会出现执行一半的中间状态。

2.2 使用

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

2.3 事务的四大特性ACID

1.原子性:事务的最核心特性,将多个sql语句打包成一个整体来执行
2. 一致性:具体来说就是事务执行前后,数据是正确靠谱的
3. 持久性 :事务修改的内容是写道硬盘上的,持久存在的
4. 隔离性 :为了解决“并发” 执行事务引起的问题,存在的意义就是为了在数据库并发处理事物的时候不会有问题

2.4 并发执行事务可能产生的问题

1. 脏读问题
即是一个事务A正在对数据进行修改的过程中,还没提交之前,另外一个事务B,也对同一个数据进行了读取,此时B的读操作就被称作是"脏读",读到的数据也就是"脏数据"(也就是无效数据)。
解决方案: MySQL引入了"写操作加锁"的机制,也即是事务A修改数据的期间,B不能进行读取操作,“写操作” 和 “读操作” 不能并发了,
此操作降低了并发程度(降低了效率),提高了隔离性(提高了数据的准确性)。

2. 不可重复读
事务1已经提交了数据,此时事务2开始去读取数据。在读取过程中,事务3又提交了新的数据,此时意味着同一事务2之内,多次读取事务,读出来的结果是不相同的(预期是一个事务多次读取的结果应该是一样的,就叫做"不可重复读"。
解决方案: 进行读加锁操作,相当于约定读的过程中,不能进行修改。通过这个读加锁,又进一步降低了事务的并发处理能力(处理效率也降低了),提高了事务的隔离性(数据的准确性)。

2. 幻读
同一个事务中,多次查询返回的结果集不一样。例如
有一个事务查询了几列数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。这就是幻读。
解决方案: 如果要避免幻读,就得进一步提高隔离性,即“串行化”,完全的没有并行,只有串行. 安全级别最高, 解决了脏读,不可重复读,幻读的问题,同时也是处理效率最低的。

🎗️🎗️🎗️ 好啦,到这里有关索引与事务的分享就结束了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,蟹蟹大家了,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值