MySQL---索引+事务

news2025/1/12 23:16:35

文章目录

  • 索引
    • 什么是索引?
    • 索引的作用
    • 索引的使用
    • 索引背后的数据结构(B+树)
  • 事务
    • 什么是事务?
    • 事务的使用
    • 事务的ACID特性
      • 原子性(Atomicity)
      • 一致性(Consistency)
      • 隔离性(Isolation)
      • 持久性(Durability)
    • 事务之间的相互影响
      • 脏读
      • 不可重复读
      • 幻读
      • 丢失更新
    • 事务隔离级别

索引

什么是索引?

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

在这里插入图片描述

注:

  1. 数据表里的数据是以文件的形式保存在硬盘上,实现持久化存储的。
  2. 保存索引的文件和保存数据表的文件是同一个文件。如果没有索引,则在数据表中查找;如果有索引,则在索引结构中查找。索引的每一块儿都会对应数据表的一条记录。
  3. 创建主键约束(Primary key)、唯一约束(Unique)、外键约束(Foreign key)时,会自动创建对应列的索引。

索引的作用

索引是一个典型的以空间换时间的做法,它最大的作用就是提高查询效率。

注:

  1. 索引会提高查询的效率,但是会降低增加、修改、删除的效率。因为在增加、修改、删除时不只需要更新表内的数据,还需要更新索引。
  2. 当数据量较少时,不建议使用索引。因为所有会占据一定的磁盘空间。

索引的使用

  • 查看索引
show index from 表名;
show index from student;

在这里插入图片描述

  • 创建索引
//可以给非主键、非外键、非唯一约束的字段  创建普通索引
create index 索引名 on 表名(列名....
create index idx_classes_name on classes(name);
  • 删除索引
drop index 索引名 on 表名;
drop index idx_classes_name on classes;

索引背后的数据结构(B+树)

回想一下我们学过的数据结构,哪些能够提高查询效率呢? 适不适合做索引呢?

哈希表:查询操作的时间复杂度是O(1).但是不适合做索引,因为它只能查询值相同的情况,不能进行范围查询。

二叉树/二叉搜索树:查询的时间复杂度是log(N)。但是也不适合做索引,因为我们都是在数据量很大的情况下创建索引,数据量大时存储到二叉树中,树的高度就会比较高,在查询时需要节点之间进行比较,比较需要在内存中进行。如果比较的次数太多就会消耗大量的内存资源,所以不适合。

因此,程序员专门为索引创建了一个数据结构:B+树。它是B树的加强版。

  • 认识B树

在这里插入图片描述

注:

  1. B树是一个N叉搜索树,每一个节点上值的个数 <=N-1
  2. 分为N叉树可以有效的降低树的高度
  • B+树

在这里插入图片描述

注:

  1. B树:有N-1个值分成N个区间;B+树:有N个值分成N个区间。
  2. B树:值不会重复出现;B+树:值可能重复出现。
  3. B+树:在叶子节点层,会以链表的形式把所有的叶子节点连接起来。前面非叶子节点的值都会在叶子节点里体现出来,得到全集数据,非常便于范围查找。
  4. 因为叶子节点层会保存所有的数据,所以非叶子节点只需要保存索引列就行。占用空间非常小可以在内存中缓存,加快查询效率。并且减少了硬盘IO。

事务

什么是事务?

事务指:逻辑上的一组操作,组成这组操作的各个单元。要不全部执行成功,要不全部执行失败。

事务的使用

start transaction;
   事务的一组操作......
commit/rollback;

注:

  1. 通过start transaction 来开启事务,把一组操作放进去
  2. 这组操作全部执行成功,则commit(提交),真正改变数据库中的值。
  3. 这组操作任意一个执行失败,则rollback(回滚),把数据库的值变为未执行这个事务之前的状态,不把执行到一半的数据写入数据库。

事务的ACID特性

原子性(Atomicity)

在以前原子被认为是不可分割的最小单元,在计算机中就沿用了这个观点。所以事务的原子性是指:组成事务的一组操作不可分割,这些操作要不全部执行,要不全部都不执行

比如:
A给B转账100元钱的时候,当只执行了扣款语句时,此时突然断电导致转账语句没有被执行到。如果事务不是原子性的,A账号已经发生了扣款,B账号却没有收到加款,在生活中就会引起纠纷。这种情况就需要事务的原子性来保证事务要么执行,要么就不执行。

注: 当这些操作全部执行成功时,事务提交;如果有一个操作执行失败了,则事务回滚。

一致性(Consistency)

事务执行前后,数据处在一致的状态,就是一致性。即数据经过计算后数据的总量不变。

比如,转账事务,不管事务成功还是失败,应该保证事务结束后,表中A和B的存款总额跟事务执行前一致

注:

  1. 事务执行前,数据库存储的数据处于一致的状态
  2. 事务执行时,数据库存储的数据可能处于不一致的状态
  3. 事务执行后,不管执行成功还是执行失败,数据库存储的数据都必须处于一致的状态

隔离性(Isolation)

当不同的事务并发执行的时候,如果有一个事务正在使用一个数据,而另一个事务则不能使用同一个事物,这就是隔离性。要保证事务的”隔离“,得让这些需要使用同一个数据的事务串行执行。

持久性(Durability)

在事务完成后,该事务对数据库的修改得持久的保存,不能随着程序的重启、电脑的重启而改变,这就是持久性

事务之间的相互影响

脏读

脏读指:读脏数据,脏数据就是一个临时的数据,不代表最终的结果。

比如:事务A在修改数据,修改到一半了得到一个中间数据a,但是最终的数据是b。但是事务B在事务A执行到一半时读取到了中间数据a,然后进行后续操作,那么事务B的后续操作也都是错误的。

解决:
对写操作加锁(写操作就包含了修改操作)。即当事务A执行时就把数据锁到小黑屋里,不让其他人拿到,执行完再放出来。

不可重复读

不可重复读指:一个事务内两次相同的查询却得到了不同的数据

比如:事务A先获取到数据a,进行循环判断,满足条件则可以执行后续操作,但是中途事务B获取到数据a修改为b,此时事务A可能还没执行完后续的操作就被迫退出循环。

解决
对读操作加锁。即当事务A获取到数据就把数据锁到小黑屋,不让其他人拿到,知道事务A执行完再放出来。

幻读

幻读指:两次读取数据时对应的结果集不同

比如:在一张表中有a、b、c三个数据。事务A获取了a数据,此时表中的数据是a、b、c;但是同时事务B把表中的b数据修改为了B,当事务A再次获取a数据时,此时表中的数据是a、B、c;

解决:
串行化。即不能让事务A和事务B同时执行。

丢失更新

丢失更新指:两次修改同一个数据时,第二次修改会忽略第一次已经修改过,把第二次修改后的值当作是最终的结果。

比如:a=1 事务A读取到a=1 并且a+1=2,同时事务B读取到a=1,并且a+1=2,最终将a的值修改为2,而不是3.

解决:
同时加读锁和写锁。规则:在一个事务加了写锁后,别的事务既不能进行写操作也不能进行读操作。

事务隔离级别

在这里插入图片描述

read uncommited: 允许读未提交的数据。并发程度最高,隔离性最低。可能存在脏读、不可重复读、幻读的问题。

read commited: 只能读 提交之后的数据,相当于写加锁。并发程度降低,隔离性提高。解决了脏读问题,可能存在不可重复读、幻读的问题。

repeatable read: 相当于读和写都加锁。并发程度再降低,隔离性再提高。解决了脏读、不可重复读的问题,可能存在幻读的问题。

serializable: 严格执行串行化。并发程度最低,隔离性最高。解决了脏读、不可重复读、幻读的问题

注:MySQL默认的隔离级别是 repeatable read

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CMN】Power management

CMN-700包括几种电源管理能力&#xff0c;要么由外部控制&#xff0c;要么由SoC辅助。CMN-700具有以下电源管理功能&#xff1a; &#xff08;1&#xff09;几个不同的预定义电源状态。这些状态包括SLC Tag和Data ram的all/half/none能否被powered up, powered down, or in re…

SpringBoot2.7.14整合redis7

需要的依赖库&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</gro…

kubernetes(4)

目录 flannel网络插件 calico网络插件 部署 网络策略 限制pod流量 限制namespace流量 同时限制namespace和pod 限制集群外部流量 k8s存储 configmap 字面值创建 通过文件创建 通过目录创建 通过yaml文件创建 使用configmap设置环境变量 使用conigmap设置命令行参数 通过数据卷使…

android10.0(Q) MTK 6765 user版本打开root权限

前言 相比较 Android8.1、9.0 而言&#xff0c;Android10.0 版本 的 root变得相当麻烦&#xff0c;10.0 中引入了动态分区机制&#xff0c;同样的要想完全 adb root&#xff0c;需要 fastboot 解锁&#xff0c;然后关闭 verity 才能 adb remount 成功。我尝试和之前一样修改 f…

10.26数字钟设计,数电第二次实验总结

实验七 数字钟设计&#xff08;*****&#xff09; 实现一个六十进制数字时钟&#xff0c;秒到 60 则归零重加&#xff0c;同时让分加1&#xff0c;分加到60归零重加&#xff0c;并让小时加 1&#xff0c;小时加到24归零重加。要求用数码管1,0显示秒值&#xff0c;数码管3,2显示…

解决MyBatisPlus自动生成的主键值过长的问题?

解决MyBatisPlus自动生成的主键值过长的问题&#xff1f; 执行alter table 你的表名 auto_increment 你想要自增开始的值&#xff1b; 如下图&#xff1a; 看一下数据库插入代码&#xff0c;如下图&#xff1a; 最后连续插入两次&#xff0c;看下数据库表插入的实际值&…

OpenCV学习(一)——图像读取

1. 图像入门 读取图像显示图像写入图像 import cv2# 读取图像 img cv2.imread(lena.jpg) print(img.shape)# 显示图像 cv2.imshow(image, img) cv2.waitKey(0) cv2.destroyAllWindows()# 写入图像 cv2.imwrite(image.jpg, img)1.1 读取图像 读取图像cv.imread(filename, fl…

程序员们平时都喜欢逛什么论坛呢?

网站不在多&#xff0c;好用就行&#xff1b;技术不求精&#xff0c;好摸鱼就行。是时候祭出我收藏夹里的这15个网站了&#xff01; 求职必备&#xff1a;牛客网 https://www.nowcoder.com/ 年少不知牛客好&#xff0c;等到要面试的时候才发现是神器。 你可以在牛客上搜索到一…

C++内存管理:其七、标准库中的allocator

首先明确一点&#xff0c;绝大多数情况下&#xff0c;是标准库中的容器使用allocator。因为容器需要频繁的申请和释放内存。 一、容器使用allocator 典型的例子&#xff1a; vector<int , allocator<int>> a;但是为什么我们通常的定义vector变量的方法是&#x…

OpenCV学习(二)——OpenCV中绘图功能

2. OpenCV中绘图功能2.1 画线2.2 画矩形2.3 画圆2.4 画多边形2.5 添加文本 2. OpenCV中绘图功能 绘图可以实现画线、画矩形、画圆、画多边形和添加文本等操作。 import cv2 import numpy as np# 读取图像 img cv2.imread(lena.jpg)# 画直线 cv2.line(img, (0, 0), (512, 512…

【Javascript】函数声明的方式

方式一&#xff1a; function c(a,b){return ab;}var sumc(3,4);console.log(sum); 方式二&#xff1a; var afunction (a,b){return ab;}; console.log(a(1,3)); 方式三&#xff1a; 构造声明 var cnew Function (a,b,return ab); console.log(c(1,2));声明函数过程中&…

【机器学习合集】人脸表情分类任务Pytorch实现TensorBoardX的使用 ->(个人学习记录笔记)

人脸表情分类任务 注意&#xff1a;整个项目来自阿里云天池&#xff0c;下面是开发人员的联系方式&#xff0c;本人仅作为学习记录&#xff01;&#xff01;&#xff01;该文章原因&#xff0c;学习该项目&#xff0c;完善注释内容&#xff0c;针对新版本的Pytorch进行部分代码…

王道p40 1.设计一个递归算法,删除不带头结点的单链表L中的所有值为x的结点(c语言代码实现)图解递归

视频讲解(献丑了)&#xff1a;p40 第1题 王道数据结构课后代码题c语言代码实现_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Xa4y1Q7ui/?spm_id_from333.999.0.0 首先它是一个不带头结点的单链表 我们就得特殊处理 我们先让*LNULL&#xff1b; 然后为s开辟一个新…

vue3-admin-element框架登录如何修改?

1、找到vite.config.js文件 配置反向代理 2、找到src文件下的user.js文件 3、找到views文件下的login文件 打开找到comp文件夹找到LoginFrom.vue页面进去 把这个改成自己的账户数据&#xff08;密码不一致自行更改&#xff09; 4、找到store文件下的modules下的user.js 5、找到…

Java工具库——FastJson的40个常用方法

那些想看却没看的书&#xff0c;在心里摆满一个图书馆… 工具库介绍 阿里巴巴的 FastJSON&#xff0c;也被称为 Alibaba FastJSON 或阿里巴巴 JSON&#xff0c;是一个高性能的 Java JSON 处理库&#xff0c;用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性…

企业电脑监控软件三大盘点

信息技术的不断发展&#xff0c;企业对于员工电脑监控的需求越来越强烈。监控员工电脑可以有效地提高工作效率&#xff0c;防止员工泄露公司机密&#xff0c;同时也可以保护公司的信息安全。 其中给大家推荐三款实用的企业电脑监控软件&#xff1a; 一、域之盾软件 该软件可实…

VS2015 搭建wxWidgets-3.2.3测试环境及运行samples

此方法免去繁琐的环境配置,直接运行及写自己的代码。 1:我们到wxWidgets的官网下载 Release wxWidgets 3.2.3 wxWidgets/wxWidgets GitHub 下载完成后如下: 2:解压上面下载的wxWidgets-3.2.3.zip 解压后如下: 之后到如下目录,运行wx_vc14.sln 3:生成结果 D:\camer…

2023年以就业为目的学习Java还有必要吗?

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

操作系统【OS】调度算法对比图

FCFS SJF 高响应比 时间片轮转 多级反馈队列 可抢占&#xff1f; √ √ √ 队列内算法不一定 不可抢占&#xff1f; √ √ √ 队列内算法不一定 特点&优点 公平实现简单有利于长作业不利于短作业有利于CPU繁忙作业不利于IO繁忙作业 因为CPU繁忙型进程即…

Kafka入门05——基础知识

目录 副本数据同步原理 HW和LEO的更新流程 第一种情况 第二种情况 数据丢失的情况 解决方案 Leader副本的选举过程 日志清除策略和压缩策略 日志清除策略 日志压缩策略 Kafka存储手段 零拷贝&#xff08;Zero-Copy&#xff09; 页缓存&#xff08;Page Cache&…