MySQL索引与事务

索引

概念

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

作用

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

索引所起的作用类似于书籍目录,可以用于定位,检索数据.

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

特点

(1)加快查询速度

(2)索引自身是一定的数据结构,也需要占据内存

(3)当需要进行新增,删除,修改时需要先根据条件查找(速度快),也需要针对索引进行更新(速度慢)

(4)索引不是越多越好,索引过多会影响到插入性能,建立索引可使检索操作更加迅速

数据结构

数据库的索引,使用了B+树作为数据结构.

B+树的前身:B树(N叉搜索树),就是二叉搜索树的扩展.如图所示形如这样的树为B树:

N个结点可以划分为N+1个区间.

用同样高度的树,能表示的元素相比于二叉搜索树来说,多了很多.使用B树查询时,比较次数比搜索树多了很多. 

B+树是在B树的基础上进行的改进:同样是N叉搜索树,每个节点有多个key,N个key能分出N个空间

B+树的特点:

(1)N叉搜索树,每个节点有N个key,N个key划分出N个区间

(2)每个结点的N个key中,会存在最大值(如图所示,最右端的15就是第一层的最大值)

(3)每个结点的key,会在子树中重复出现,即所有数据都包含在叶子结点

(4)叶子节点之间,用链式结构进行相连,使查询时间很稳定.

使用场景

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

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

2.该数据库表的插入操作,及对这些列的修改操作的频率较低

3.索引会占用额外的磁盘空间.

4.不是所有的查询都需要索引,eg.小表:数据量较小时,使用全表扫描可能更为高效

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

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

使用

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

查看索引

show index from 表名;

注:一个表的索引可以有多个,eg.字典可以有多个目录,按照不同的目录方法查每个索引,都是根据某个具体的列来展开的->后续按照这个列进行查询,才能提高查询效率.

创建索引

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

create index 索引名 on 表名(字段名); -- 针对哪个表,哪个列.

注:也是一个比较危险的操作,就比如说表本身有很多数据,此时创建索引操作,就会引发大量的硬盘IO(就有可能将数据库给搞挂了)

删除索引

drop index 索引名 on 表名;

注:也是危险操作

因此,我们说在创建索引时,一定要在建表之初就规划好索引的设定.

但是表中已经有很多数据了,需要给一个列加索引该咋办?

另外搞一台机器,搭建数据库,把生产环境上的数据库表创建好,并加上索引.再将生产环境中的数据库导入新的数据库中(耗时但不影响),用新的数据库的这个机器,替代旧机器(一瞬间)

事务

为什么要使用事务?

原因:很多时候,进行的多个操作,期望"打包"到一起,共同执行.要么执行成功,要么都不执行.

其实是执行了,只不过在恢复数据库时将数据也还原了.

举例如下:

准备测试表:

drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar ( 20 ) comment ' 账户名称 ' ,
money decimal ( 11 , 2 ) comment ' 金额 '
);
insert into accout(name, money) values
( ' 阿里巴巴 ' , 5000 ),
( ' 四十大盗 ' , 1000 );
比如说,四十大盗从阿里巴巴的账户上偷盗了2000元.
-- 阿里巴巴账户减少 2000
update accout set money=money- 2000 where name = ' 阿里巴巴 ' ;
-- 四十大盗账户增加 2000
update accout set money=money+ 2000 where name = ' 四十大盗 ' ;
假如在执行第一句SQL时,出现网络错误,或者是数据库挂掉了,阿里巴巴的账户上就会减少2000,但是四十大盗的账户上就没有增加的金额.
解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败.

事务的概念

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

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

事务日志的概念

事务日志是数据库管理系统中的一个关键组件,用于记录数据库中发生的所有事务操作,事务日志的主要目的是为了提供数据恢复和持久性.

使用

1.开启事务:start transaction;

2.执行多条SQL语句

3.回滚或提交:rollback/commit;

(1)rollback:告诉服务器,要进行回滚.把开启事务之后,后续执行的sql恢复回去.一般不在控制台,在java代码里,代码开启事务,执行sql.某sql抛出异常,用catch进行捕获,并使用rollback.

数据库对于事务这里有特殊机制(undo log + rodo log):通过日志,写到文件夹里.记录之前的数据以及进行的操作.(如果数据库中间挂了,但日志记下来了,等到数据库重启后,读取之前的日志.看看是否有执行一半的事务,如果有就回滚).

(2)告诉服务器,事务完毕.

说明:rollback即是全部失败,commit即是全部成功.

start transaction;
-- 阿里巴巴账户减少 2000
update accout set money=money- 2000 where name = ' 阿里巴巴 ' ;
-- 四十大盗账户增加 2000
update accout set money=money+ 2000 where name = ' 四十大盗 ' ;
commit;

核心特性

1.原子性:通过事务,把多个操作,打包在一起.

2.一致性:相当于原子性的延伸,当数据库出现问题了,不会产生问题.另一方面,通过约束,避免数据出现非法的情况.

3.持久性:事务的任何修改,都是持久化的存在(写入硬盘的),无论是重启程序,还是重启主机,修改都是不会消失的.

4.隔离性:多个事务并发执行时,可能会带来一些问题.通过隔离性对该问题进行权衡,看是希望数据尽量准确,还是尽量快.

有关并发的介绍:

并发:因为数据库是客户端-服务器结构的程序,一个服务器,可能会同时涉及到多个客户端.

如果有多个客户端,同时给服务器发起事务请求呢,这时叫:"并发执行事务"~~

1.如果多个事务,修改的是不同的表,问题不大.

2.如果是修改相同的表,就会产生bug.

bug的类型

bug1:脏读问题:现在有两个事务1,2

事务1:修改了某个数据,但是事务还未"提交"(提交就是告诉服务器,over)

事务2:读取了同一数据,此时事务2读到的数据,很有可能就是一个脏的数据,因为事务1以后还有可能会修改这个数据

解决脏读问题的核心思路:降低事务的并发程度,写程序加锁,加锁就意味着释放锁之前是不可访问的

bug2:不可重复读:比较像脏读,但是这是在加锁的条件下,虽然写加锁了,但是可以分多个事务,进行多次提交的方式来修改(更换了一种修改的方式):这种修改数据的方式虽然没有那么频繁,也是可能会出现的.

比如有事务1,2.其中事务1先修改数据(加了锁).事务2想读,就得等事务1提交后,事务2开始读数据(可能有多次).又来了一个事务3,事务3修改了上述数据,导致事务2读的两次结果不同.因为没有说读的时候不能写.

bug3:幻读问题:事务1修改数据,事务2开始读数据,此时事务3新增了一个其它的数据.那么事务2就会出现两次读的结果不同的情况.

解决:串行化.即不再进行任何并发,每个事务是串行执行的(执行第1个,然后是2,3个).

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

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

相关文章

Java对象、类、数据类型、变量类型

一、Java对象和类: 对象是类的一个实例,有状态和行为。类是一个模版,描述一类对象的行为和状态。对象的状态就是属性,行为通过方法体现。方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。 一个类可以包…

上传项目文件到Github,并解决fatal: unable to access问题,100%成功

一、背景 Github我们用的最多的就是clone别人的代码,但有时我们也希望上传自己的项目或代码。但github上传文件还是比较复杂的,中间会有许许多多奇怪的问题,因此记录一下其过程。 二、Github上传文件 1. 申请Github账号 这里默认你已经有…

Vue指令修饰符、v-bind、v-model、computed计算属性、watch侦听器

前言 持续学习总结输出中,Vue指令修饰符、v-bind、v-model、computed计算属性、watch侦听器 一、指令修饰符 1.什么是指令修饰符? 所谓指令修饰符就是通过“.”指明一些指令后缀 ,不同的后缀封装了不同的处理操作 —> 简化代码 2.按键…

[每周一更]-(第72期):Docker容器瘦身方式

Docker清理缓存操作 在构建测试的过程中,由于是自家小服务器,资源紧张,发现磁盘一直爆满,删除一些大镜像还是会占满的情况,就想到是不是也是缓存问题。 经过查询确实是build过程中的缓存启发的占用问题。 因此引出以下…

【机器学习基础】对数几率回归(logistic回归)

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!后面的内容会越来越有意思~ 💡往期推荐: 【机器学习基础】机器学习入门(1) 【机器学习基…

Java学习之路 —— 多线程

文章目录 1. 线程创建方式1.1 继承Thread1.2 声明一个实现Runnable接口的类1.3 利用Callable接口、FutureTask类来实现 2. 线程同步2.1 同步代码块2.2 同步方法2.3 Lock锁 3. 线程同步4. 线程池 1. 线程创建方式 1.1 继承Thread 定义子类,继承Thread,创…

系列一、请谈谈你对JVM的理解?Java8的虚拟机有什么更新?

一、请谈谈你对JVM的理解?Java8的虚拟机有什么更新? JVM是Java虚拟机的意思。它是建立在操作系统之上的,由类加载器子系统、本地方法栈、Java栈、程序计数器、方法区、堆、本地方法库、本地方法接口、执行引擎组成。 (1&#xff0…

Python系列:如何提高python程序代码的健壮性

前言 在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等。这些不确定性会让我们的程序容易出现各种错误和异常。那么如何来增加程序的容错性和健壮性呢? 可能大多数人会想到使用try except来进行异常捕捉进行失败重试(Retry)。虽然try-esc…

使用重建大师进行重建时,为什么引擎信息中显示只有一台主机能运行?

答:停止的引擎可以右键开始引擎,红字的可以看一下提示哪个文件夹没有权限,调整一下路径。由于截图不全,目前可以判断的就是以上解决办法。

音视频转换软件Permute mac中文板特点介绍

Permute mac是一款Mac平台上的媒体格式转换软件,由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式,并提供了一些常用工具以便于用户进行编辑和处理。 Permute mac软件特点 - 支持大量格式:支持几乎所…

Postman启动问题:Could not open Postman

Postman启动问题:Could not open Postman 状态,在单击Postman之后一直在转圈圈,无法正常启动。 细心的朋友会发现,右下角 会经常出现防火墙关闭等提示信息,表示该程序,在向外链接。 Error Could not open…

仅需三行代码! C# 快速实现PDF转PPT

一般在会议、教学或培训活动中,我们都会选择PPT文档来进行内容展示。与PDF文档相比,PPT文档具有较强的可编辑性,可以随时增删元素,并且还可以设置丰富多样的动画效果来吸引观众注意。那么如何通过C#将PDF文档转为PPT文档呢&#x…

射频与微波综合测试仪-4958手持式微波综合测试仪

4958 微波综合测试仪 频率范围:1MHz~20GHz 4958手持式微波综合测试仪测量频率范围可达1MHz~20GHz,集电缆和天线驻波比测试、不连续点故障定位测试、插入损耗和增益测试、频谱分析、功率测量等多种功能于一体,携带方便&…

Spring Boot中使用MongoDB完成数据存储

我们在开发中用到的数据存储工具有许多种,我们常见的数据存储工具包括: 关系性数据库:使用表格来存储数据,支持事务和索引。(如:MySQL,Oracle,SQL Server等)。NoSQL数据…

【强化学习】时间循环最优决策:原理与Python实战

Python 如何在时间循环里最优决策?时间旅行和平行宇宙时间旅行引发的悖论强化学习策略梯度算法代码案例代码推荐阅读理论完备:实战性强:配套丰富: 如何在时间循环里最优决策? 时间循环是一类热门的影视题材&#xff0…

电源线虚接,导致信号线发烫

音频板的信号是经过隔直电容接到音频板的。

信创环境下高级威胁攻击层出不穷,信息化负责人该如何增强对抗与防御能力?

11月15日,以“加快推进智慧校园建设 赋能为党育才为党献策”为主题的2023年华东地区党校(行政学院)信息化和图书馆工作高质量发展专题研讨班顺利举办。 作为国内云原生安全领导厂商,安全狗受邀出席活动。 厦门服云信息科技有限公司…

【技术分享】EIGRP stub实验

【赠送】IT技术视频教程,白拿不谢!思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号:厦门微思网络】 拓扑图: R1配置: route…

Android源码分析 - Service启动流程

作者:dreamgyf 这次我们就来讲讲四大组件之一的Service是如何启动和绑定的 流程图 在查阅资料的过程中,我发现有些博主会将梳理好的流程图贴在开头,我觉得这样有助于从宏观上去理解源码的整个流程和设计理念,所以以后的文章我都…

【23真题】难!985难度第一梯队!

今天分享的是23年华南理工大学811的信号与系统试题及解析 本套试卷难度分析:22年华南理工大学811考研真题,我也发布过,若有需要,戳这里自取!本套试题难度中等偏上,只有十道大题,考察大家的综合…