MySQL索引事务

news2025/1/4 18:56:57

1.索引

1.1概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结果实现。(这里只用通俗的语言和图片进行介绍)

1.2作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。

  • 索引所引起的作用类似书架目录,可用于快速定位、检索数据。

  • 索引对于提高数据库的性能有很大的帮助。

1.3使用场景

要考虑数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。

  • 该数据库表的插入操作,以及对这些列的修改频率比较低。

  • 索引会占用额外的磁盘空间。

满足以上条件时,考虑对表中的这些字段创建索引,以及提高效率。

反之,如果非条件查询列,或经常做插入、修改操作,或者磁盘空间不足时,不考虑创建索引。

1.4使用

创建主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时,会自动创建对应列的索引。

  • 查看索引

show index from table_name;

【案例】

查看学生表已有的索引

  • 创建索引

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

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

【案例】

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

  • 删除索引

drop index 索引名 on 表名;

【案例】

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

【注意】我们目前使用on的情况,只用jion ... on, drop index ... on,create index ... on

1.5案例

准备测试表:

创建、展示、删除索引:

1.6索引背后的数据结构(常见面试题)

索引时通过B+树的数据结构来实现数据的查找的。

1.6.1 B树(B-树)

我们先了解B-树,也叫做B树。

【注意】“-"读作杠,不是减。

【解析】

  1. B树是一个度为N的树

  1. 在关键值key左边的节点都比key小,在关键字key右边的节点都比key大

  1. 树的高度越高,进行查询比较的时候,访问磁盘的次数越多,速度越慢。

  1. 无法进行模糊匹配和范围查询(很复杂,需要来回找)

B+树就是在此基础上,进行改进的!

1.6.2 B+树

B+树也叫N叉搜索树。

解析】

  1. 每个节点的最右边即为这颗子树的最大值

  1. 每个节点中,最大值都会重复出现;

  1. 叶子节点会首尾相连;

【优势】

  1. 能进行范围查询和模糊匹配(每个key都会在叶子节点出现,不用来回查找);

  1. 占用内存小:只有叶子节点才会储存完整的信息,非叶子节点只会存储key值,我们可以将索引直接放到内存中也不会占用很大的空间。这样做大大减少了访问硬盘的次数,提高了查找的效率。

所占内存大小估计:假设每个key值占4个字节,总共有10亿条数据,所占内存3.73G,是非常小的。

3.查找次数稳定:每个数据的完整信息都是在叶子节点,查找的次数都是相同的。不会出现个别数据查找的特别慢。

2.事务(常见面试题)

2.1为什么使用事务

-- 使用事物的原因
update account set money = money - 2000 
where name = '顾客';
update account set money = money + 2000
where name = '商家';

比如上述是一个转账过程。在执行完第一条命令的时候,如果服务器突然宕机,就会出现钱扣了,但是商家没有收到钱的情况。

【解决方案】使用事物来控制,保证两条语句是完全执行的,要么完全失败。

2.2事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么成功,要么失败

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

2.3使用

-- 使用事务
start transaction;
update account set money = money - 2000 
where name = '顾客';
update account set money = money + 2000
where name = '商家';
commit;
  1. 开始事务:start transaction;

  1. 执行多条SQL语句;

  1. 回滚或者提交:rollback/commit

2.4事务的四大特性(重点)

  1. 原子性[核心的特征]

事务具有原子性,即不可分割性。要么完全执行,要么不执行,不会出现只执行一般宕机的情况。如果服务器在执行事务过程中突然停电,那么在来电的时候,会进行回滚,恢复到原来的数据状态。

  1. 一致性

执行事务前后数据是可靠的。例如上述转账的事务,如果事务成功,商家会收到钱,顾客会减少余额。不会出现其他的情况。如果事务失败,顾客的钱不会减少,商家的钱不会增多。同样不会出现其他情况。

  1. 持久性

事务修改的内容是写到了硬盘上的,持久存在的。宕机、重启、断电等都不会影响到数据的安全。

  1. 隔离性(重点)

隔离性是为了解决“并发”执行事务,而引起的问题。

2.4.1隔离性

并发:多个事务同时读取了一个数据

【形象的例子】

一个饭馆在同一时间同时进来多个顾客,我们应当先服务谁?

  1. 脏读问题

形象的例子】比如老师正在写笔记(网上),同学可能会看老师的笔记,看来一会就离开了。然后老师继续写笔记,并修改了它。最后上课的时候发现,老师的笔记和昨天看到的不一样了。这就产生了脏读问题。

对应的实例】我们在某个游戏中充钱,当我们执行完充钱操作(业务没有结束),用户进行查看,发现钱已经有了,但是后来业务回滚,导致钱又消失了。这会让用户产生疑惑。

解决方法】为了解决脏读问题,mySQL引入了“写操作加锁”的机制。只有数据被写完,并解锁后,才能被其他事务使用。这个写操作加锁,可以降低并发程度,提高了隔离性。但是加锁,开锁需要时间,减低了效率。

实质】在写的时候读,导致用到了无效的数据。

  1. 不可重复读

形象的例子】当老师写完笔记后(记作版本1),同学也在阅读笔记。此时老师认为有些地方写的不好,需要修改,当老师再次提交到网上的时候,同学发现读着读着,笔记变了。就会造成不可重复度的问题。

对应的实例】我们给游戏中2023.03.03 12:00:00中此时用户点卷达到1000的用户送10点卷,达到2000点卷的用户送20点卷。有个玩家在此时点卷数是1000,我们送给他10点卷(送10点卷的语句结束,送20点卷语句没执行,且处于同一业务)。此时此玩家充值了1000点卷,达到2000点卷,导致又送了20点卷给他。前后送了30点卷。我们应当以同一时刻下的点卷数为准,不应让数量得到修改。

解决方法】对读加锁,在一个数据被读的时候,不能被写操作。这也会降低效率的,但是降低了并发程度。

实质】在读的时候写,导致两次读的结果不一样。

  1. 幻读

当前已经约定对读加锁、对写加锁,解决了不可重复度和脏读问题。

形象的例子】在事务A中我们在首先读取表A的所有数据时,得到了全部的数据。并删除了所有的数据。但是另一个事务突然向表中插入数据。然后事务A有读取整张表的数据,本应为空的表,有了数据,最后的到了不可预期的结果。

本质】在操作一张表时,数据又进行了增删,导致数据量改变。

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

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

相关文章

洗地机哪个牌子好?口碑最好的洗地机

选择洗地机,最关键的当然是清洁力度啦,这就要看洗地机的吸力如何了,一般情况下,吸力越大,越能够吸附顽固污渍,清洁力度就越好。然后杀菌功能也是必不可少的,毕竟是要清洁整个家的地面卫生&#…

Android 圆弧形 SeekBar

效果预览package com.gcssloop.widget;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graph…

ViT(Vision Transformer) TNT(Transformer in Transformer)

ViT(Vision Transformer) ViT的结构 ViT将输入图片分为多个patch(16x16),再将每个patch投影为固定长度的向量送入Transformer,后续encoder的操作和原始Transformer中完全相同。但是因为对图片分类,因此在输入序列中加…

论文复现-3

模型构建中的运算 数据集是CONLL03 这个数据集共有4种实体类型,所以,在做实体描述的embedding时,得到的语义表示的Tensor大小为 : 4*max_len, 具体指的是: type_input_ids: torch.LongTensor None, type_attention_m…

2023年中职组网络安全竞赛——web服务渗透测试解析

web服务渗透测试(100分) 题目如下: 解析如下: PS:任务环境可以私信博主,求个三连吧! 通过本地PC中的渗透测试平台KALI2020对靶机进行WEB渗透,找到页面内的文件上传漏洞并且尝试进行上传攻击,将文件上传成功后的页面回显字符串作为FLAG提交(如:点击超链接查看上传文…

Python自动化测试之requests库【发送json数据类型 】(六)

目录:导读 数据类型 application/json: application/x-www-form-urlencoded text/xml requests发送json 写在最后 我们都知道post请求中的body有4种数据类型,今天我们来写一篇关于requests请求json这种数据类型。 数据类型 我们都知道…

使用JSON.stringify的第三个参数,美化序列化后的值

事情是这样的,我在使用tiptap富文本编辑器,展示JSON代码,效果图肯定是这样的假设我有一个javascript对象如下const data {a: test }想要实现上面的效果,肯定需要使用JSON.stringifyconst editorData JSON.stringify(data)editor…

Linux中安装JDK8.跟学韩顺平

Linux中安装JDK8第16章Linux之JavaEE定制篇搭建JavaEE环境16.1 概述16.2安装JDK16.2.1安装步骤16.2.2测试是否安装成功第16章Linux之JavaEE定制篇搭建JavaEE环境 16.1 概述 如果需要在Linux下进行JavaEE的开发,我们需要安装如下软件 资料下载地址:百度…

【算法】BloomFilter概念和原理以及业务中的应用场景

思考:海量数据下去重,如果是非数值类型的话如何判断?1.什么是布隆过滤器 1970年由布隆提出的一种空间效率很高的概率型数据结构,它可以用于检索一个元素是否在一个集合中。 由只存0或1的位数组和多个hash算法, 进行判断数据 【一…

2023-03-03 mysql列存储-cpu占用100%-追踪思路

摘要: 最近在处理mysql列存储时, 发现在执行explain时, cpu占用达到了100%. 本文分析定位该问题的思路过程 现象: mysqld进程占用100%使用kill processlist终止会话, 无响应查看show processings; 发现一直在运行mysql> show processlist; +----+-----------------+-----…

图片服务器

文章目录一、项目简介二、功能及场景三、业务设计四、数据库设计准备图片表准备实体类五、API设计常用功能封装文件上传文件上传获取图片列表接口获取图片内容删除图片接口六、项目优化七、测试自动化测试测试用例一、项目简介 图片服务器:解决项目中插入图片的问题…

Java 运算符与类型转化

Java 运算符与类型转化 1 算术运算符 Java中的算术运算符主要有(加)、-(减)、*(乘)、/(除)、%(求余),它们都是二元运算符。 2 自增和自减运算…

Day906.grant语句 -MySQL实战

grant语句 Hi,我是阿昌,今天学习记录的是关于grant语句的内容。 在 MySQL 里面,grant 语句是用来给用户赋权的。 不知道有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使…

搞懂它,带你学会高效配置交换机!

想了解更多IT学习资料,可关注公众号“IT运维大本营” 不同网段的用户想要进行三层通信,必须借助于路由表项,而VLANIF接口只能生成直连路由,实现不同网段间通过同一台设备互通,对于不同网段间跨设备…

【Linux】虚拟机设置ISO镜像、配置CentOS 7、设置快照

目录 一、设置ISO镜像 1.设置或编辑 2.配置光驱(DVD) 3.虚拟机快捷键设置 4.启动虚拟机 二、配置CentOS 7 三、设置快照 四、​​​​​​​虚拟网卡不显示怎么办? 💟 创作不易,不妨点赞💚评论❤️收…

安装打印机驱动程序的操作步骤,详细方法介绍

安装打印机驱动程序是使用打印机的前提条件,因此学会正确的安装方法是非常重要的。下面是安装打印机驱动程序的详细步骤分析,为你全面的讲解安装和出现故障如何处理等问题。 一.安装打印机的准备工作 在安装打印机驱动程序之前,需要先准备好…

【Java集合框架】篇六:Collections工具类

Collections 是一个操作 Set、List 和 Map 等集合的工具类。 1。 常用方法 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法(均为static方法)&…

软件测试6

一 css书写位置,引入方式 1.内嵌式:css写在style标签中,放在title标签的后面,因为html代码和css代码混在同一个文件中,所以叫内嵌式。 2.外链式:css代码和html代码分离,使用link标签设置href属…

UE 蓝图上帝视角

UE 蓝图上帝视角 UE5蓝图实现相机上帝视角控制,包括绕点旋转,水平平移,远近缩放 实现效果 绕点旋转 水平平移 实现功能 左键鼠标平移(相对于场景水平面平移)右键绕点旋转中间键视角前后移动(可以理解成…

linux网络管理、测试网络连通性

一、网络管理 在rhel7上,同时支持network.service和NetworkMananger.service(简称NM)。在rhel8上,已经废弃network.service,因此只能通过NM进行网络配置,包括静态ip和动态ip。在rhel8上,必须开启…