《mysql篇》--索引事务

索引

索引的介绍

索引是帮助MySQL高效获取数据数据结构,是一种特殊的文件,包含着对数据表里所有记录的引用指针,因为索引本身也比较大,所以索引一般是存储在磁盘上的,索引的种类有很多,不过如果没有特殊说明,我们一般认为索引是一个B+树的结构。

索引的作用

优势:

  • 可以提高列检索的效率,降低搜索成本。
  • 对提高数据库的性能有很大的作用。
  • 通过索引对数据进行,排序也可以大大提高排序效率
  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。

劣势:

  • 会占用磁盘空间
  • 有时可能会比较危险,在创建索引时需要对现有的数据,进行大规模的从新整理(调整存储的数据结构),如果当前是一个空表,或者数据不多,创建索引一般没有什么问题,如果这个表本来就很大,此时创建索引就需要对所有数据进行重新调整结构,重新存储,就有可能把服务器给卡住,一般来说,创建索引都是在创建表时就规划好的。

索引的使用

查看索引

show index from 表名;

举例:

 create table demo(
id int primary key,
age int,
name varchar(20));
show index from demo;

创建索引

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

举例:

create index index_id on demo(id);
show index from demo;

//这里的举例只是为了讲解

删除索引

drop index 索引名 on 表名;

 drop index index_id on demo;show index from demo;

//主键,unique,外键都是会自动生成索引的

索引内部的原理和逻辑

如果没有特殊说明,我们一般认为索引是一个B+树的结构。

二叉搜索树

博主在之前的博客中有详细讲解过二叉搜索树,如果有兴趣可以去看看。

B树

在将B+树之前我们要先了解一些B树,B树又叫多路平衡查找树,他并不是一棵二叉树,而是一棵多叉树,每个结点有M个子节点,M称为B树的阶,

B树的特点包括:

  • 每个节点可以有多个子节点,这使得B树能够优化大块数据的读写操作。
  • B树的所有叶子节点都在同一层,保持了树的平衡。
  • B树中的关键字从小到大排列,每个结点上有M个key,划分出M+1个区间
  • 叶子节点不包含关键字,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。

每个结点可以看作是一个区间,从无穷小到无穷大,每一个关键字都会将这个区间划分,每个小区间又可以向下延申出子结点,又或者说每个结点里所包含的关键字大小,都在其对应的父结点,的相应的小区间里

举例:查找7

首先从根结点开始,7比10小,所以在10左边的区间,然后继续查找比较,7比3大,在3右边的区间,继续查找比较,在这个结点中可以查找到7,查找结束。

进行查询的时候,就可以直接从根结点出发,判定当前要查找的数据在节点上的哪个区间,决定下一步往哪里走,进行添加/删除元素可能会涉及到结点的拆分和结点的合并

//B树可以有效的减少访问硬盘的次数,从而大大提高检索的性能

B+树

  • 为了进一步提高检索的性能,在B树的基础上改造得到了B+树,B+树是B树的改进,针对数据库量身定做
  • B+树也是一个N叉搜索树,一个结点上存在N个key,划分成N个区域
  • 每个节点上N个key中,最后一个就相当于当前子树的最大值
  • 父节点上的每个key都会以最大值的身份,在子节点的对应区间中存在(key可能会重复出现)
  • 叶子节点这一层,包含整个树的数据全集
  • B+树会以链表的形式,把叶子节点串起来(此时就方便我们进行遍历,也方便按照范围取出一个子集)

假如说要查询id>26 and id<62的就可以根据head进行查找

B+树的优点(相较于B树以及哈希,红黑树)

  • N叉搜索树,树的高度有限,降低了IO次数,增加了效率
  • 范围查找效率较高
  • 所有查询的最终结果都落到子节点,查询次数较稳定
  • 由于叶子结点是全集,会把行数据只存储在叶子节点上,非叶子节点只是存储一个用来排序的key(比如存个id)

事务

事务的介绍

我们先来举一个例子,假如我们现在要去银行把钱转账给另一个人,那么把这个操作简化为MySQL语句的话,就是我的账户删除一条数据,另一个人的账户插入一条数据,那么假如中间出现了错误,我的账户少了,另一个人的账户没有变,这样的场景显然是不合理的。

事务就是将多条sql语句打包为一个整体,要么都执行,要么都不执行,事务把多个sql打包为一个整体来执行,称之为“原子性”(意为不可再拆分)。

也就是说,在执行事务时如果其中有一条或者多条语句出现错误,那么所有执行的语句都会回滚(回到执行前的状态),收到影响的数据也会回到事务开始之前的状态,当所有语句都执行成功后事务也就顺利进行了

 事务不仅仅有原子性,还有一些其他方面的特性

  1. 原子性:回滚的方式,保证这一系列操作都能执行正确,或者恢复如初
  2. 一致性:事务执行之前,和之后要保证数据的合理性,比如不能出现前文例子中的,一方账户的金额少了,一方账户金额不变
  3. 持久性:事务做出的修改都是在硬盘上持久保存的,重启服务器,数据仍然存在,事务执行的修改任然是有效的
  4. 隔离性:一个事务的执行不能被其他事务干扰,数据库在并发执行时事务之间是隔离的

事务的使用

隐式事务

没有明确的开始和提交的标志,具有自动开始和提交事务的功能,在默认状态下mysql就是自动提交事务

显式事务

和隐式事务不同需要自己,手动开始事务和提交(commit)/回滚(rollback),在使用显式事务时要先将自动提交事务关掉,方法就是将变量autocommit的值改为0

首先准备一个表

具体步骤如下

#第一步开始事务
start transaction;
#第二步编写事务中的sql语句
update test2 set gpa = 3.8 where id = 6;
update test2 set gpa = 4.1 where id = 5;
#第四步提交事务
commit;
#rollback,回滚事务,将数据回到执行事务之前

并发事务时会遇到的问题

脏读

一个事务A正在写数据的过程中,另一个事务B读取了同一个数据,接下来事务A又修改了数据,导致B之前读的数据是一个无效的数据/过时的数据(也称为脏数据)

解决脏读的核心思路,就是对写操作进行加锁(规定在A写的时候B不可以读),之前A和B时并发执行的,在加锁之后,并发程度和效率就降低了,但是隔离性和数据准确性提高了

不可重复读

在并发执行事务的过程中,如果事务A在内部多次读取同一个数据的时候,出现不同的情况,这种情况就是不可重复读,即事务A在两次相邻的读取操作之间,有一个事务B修改了数据并提交了事务。

刚刚写加锁时,我们只是规定在写的时候不能读,但是没有规定在读的时候不能写,那么我们想要解决不可重复读就要再进一步加锁,也就是规定在读的时候也不能写

这样之后,并发程度和效率就又降低了,但是隔离性和数据准确性依然提高了

幻读

一个事务A执行过程中,两次读取操作,数据内容虽然没改变,但是结果集变了(比如又多出一个文件),虽然我们刚刚约定了,在读的时候能写,在写的时候不能读但是,当事务A再写A文件的时候事务B不能读A文件,但是事务B可以读B文件

这时我们只好从根本上解决,将两个事务完全分离,比如A执行完了之后才能执行B,这样就完全没有并发,效率自然是最低,但是隔离性和数据准确性都是最高

事务的隔离级别

一个事务和另一个事务的隔离程度称作隔离级别,

  • read uncommitted(读未提交)  没有加锁,并发程度最高,速度最快,隔离性最低,准确性最低
  • read committed(读已提交) 引入写加锁,只能读写完之后提交的版本,并发程度降低,速度降低,隔离性提高了,准确性提高了
  • repeatable read(可重复读)  引入了写加锁和读加锁,写的时候不能读,读的时候不能写,并发程度又进一步降低了,速度降低,隔离性提高,准确性提高
  • serializable(串行化)严格的按照串行的方式,一个一个的执行事务,并发事务最低(没有并发),速度最低,隔离性最高,准确性最高

//四种隔离级别对应上面的三个问题,隔离级别越高,并发程度越低,准确性越高,速度越慢。

oracle默认的事务隔离级别是:read committed

mysql默认的事务隔离级别是:read committed

以上就是博主对mysql--索引事务的分享,如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望多多支持博主之后和博客!!🥰🥰

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

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

相关文章

Anaconda+Pycharm 项目运行保姆级教程(附带视频)

最近很多小白在问如何用anacondapycharm运行一个深度学习项目&#xff0c;进行代码复现呢&#xff1f;于是写下这篇文章希望能浅浅起到一个指导作用。 附视频讲解地址&#xff1a;AnacondaPycharm项目运行实例_哔哩哔哩_bilibili 一、项目运行前的准备&#xff08;软件安装&…

突破AI性能瓶颈 揭秘LLaMA-MoE模型的高效分配策略

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 本文介绍了一种名为“LLaMA-MoE”的方法&#xff0c;通过将现有的大型语言模型&#xff08;LLMs&#xff09;转化为混合专家网络&#xff08;MoE&#xff09;&#xff0c;从而解决了训练MoE…

【Linux】升级FastJSON版本-jar

摘要 在长期运行的应用服务器上&#xff0c;近期的安全漏洞扫描揭示了fastjson组件存在潜在的安全隐患&#xff08;FastJSON是一个Java 语言实现的 JSON 解析器和生成器。FastJSON存在远程代码执行漏洞&#xff0c;恶意攻击者可以通过此漏洞远程执行恶意代码来入侵服务器&…

医疗器械的售后与服务探讨

彩虹医械维修培训 8月长期班报名啦 学技术 考证书 技术支持 大型医疗设备的宕机不仅会造成医疗机构直接的巨额经济损失&#xff0c;宕机期间的损失甚至可以超过维修费用&#xff0c;而且还可能会耽误患者的病情检查&#xff0c;因此对医疗设备的定期保养已经成为各级医院的…

Kafka-02 @KafkaListener学习

一. 引入依赖 SpringBoot 和 Kafka 搭配使用的场景&#xff0c;引入 spring-kafka 即可&#xff1b; <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.11</version>…

vs2022报找不到.netframework,version=V4.8的引用程序集

最近在win7上面安装vs2022 17.6版本&#xff0c;打开.net项目编译的时候出现了这个提示。 解决方案就是安装.net4.8开发者工具包&#xff0c;不是运行工具包。 安装完成之后在项目的属性中修改&#xff1a; 点击下载&#xff1a;.net4.8开发者工具包

HTML+CSS+JS 实现3D风吹草动效果(B站视频)

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>3D effect&…

CAD应用程序开发工具CST CAD Navigator 1.4.0.1 正式发布—— 带来了 G 代码生成功能

CST CAD Navigator是一款兼容Windows和Linux的CAD应用程序。在其简单的界面下&#xff0c;有一个可以快速查看2D图纸和3D模型的强大核心。软件可以轻松地导入和导出文件&#xff0c;获取尺寸&#xff0c;并创建截面视图。 下载最新版CST CAD Navigatorhttps://www.evget.com/p…

SpringIOC原理

SpringIOC原理 1.概念 Spring通过一个配置文件描述Bean及Bean之间的依赖关系&#xff0c;利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上&#xff0c;还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、…

台灯的种类有哪些?五款护眼台灯测评分析

随着时代的发展&#xff0c;现在市面上出现了更为护眼的选择——LED台灯。然而&#xff0c;面对琳琅满目的产品&#xff0c;挑选一款合适的台灯似乎成了一项挑战。那么&#xff0c;我们应该如何从众多选项中&#xff0c;找到那款既实用又护眼的台灯呢&#xff1f;以下内容将为您…

一个项目学习Vue3---Vue3中自带的事件

1. .stop 阻止事件继续传播&#xff0c;即防止事件冒泡到父元素。 <div click.stop"handleClick">点击我</div> 2. .prevent 阻止事件的默认行为&#xff0c;比如阻止表单提交时的页面刷新。 <form submit.prevent"handleSubmit">阻…

替你测试过了,这些国产大模型都很强,快来试试哪款适合你

替你测试过了&#xff0c;这些国产大模型都很强&#xff0c;快来试试哪款适合你 &#x1f4a1;&#x1f525; 大家好&#xff0c;我是猫头虎&#xff0c;科技自媒体博主。今天我将为大家介绍几款顶尖的国产AI大模型&#xff0c;它们各有所长&#xff0c;看看哪一款更适合你的需…

esp8266+micropython+irsend红外发射调试记录

在网上搜索esp8266micropython的红外发射库&#xff0c;没找到&#xff0c;发现 接收库是有的&#xff0c;可以参考&#xff1a;基于MicroPython的ESP8266连接外设IO&#xff08;二&#xff09;_micropython 红外接收-CSDN博客 可惜没有发射&#xff0c;很不方便。 这里都有介…

Echarts折线图---带颜色过度---的小demo

效果: 代码: <template><div id"lineEchtar"><div id"lineEchtars" style"min-height: 300px; width: 100%"></div></div> </template><script> import * as echarts from "echarts"; //…

PHP充电桩小程序系统源码

绿色出行新伴侣&#xff01;充电桩小程序&#xff0c;让充电不再烦恼✨ &#x1f50b; 开篇&#xff1a;告别电量焦虑&#xff0c;充电桩小程序来救场&#xff01; 在这个电动车日益普及的时代&#xff0c;电量不足成了不少车主的“心头大患”。但别担心&#xff0c;充电桩小…

手机容器化 安装docker

旧手机-基于Termux容器化 1、安装app 在手机上安装Termux或ZeroTermux&#xff08;Termux扩展&#xff09; 1.1 切换源 注&#xff1a;可以将termux进行换源&#xff0c;最好采用国内源&#xff0c;例如&#xff1a;清华源等 更新包列表和升级包&#xff08;可选&#xff0…

智能设备中的语音是如何写入语音芯片的

你是否曾好奇&#xff0c;那些智能设备中发出的清晰而自然的语音&#xff0c;是如何被巧妙地植入到微小的语音芯片中的呢&#xff1f;难道真的是通过我们日常使用的电脑吗&#xff1f;今天&#xff0c;就让我们一起探索将语音写入语音芯片的过程。 1、准备语音文件&#xff1a;…

低代码技术革新:高效构建现代人事管理系统

引言 在快速变化的商业环境中&#xff0c;企业必须不断提升其内部管理效率&#xff0c;以保持竞争力和灵活性。人事管理系统作为企业核心业务系统之一&#xff0c;承担着招聘、培训、绩效管理等重要功能&#xff0c;直接影响着企业的人才管理和运营效率。传统的人事管理系统通常…

GuLi商城-商品服务-API-品牌管理-OSS获取服务端签名

新建第三方服务: 引入common 把common中oss的依赖都拿到第三方服务中来 配置文件: 加上nacos注解:<

品牌策划学习资源全攻略:从入门到精通的推荐清单!

这里再分享一些网站书籍和杂志给大家。 TOPYS创意内容平台&#xff1a; 专注于创意内容分享&#xff0c;涵盖广告、设计、艺术等多个领域&#xff0c;是广告设计人寻找创意灵感的好去处。 Dribbble&#xff1a; 设计师社区&#xff0c;用户可以浏览到全球设计师的优秀作品&…