[MySQL数据库] 索引与事务

news2024/11/24 20:30:26

1. 索引

1.1 概念

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

1.2 作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助。

注意:引入索引可以提高数据库的查询速度,但是也会有一定的缺点:

  1. 目录本身也要占据一定的储存空间(一般是占据硬盘)
  2. 索引会拖慢增删改的速度,因为后续在对数据库更新的时候,也要同步更新索引.

我们举个例子来说明:
有请助教:凯亚,丽莎
最近凯亚在跟着丽莎学药物炼制,凯亚要想在丽莎这里通过考核,必须写出出色的药物炼制论文,一篇优秀的长篇学术论文是不可能没有目录的.凯亚费尽九牛二虎之力,终于把内容和目录全部写完了,但是有一天,凯亚发现,根据丽莎的要求,他少写了一种药物的相关内容.凯亚此时崩溃了,让他崩溃的不是正文内容,而是目录,前面目录的序号和页码标的好好的,结果要在中间插入内容,序号和页码全乱套了.
在这里插入图片描述

在这里插入图片描述

1.3 使用场景

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

  • 数据量较大,要经常对这些列进行条件查询.
  • 该数据库对数据的修改频率较低.
  • 索引会占用额外的空间.

1.4 使用

创建主键约束,唯一约束,外键约束时,会自动创建对应的索引.
原因如下:针对主键会有大量的查询行为,所以会自动创建.在往一个带有外键约束的表中添加元素的时候,外键约束会使得子表触发查询,要在父表中查询是否存在对应元素,查询操作也比较频繁.

  • 查看索引:
    show index from 表名
    show index from student;
    在这里插入图片描述
    我们看到,由于student的id一列为主键,id一列就默认有索引存在.
  • 创建索引:
    对于非主键、非唯一约束、非外键的字段,可以创建普通索引
    create index 索引名 on 表名(列名)
    create index name_index on student(name);
    在这里插入图片描述
    我们看到,name一列的索引被创建了.
  • 删除索引:
    drop index 索引名 on 表名
    drop index name_index on student;
    在这里插入图片描述
    我们看到,name一列的索引被删除了.

索引底层的搜索原理使用B+树,我们后续在数据库底层容器原理中介绍.

2.事务

2.1 为什么使用事务

现在我们想象一个场景
有请助教:迪卢克
今天迪卢克由于晨曦酒馆有事情要忙,来不及自己做饭了,他便在手机上点外卖,在手机上付款之后,却迟迟没有等到餐送来,于是,迪卢克姥爷便给蒙德餐馆打电话,但是它们说它们并没有收到订单,餐馆的账户上也没有相应金额的收入.调查清楚了事情的原委,原来是晨曦酒馆地位偏僻,在付款的一瞬间,导致网络中断,虽然在迪卢克姥爷的账户上扣除了相应的摩拉,但是蒙德餐馆那边一点反应都没有,这是我们所不想看到的情况.我们想要的情况是,要不付款不成功,餐馆的账户上也没有相应的收入,要不就是付款成功,迪卢克的账户上扣除金额,餐馆的账户上增加金额并收到订单.所以我们引入了事务来避免这种情况的发生.
在这里插入图片描述

2.2 事务的概念

事务指逻辑上的一组操作,就是把多个操作打包为一个操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务,数据库事务可以有效避免部分执行,部分未执行的中间状态.

2.3 事务的特性

  1. 原子性:事务的核心特性,把多个操作打包为一个整体称为"原子性".
    数据库事务的原子性,核心是通过"回滚"机制来保证.
    [那么何为回滚机制?]
    在我们执行数据库的事务的时候,数据库会在硬盘中记录日志,如果在执行事务的中间,出现了bug(网络错误,主机断电,程序崩溃,系统崩溃),MySQL可以根据日志来进行恢复,这便实现了原子性.

  2. 一致性:是对数据库回滚内容与日志统一的保证,就是发明MySQL的这个公司,给了我们一个保证,假如数据丢失,或者出现了bug,一定可以通过日志回滚回来,并且不会有任何差错.(关系型数据库支持)

  3. 持久性:执行事务对数据库的修改,就会在硬盘上永久保存(相反在内存中保存的不持久),重启之后仍然存在.

  4. 隔离性: 描述的是数据在并发执行事务的时候产生的情况.
    比如:可能多个客户端正好就把事务赶到一块了,就需要服务器给出处理.
    如果一起处理,又会出现问题:(这里对应的是Java EE板块中的线程安全问题,可自行查看)

  • 脏读(未加以任何限制)
    数据库中有事务A,B,在A提交之前B就读,杜处的就是未处理好的数据.
    在这里插入图片描述
    那么如何解决上述问题呢?我们通过写加锁的操作,在A提交事务之前,B不可读取数据.
    在这里插入图片描述

但是还是会有问题

  • 不可重复读
    假如存在A,B,C三个事务,事务A对数据修改,提交之后B读取,在执行B的过程中,事务C对数据进行修改,导致B事务前后读到的数据不一致.

在这里插入图片描述
如何解决呢,我们进行读加锁,在B事务读取的时候,不可对A事务进行任何修改.
在这里插入图片描述
但还是会有一定的问题

  • 幻读
    事务A先修改并提交数据,事务B对数据进行读取,此时C没有对A的数据直接进行修改,而是给对应的表进行新增,修改,使得数据改变.
    解决:串行化执行,使得所有的事物都按照一个接一个的方式执行,完全不并发,使得隔离性达到最高.也就是,从脏读,到串行化,事务的隔离性在不断增加,并发性在不断降低.

我们举个例子来说明:
有请助教:丽莎,班尼特
丽莎在蒙德是个成绩非常好的学徒,班尼特由于平时热爱冒险,完全没有把学习这件事放在心上,在一次考核的时候,它们坐在了一起…

  1. 班尼特什么都不会,他就决定使用斜眼法偷看丽莎的卷子,此时丽莎正在写一道解答题,班尼特就记住了丽莎解答题上的其中两三行,就写在了自己的试卷上.但是丽莎写了一半的时候,觉得不对劲,算错了,就从头到尾修改了这道题的解答,此时班尼特就抄到的是丽莎错误的答案.在丽莎还正在写这道题,并且没有正式确定答案时去偷瞄,此时班尼特就在脏读.
  2. 班尼特又偷瞄到了丽莎的一道填空题,答案是4,班尼特非常高兴,就抄了上去,但是,丽莎灵光一炸,好像前面这道填空题写错了,就修改了这道填空题的答案为5.丽莎在之前正式写完了一道填空题的答案,班尼特去偷瞄,但是最后丽莎又进行了修改,此时班尼特就在不可重复读.
  3. 班尼特又偷瞄了丽莎的一道已经完成的证明题,班尼特就原封不动的把丽莎的这道证明题抄了上去,但是最后丽莎发现,证明的中间少了几步,于是就加上了几步证明,但是班尼特最后没有随着丽莎加上这几步,此时班尼特就在幻读.
    班尼特以为自己这次一定可以及格的,结果…
    在这里插入图片描述

2.4 事务的使用

  1. 开启事务
    start transaction;
  2. 执行多条sql语句
  3. 回滚或提交
    rollback/commit

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

start transaction;
update account set money=money-20 where name='迪卢克';
update account set money=money+20 where name='蒙德餐馆';
commit;

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

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

相关文章

电商平台业务及架构演变史

不少人认为电商系统很简单,因为现在做电商的太多了,看到的电商产品也多。看来看去产品都差不多,没什么特别。 其实中国电商发展已有20多年历史,电商以销售为核心连接着研、产、供、销、服整套的信息系统体系。其中的设计并没有那…

预约小程序新选择:强大后端管理功能一览

拥有一个功能齐全、操作便捷的小程序对于商家来说至关重要。为了满足广大商家的需求,乔拓云平台提供了丰富的模板资源,帮助用户快速搭建预约型小程序,并配备了强大的后端管理功能,让商家能够轻松管理预约订单,提升运营…

Hive进阶(1)----HDFS写入数据流程(赋图助君理解)

HDFS写入数据流程 1.理论流程描述 HDFS(Hadoop分布式文件系统)的数据写入流程是一个复杂但高效的过程,可以分为以下8个步骤: 1、client(客户端)发起文件上传请求; 2、通过发送RPC请求与NameNode建立通讯。NameNode…

⑥【Shiro】使多个自定义Realm规则生效。

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ ⑥【Shiro】Shiro中,如何使多个自定…

CSS的语法规则——基础选择器

元素&#xff1a; 用法&#xff1a; 标签名&#xff1a;{style的内容} 特点&#xff1a; 全局性&#xff0c;使用后&#xff0c;所有的相同标签都是同一种样式。 举例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UT…

Docker使用教程及docker部署Vue项目

什么是Docker及其工作原理 虚拟化技术Docker是什么&#xff1f;三大基本术语核心算法原理和具体操作步骤 Docker和传统虚拟化技术区别为什么使用Docker&#xff1f;Docker有什么作用&#xff1f;1.解决应用部署的环境问题遇到问题达到效果 2.容器化 docker的各种命令解释运行机…

pnpm - Failed to resolve loader: cache-loader. You may need to install it.

起因 工作原因需要研究 vue-grid-layout 的源码&#xff0c;于是下载到本地。因为我习惯使用 pnpm&#xff0c;所以直接用 pnpm i 安装依赖&#xff0c;npm run serve 启动失败。折腾了一番没成功。 看到源码里有 yarn.lock&#xff0c;于是重新用 yarn install 安装依赖&…

hbase-2.2.7分布式搭建

一、下载上传解压 1.在官网或者云镜像网站下载jar包 华为云镜像站&#xff1a;Index of apache-local/hbase/2.2.7 2.上传到linux并解压 tar -zxvf hbase-2.2.7-bin.tar.gz -C /usr/locol/soft 二、配置环境变量 1. vim /etc/profile export HBASE_HOME/usr/local/soft/h…

基于大数据的手机销售数据分析可视化系统,爬取京东和淘宝的的手机商品数据进行分析,Flask,Python,数据可视化

介绍 该系统主要是通过爬取京东和淘宝的的手机商品数据进行分析。爬虫python脚本通过打开浏览器授权登录后按照搜索“手机”关键字后出现的商品列表进行爬取&#xff0c;获取标题名&#xff0c;解析付款人数&#xff0c;品牌&#xff0c;评论人数&#xff0c;发货地&#xff0…

Java相关的定时任务

就现在而言&#xff0c;关于定时任务有各种各样的架构&#xff1a;Java 定时器类【Timer】&#xff0c;Spring定时器类【Scheduled】&#xff0c;Quartz分布式定时器类&#xff0c;xxl-job分布式任务调度平台。xxl-job是一款轻量级定时任务可以分布式部署的调度平台。很多大的公…

AIDE:自动驾驶目标检测的自动数据引擎

AIDE&#xff1a;自动驾驶目标检测的自动数据引擎 摘要IntroductionRelated WorksMethodData FeederModel Updater4 Experiments 摘要 自动驾驶车辆&#xff08;AV&#xff09;系统依赖于健壮的感知模型作为安全保证的基石。然而&#xff0c;道路上遇到的物体表现出长尾分布&a…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言&#xff1a;在上一章节中我们创建了两个个SpringCloud工程&#xff0c;但在两个工程中分别存在着一些重复的部分&#xff0c;例如重复的实体类&#xff08;如图所示&#xff09;&#xff0c;这样会造成系统的冗余&#xff0c;所以我们需要把公共的类提取到一个工程里&…

50.HarmonyOS鸿蒙系统 App(ArkUI)web组件实现简易浏览器

50.HarmonyOS鸿蒙系统 App(ArkUI)web组件实现简易浏览器 配置网络访问权限&#xff1a; 跳转任务&#xff1a; Button(转到).onClick(() > {try {// 点击按钮时&#xff0c;通过loadUrl&#xff0c;跳转到www.example1.comthis.webviewController.loadUrl(this.get_url);} …

docker 启动时报错

docker 启动时报如下错误 Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details 因为安装docker时添加了镜像源 解决方案&#xff1a; mv /etc/…

windows部署pgsql

1、下载&#xff1a;Download PostgreSQL Binaries 2、创建data目录作为数据目录 3、初始化 bin目录执行命令&#xff1a; .\initdb.exe -D E:\pgsql\data -E UTF-8 --localechs -U postgres -W 输入密码直到完成 4、启动数据库 .\pg_ctl.exe -D E:\pgsql\data -l logfil…

【CTF-Crypto】数论基础-01

数论基础 【专题说明】本系列文章主要根据B站Up主Alice-Bob学习数论基础知识&#xff0c;通过该系列文章&#xff0c;你可以对一些网安信安考试内容有一定了解&#xff0c;同时对于CTF中密码学方向的赛题在数论部分有更深的理解&#xff0c;如有不当之处&#xff0c;师傅们及时…

华为手机无法弹出wifi上网认证页面处理

华为手机无法弹出wifi上网认证页面 连wifi后跳到上图界面卡住&#xff0c;不跳转到单位的上网认证界面。 打开手机的设置应用&#xff0c;点击上面的WLAN选项。 点击上面的更多WLAN设置选项。 关闭WLAN安全检测就可以正常弹出上网认证界面&#xff0c; 正常弹出上网认证界面&a…

web安全学习笔记(12)

记一下第十六节课的内容。 一、jQuery Ajax 我们要先下载jQuery。 首先我们转移到template目录下&#xff0c;准备把jQuery下载到这下面。 直接wget下来就可以了。 这样我们就下载好了jQuery&#xff0c;下面我们学习如何使用。 jQuery 调用 ajax 方法 格式&#xff1a;$.…

量子时代加密安全与区块链应用的未来

量子时代加密安全与区块链应用的未来 现代密码学仍然是一门相对年轻的学科&#xff0c;但其历史却显示了一种重要的模式。大多数的发展都是基于几年甚至几十年前的研究。而这种缓慢的发展速度也是有原因的&#xff0c;就像药物和疫苗在进入市场之前需要经过多年的严格测试一样&…

高通滤波器(理解高通滤波器为什么会把无像素变化区域设置为0)

为什么所有的高通滤波器会把图像的背景色设置为0&#xff1f; 首先根据公式4.9-1&#xff0c;低通滤波器的定义&#xff0c;超过某个频率是百分之百通过的&#xff0c;为1.所以这里的含义是低于某个频率就会百分之百为0&#xff0c;完全不通过&#xff0c;那么可以肯定在H(0,0…