MySQL 索引事务

目录

1. 索引是什么

2. 索引的相关操作

3. 索引的原理

4. 事务是什么

5. 事务的使用

6. 事务的原理


1. 索引是什么

索引是用来加快查询的机制,是针对某个表的指定列来设置的,查询条件如果就是使用这个带有索引的列来查询,那么查询速度就会加快。

数据库在使用 select 查询的时候:

1. 先遍历表

2. 把当前的行给带入到条件中,看条件是否成立

3. 条件成立,这样的行就保留,不成立就跳过

如果表非常大,遍历成本就非常高了,至少是 O(N)

而数据库是把数据存储在硬盘上的,每次读取一个数据就都需要读取硬盘,而读取硬盘跟读取内存比,是非常慢的,慢上加慢,那就很难受了。

索引,就是针对 查询 操作引入的优化手段,通过索引,就能加快查询的速度,避免针对表进行遍历。

可以把索引当作一本书的目录,通过目录,就能快速查找到哪个章节在哪一页从而阅读对应的内容,而通过索引,就能加快查询的速度,快速的找到对应的行记录。

索引是能提高查询速度,但是也有代价:

1. 占用更多的空间   

生成索引,是需要一系列的数据结构,以及一系列的额外的数据,来存储到硬盘空间中的。

2. 可能会降低插入查询修改的速度

删除数据,也需要将索引里对应的内容给删除。

实际开发中,查询(读)的频率,比插入删除修改(写)的频率高很多,所以索引是非常有用的。

2. 索引的相关操作

在有 主键/外键/unique 约束的情况下,会自动生成索引。

1) 查看索引

show index from 表名;

一本书可以有多个目录,一个表也可以有多个索引。 

2) 创建索引

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

创建索引是一个危险的操作。

创建索引的时候,需要针对现有的数据,进行大规模的重新整理。

如果当前表是一个空表,或者数据不多,那么创建索引都没事,

如果这个表很大,创建索引,就容易把数据库服务器给卡住。

如果确实想要创建索引的话,就需要使用其他的技巧。

比如:可以另外再搞一个机器,部署 mysql 服务器,也创建同样的表,并且把表上的索引提前创建好,再把之前机器上的数据,给导入到新的 mysql 服务器上(导入数据的过程,就可以控制节奏),多花点时间导数据都没事,但是不要影响到原来服务器的正常的运转,当所有的数据导入完毕,就可以用新的数据库替换旧的数据库了(移花接木)。

3) 删除索引

drop index 索引名 on 表名;

手动创建的索引,可以手动删除,但是自动生成的索引(主键/外键/unique),是不能删除的。 

删除自动生成的索引,就会报错。 

删除索引操作也是一个危险操作。

3. 索引的原理

索引也是通过一定的数据结构来实现的。

数据库引入的索引是一个改进的数据结构,B+ 树 (N 叉搜索树)

为了了解 B+ 树,就需要先了解 B 树。

B 树是一个 N 叉搜索树,每个节点上有 M 个 key,划分出 M + 1 个区间。

进行查询的时候,就可以直接从根节点出发,判定当前要查的数据在节点的哪个区间里,再来决定下一步往哪里走。

进行添加/删除元素的时候,可能会涉及到 节点的拆分 和 节点的合并 。

B+ 树,是相对于 B 树,又做出了一定的改进,这个改进,可以说是为数据库量身定做的。

B+ 树特点:

1) B+ 树也是一个 N 叉搜索树,一个节点上存在 N 个 key,划分出 N 个区间。

2) 每个节点的 N 个 key 中,最后一个,就相当于当前子树的最大值。

3) 父节点上的每个 key 都会以最大值的身份在子节点的对应区间中存在 (key 可能会重复出现),这就使得,叶子节点这一层,包含了整个树的数据全集。

4) B+ 树会使用 链表 这样的结构,把叶子节点串起来。

此时就可以非常方便的完成数据集合的遍历,也可以非常方便的从数据集合中按照范围取出一个 "子集" 来。

B+ 树的优点(相对于 B 树,哈希表,红黑树):

1. N 叉搜索树,树的高度是有限的。降低 IO 的次数。

2. 非常擅长范围查询。

3. 所有的查询最终都是要落到叶子节点。

    查询和查询之间的时间开销是稳定的,不会出现这次特别快,下次特别慢的情况。

4. 由于叶子节点是全集,所以会把行数据存储在叶子节点上,非叶子节点只是存储一个用来排序的 key (比如存个 id )

数据库是按行组织数据的,创建索引的时候,是针对这一列进行创建的。这一行数据,内容是比较多的,而这一个 id,内容是比较少的,叶子节点会非常占用空间,而非叶子节点则占不了多少空间,所以就可以直接把非叶子节点缓存到内存空间中硬盘中还是要存储非叶子节点的,但是当我们进行查询的时候,就可以把这些非叶子节点加载到内存中,整体查询的比较过程就可以在内存中进行了,又进一步的减少了 IO 访问次数)。

mysql 的索引实现,也是有一些变数的,不是只有 B+ 树一种情况。

mysql 内部有个模块,存储引擎。

存储引擎是提供很多版本的实现的,当前最主要使用的存储引擎是 Innodb,Innodb 使用的就是 B+ 树。

4. 事务是什么

开发中经常会涉及到一些场景,需要 "一气呵成" 的完成一些工作。

比如说转账:

引入事务,就是为了避免上述问题。

事务就可以把多个 sql 打包成一个整体,可以保证这些 sql 要么全都执行正确,要么 "一个都不执行" (不是真的一个都没执行,必然得先执行了,才知道成没成功,只是看起来一个都不执行一样)。

事务把这多个 sql 打包到一起,作为一个整体来执行,这样的特点,称为 "原子性"(不可拆分的)。

如果在事务中的 sql 有某一条执行失败了,那就会进行回滚,将状态恢复到执行事务之前。

 

5. 事务的使用

单独执行的每个 sql,都是自成一个体系,此时这些 sql 之间是没有原子性的。

1) 开启事务:

start transaction;

开启事务之后,就可以执行各种 sql 了,此时这些 sql 都会别当成一个原子来执行。

2) 提交事务/事务回滚

提交事务:

commit;

事务结束。

事务回滚:

rollback;

主动触发回滚。

出错有很多种情况情况,崩溃只是其中一种。

rollback 一般是要搭配条件判断来使用的,一般是搭配其他的编程语言来使用 rollback。

6. 事务的原理

1) 回滚是怎么做到的?

通过日志的方式,来记录事务中的关键操作,这样的记录,就是回滚的依据。

日志就是打印出来的内容,一般会把日志放到文件里,即使是主机掉电,也不影响,因为回滚用的日志已经在文件中了,一旦重新启动主机,mysql 也重新启动,就会发现回滚日志中有一些需要回滚的操作,于是就可以完成回滚了。

2) 事务的特性:

1. 原子性   

通过回滚的操作,保证这一系列操作,都能执行正确,或者恢复如初。

2. 一致性

事务执行之前,执行之后,数据都不能离谱。

一致性很多时候是要靠数据库的约束以及一系列的检查机制来完成的。

3. 持久性

事务做出的修改,都是在硬盘上持久保存的,重启服务器,数据仍然是存在的,事务执行的修改仍然是有效的。

4. 隔离性

隔离性是数据库并发执行多个事务的时候,涉及到的问题。

一个服务器可以给多个客户端提供服务,多个客户端都会让数据库执行事务,很有可能客户端1 提交的事务1,执行了一半,客户端2 提交的事务2 也过来了,此时数据库服务器就需要同时处理(并发执行)这两个事务。所以并发程度越高,效率也就越高

所以如果希望数据库执行效率高的话,就需要提高并发程度。

但是在并发执行的过程中,可能会出现一些问题,导致数据就出现一些 "错误" 的情况。

在并发执行的过程中,会出现以下问题:

1. 脏读

一个事务 A 在写数据的时候,另一个事务 B 读取了同一个数据。

接下来事务 A 又修改了数据,导致之前 B 读的数据是无效的数据/过时的数据 (脏数据)。

举个例子:我在写博客的时候,我的室友就在我身后看我写博客,然后在我博客写到一半的时候,室友有事要去做,就走了,后面我又觉得前面的博客写得不是很好,所以直接大改前面的内容,改的面目全非,跟原来的那一版差别很大,后面我发布博客,室友在网上看我写的博客,就发现这跟之前写得区别很大。

这种情况就是脏读,我是事务A,负责写,室友是事务B,负责读,但是我又修改了写过的数据,导致室友之前读的数据都是无效的数据/过时的数据。

如果两个事务一个接一个的串行执行,就没问题,如果是并发执行,就容易出问题。

解决脏读问题的核心思路是,针对写加锁。(我和室友约定好,我写博客的时候,你不要读)

等到我写完了,不修改了,将博客发布到网上,这时室友再来读博客就没问题了。

约定了写加锁之后,并发性降低了,效率也降低了,但是数据准确性提高了,隔离性也提高了。

2. 不可重复读

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

还是刚刚那个例子,我还是写博客,约定了写加锁(跟室友说我写的时候,你别看我屏幕),等我写完博客之后,直接发布。然后我的室友就来看我写的博客,我想了想,还是觉得刚刚写的博客不太满意,就想把博客优化一下(我改博客的时候,室友并不能感知到),但是当我修改完之后,再次发布(假设不考虑审核时间的问题),室友就发现,这博客内容跟她刚刚看的不一样啊。

这种情况就是不可重复读问题,室友是在读我博客的时候,我又修改了同一篇博客的内容,导致她看到的博客内容不一样。

刚才写加锁的时候,只是要求我读的时候,室友不能看我屏幕,在我写的时候不能读,但是没说在室友读的时候我不能继续写。

解决不可重复读的关键是:给读操作加锁。(我跟室友约定好,在她读我博客的时候,我不能修改这篇博客内容)

约定读加锁之后,并发程度又降低了,效率又降低了,数据准确性进一步提高了,隔离性也进一步提高了。

3. 幻读

一个事务 A 执行过程中,两次的读取操作,数据的内容没变,但是结果集变了。

约定了写加锁和读加锁,我在写的时候,室友不能读,只能读我发布后的博客,室友在读的时候我不能写,此时就已经解决了脏读和不可重复读问题。

虽然约定了读的时候不能写,约定的是使用在读博客1 的时候,我不能修改博客1 内容,虽然我不可以写博客1 ,但是我可以写博客2 呀(在室友读的时候,我也可以干点其他的,不至于完全闲着)。此时,虽然我没有修改博客1 ,但是室友突然发现,网站上又突然出现了一篇我写的博客2 。

解决幻读的关键是:串行化执行,保持绝对的串行执行事务,此时完全没有并发,效率最低,隔离性最高,准确性最高。

串行化就是从根本上解决了并发涉及到的问题。

隔离级别,就是在 "数据正确" 和 "效率" 之间做平衡。

往往提升了 "效率",就会牺牲 "正确性",提升 "正确性",就会降低 "效率"。

不同的需求场景就有不同的要求。

有的场景追求正确性,效率是其次:比如转账,和钱打交道之类的场景。

有的场景追求效率,正确性是其次:比如微博点赞...

mysql 服务器也提供了 "隔离级别" 让我们针对隔离程度进行设置,可以在 mysql 的配置文件中修改。

mysql 的隔离级别:

mysql 默认的隔离级别是 repeatable read,可重复读。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于django协同过滤的音乐推荐系统的设计与实现

一、摘要 随着现代音乐的快速发展,协同过滤的音乐推荐系统已成为人们业余生活的需求。该平台采用Python技术和django搭建系统框架,后台使用MySQL数据库进行信息管理;通过用户管理、音乐分类管理、音乐信息管理、歌曲数据管理、系统管理、我的…

代码随想录算法训练营第51期第14天 | 226. 翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

226. 翻转二叉树 226. 翻转二叉树https://leetcode.cn/problems/invert-binary-tree/1.昨天忘了声明,如果都用C的话,我大概率写不完,所以思路方面,我可能考虑用pyhon先写,后续会用文心一言转换成C 2.这里可以直接用层…

雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605

文件: 雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605 install.esd 大小: 1970652896 字节 修改时间: 2024年12月13日, 星期五, 18:06:39 MD5: 3DCB989B62B6656B2CB34B0D88EBEE45 SHA1: C6E890223892B7A3EDA59E4881C70214DD546DB7 CRC32: 13EDFA89 与往版&#xff…

AI大模型开发实战:基于LangGraph、Ollama构建本地AI智能体

一、理解 AI 智能体 AI 智能体是能够感知其环境并采取行动以实现特定目标的实体或系统。这些智能体可以从简单的算法到能够进行复杂决策的复杂系统。 以下是关于 AI 智能体的一些关键点: (1)感知(Perception)&#x…

SpringCloud微服务开发(三)网关

目录 1.网关概述 2.网关路由 3.网关登录校验 3.1自定义过滤器 3.2实现登录校验 3.3微服务获取用户 3.4OpenFeign在不同微服务之间传递用户 4.网关配置管理 5.配置热更新 6.动态路由 1.网关概述 顾明思议,网关就是网络的关口。数据在网络间传输&#xff0…

利用DFT画有限长序列的DTFT

MATLAB中没有DTFT函数,计算机不可能给出连续结果,可以只能利用DFT的fft函数来实现。 %% L 7; x ones(1, L) figure; tiledlayout(2,3,"TileSpacing","tight") nexttile; stem([0:L-1],x) box off title([num2str(L), points rect…

MYSQL索引的分类和创建

目录 1、聚簇索引和非聚簇索引 tips: 小问题:主键为什么建议使用自增id? 2、普通索引 (常规索引)(normal) 3、唯一索引(UNIQUE ) 唯一索引和主键的区别: 唯一约束和唯一索引的区别&#…

Artec Leo3D扫描仪在重型机械设备定制中的应用【沪敖3D】

挑战:一家加拿大制造商需要有效的方法,为富于变化且难度较高的逆向工程,快速、安全、准确地完成重型机械几何采集。 解决方案:Artec Leo, Artec Studio, Geomagic for SOLIDWORKS 效果:Artec Leo三维扫描代替过去的手动…

数据驱动模型预测控制应用于自动驾驶车辆转向

Application of Data-driven Model Predictive Control for Autonomous Vehicle Steering 数据驱动模型预测控制应用于自动驾驶车辆转向 Abstract With the development of autonomous driving technology, there are increasing demands for vehicle control, and MPC has b…

Elasticsearch 架构及 Lucene 索引结构原理入门

文章目录 Elasticsearch 整体架构Lucene 索引结构Lucene 倒排索引核心原理倒排索引倒排表(Posting List) Elasticsearch 整体架构 一个 ES Index 在集群模式下,有多个Node(节点)组成,每个节点就是ES的 inst…

【源码阅读系列】(四)进程间通信(一)

进程间的通信 为什么需要进程间通信? 操作系统中的进程隔离机制确保了各个进程在独立的内存空间中运行,并通过严格的机制防止进程间的非法访问。然而,在某些场景下,进程间的通信(Inter-process Communication, IPC&a…

直线导轨使用润滑脂和润滑油的区别

直线导轨在使用过程中,润滑是非常重要的一环,它能够减少摩擦、降低磨损、防止腐蚀,并提高导轨的精度和使用寿命。润滑脂和润滑油是两种常用的润滑剂,它们各自有不同的特点和适用场景。 润滑脂是由基础油、增稠剂和添加剂组成的半固…

echarts绘制自定义展示排名和数据等信息(数据排名进度条)

目录 一、结构分析 二、配置图表各部分 1.名称及排序 2.进度条绘制 3.数据末端圆形绘制 (1)基本配置 (2)数据 (3)坐标轴配置 (4)点的样式 (5)项的样…

CV(4)--边缘提取和相机模型

前言 仅记录学习过程,有问题欢迎讨论 边缘提取(涉及语义分割): 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分,暗到亮为正 求边缘的幅度:sobel,Canny算子 图像分高频分量和低…

【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…

如何用VScode恢复误删文件-linux

如果你用vscode远程在服务器上办公&#xff0c;有一天你用了&#xff1a; rm -rf *然后你发现你的文件不见了&#xff0c;不要着急。 这种方法只适用于不多的几个文件。 这个时候你要做的是&#xff0c;查看右侧的1&#xff1a; 从1里面查找你删除的文件&#xff0c;然后点…

IoTDB 报错 There are no available SchemaRegionGroup RegionGroups currently

现象 现象1&#xff1a; 现象2&#xff1a;时序数据库 IoTDB 系统遇到了一个持续增长的 schema_region 目录问题&#xff0c;导致频繁出现内存溢出&#xff08;OutOfMemory&#xff09;错误。在路径 data/datanode/consensus/schema_region 下&#xff0c;系统每分钟都会创建多…

使用ERA5数据绘制风向玫瑰图的简易流程

使用ERA5数据绘制风向玫瑰图的简易流程 今天需要做一个2017年-2023年的平均风向的统计,做一个风向玫瑰图&#xff0c;想到的还是高分辨率的ERA5land的数据&#xff08;0.1分辨率&#xff0c;逐小时分辨率&#xff0c;1950年至今&#xff09;。 风向&#xff0c;我分为了16个&…

hbuilder 安卓app手机调试中基座如何设置

app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】&#xff0c;点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…