MySQL-索引事务

news2025/1/9 13:42:06

文章目录

  • 前言
  • 一、 索引
    • 1.1 概念
    • 1.2 作用
    • 1.3 使用场景
    • 1.4 使用
    • 1.5 索引的底层数据结构
      • 1.5.1 用来查询的数据结构
      • 1.5.2 B树
      • 1.5.3 B+树
  • 二、事务
    • 2.1 为什么使用事务
    • 2.2 事务的概念
    • 2.3 事务的性质(ACID)
    • 2.4 事务的使用


前言

在这里将最近学习的MySQL中索引及事务的知识进行总结。

一、 索引

1.1 概念

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

1.2 作用

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

1.3 使用场景

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

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间。

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
注意:索引本身也需要占据硬盘中的内存。

1.4 使用

  • 查看索引
show index from 表名;

案例:查看学生表已有的索引。

show index from student;
  • 创建索引
    对于非主键、非唯一约束、非外键的字段,可以创建普通索引。
create index 索引名 on 表名(字段名);

案例:创建班级表中,name字段的索引。
注意:创建表的索引也是一个危险操作,如果表本身很大再创建索引,可能会造成大量CPU/硬盘IO消耗,将数据库搞挂掉。但是针对表中数据过多这一点有两种解决办法:(1)你可以在刚建表时就创建索引就可以避免这个问题,但是比较考验表的设计功力。(2)如果说没有那个设计功力想要加索引也是有办法的,将数据库的服务器进行更换。首先拿一个新的服务器创建表和索引此时是空表,之后将就数据库数据导入新机器,然后将应用程序请求再接到新机器即可。第二种方式还有一个好处在于如果新机器出问题可以立刻换回旧机器避免问题扩大化,开发中的高风险操作都可以通过类似方式完成。

create index idx_classes_name on classes(name);
  • 删除索引
drop index 索引名 on 表名;

案例:删除班级表中name字段的索引。
注意:删除索引也是比较危险的操作,可能涉及大量的硬盘的IO操作把数据库搞挂掉。

drop index idx_classes_name on classes;

注意:创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。这里还插个题外话,创建外键约束时,父表中被参照列需要是主键或是具有唯一性约束。

1.5 索引的底层数据结构

默认情况下对数据表进行条件查询操作都是遍历,引入索引就是通过希望其它数据结构加快查询速度,减少遍历表的可能。

1.5.1 用来查询的数据结构

  • 哈希表

只能查询key相等的情况,无法进行<>这样的范围查询。

  • 红黑树

红黑树可以进行范围查询,但是如果想找到下一个后继元素可能要回溯到父节点才行。这个问题可以通过线索化来解决但是会消耗存储空间。当元素变多时,红黑树高度也在不断增加,比较次数增多,数据库数据/索引都是保存在硬盘中,比较增多自然硬盘IO操作就增多了。

哈希表和红黑树这两种数据结构都不太适合给数据库使用。

1.5.2 B树

B树本质上是一个N叉搜索树,每个节点存放多个元素,延伸出多个子树,同样数量的数据,数的高度因此下降。
在这里插入图片描述
拿着想要查询的key在节点上比较确实需要比较很多次,但是这里的比较还是比较高效的。

  • 每个节点中的key也都是有序排放,可以直接进行二分查找。
  • B树也会控制,当节点中的key的数目变多会分裂节点。
  • 多个数据都是放在连续空间,进行比较时,一次硬盘IO操作就可以读出整个节点,就可以直接完成比较。(实际比较很多次,但是一个节点进行一次硬盘IO操作)

数据库中的索引数据结构是B+树,这里引出B树是为了后续更好理解。

1.5.3 B+树

B+树同样也是N叉搜索树。
在这里插入图片描述
上图为一个3阶B+树。
按照B+树的规则来存储数据,此时叶子节点这一层就包含数据集合全集。另外叶子节点会以类似链表这样的数据结构连接起来方便遍历表中所有数据,也很方便进行范围查询。

B+树相较B树的优点:

  • 非常方便遍历和范围查询。
  • 当前的任何一次查询操作都是要落到叶子节点进行的,硬盘IO次数相同,讲究一个稳定。
  • 非叶子节点仅仅存放数据行的key,完整的数据行都放在key相应的叶子节点,这样非叶子节点占存储空间较小,可以缓冲到内存中,从而提高运行速度。

针对上述优点的第三点,为什么这些非叶子节点本体在硬盘中,何时会放到内存中?
典型的策略:

  • 数据库启动的时候,加载。
  • 首次针对此表查询时,加载。
  • 首次命中该索引,加载。

针对查询表索引的几种情况:

  • 查询主键索引:就是最标准的B+树,根据key值找到叶子节点的数据行。
  • 查询非主键索引:数据库中会新建一个B+树,这里的B+树的叶子节点存放的主键的key,通过非主键的key找到主键key,之后再通过找到的主键key在为主键建立的B+树进行查找,找到数据行即结束。(每次查找非主键索引都会建立B+树,这也是创建索引操作消耗空间的原因之一)
  • 不用索引查询:直接B+树的叶子节点。

如果表中没有建立主键约束,那么数据库会根据自带的隐藏列建立默认的B+树。另外B树存在的前提是MySQL使用了innodb这个存储引擎,这是最常用的。

这里底层数据结构还是学过了B和B+树更加能理解。

二、事务

2.1 为什么使用事务

在平时数据库的操作中,一般都是多个数据库的sql语句进行组合使用,比如说转账的语句可以使用两个update语句。
在这里插入图片描述
如果执行过程中出现意外情况,比如程序崩溃等。第一句执行完成,第二句执行失败,相当于你扣除了余额但收款人余额并不增加,这个问题就挺严重。这时就需要使用事务来确保操作是完整的、可靠的。

2.2 事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

2.3 事务的性质(ACID)

  • 原子性
    把多个操作打包成一个整体,要么全部执行要么全不执行。这里的全不执行并非是真的不执行,因为sql语句是一条一条执行的,当某一条sql出现问题时数据库会自动将数据恢复到sql执行之前的状态,看起来像没有执行的样子,这个操作称为回滚,为了实现回滚,数据库会在执行事务时用日志记录。如果没有差错,内容可以不要,如果有问题则根据日志记录内容恢复。(只要数据库正常工作,就可以保证事务之前的操作都可以被正确回滚)
  • 一致性
    执行事务之前和之后数据是一致的,或者触发回滚,回滚回去的数据要是对的。
  • 持久性
    执行事务对数据库的修改被保存到硬盘上。
  • 隔离性
    隔离性描述的数据库并发执行事务时的性质。首先并发执行事务会出现三个问题:
    (1)脏读:
    就是比如说并发执行一个修改数据和读取数据的事务,当第一个修改数据的事务还未提交时,第二 个事务就将数据读取,但是后面第一个事务又将数据给修改了,这就称为脏读。这个问题可以通过写加锁来解决,即给第一个事务加锁,只有当第一个事务提交之后才能对数据进行读取。这样事务之间的并发程度降低,隔离性上升。
    (2)不可重复读:
    比如说有三个事务,事务a修改数据,事务b读取数据,事务修改c数据但是是在事务b执行时修改数据,这样就会发生一种情况,如果事务b中有两句读取数据的sql语句,可能两个sql语句读取的数据不一致,因为当第一句sql结束后事务c修改了数据,从而第二句sql读取的数据发生了改变。这个问题可以通过读加锁解决即给事务b加锁,只有当事务b提交后才能执行事务c。通过这个操作并发程度再次降低,隔离性上升。
    (3)幻读:
    类似不可重复读的问题,是不可重复读的特殊情况。它是事务a修改完提交后,事务b在读取过程中,事务c增加对应的表的数据,导致最终的读出来的数据集变大。(已有的数据内容是相同的,但是数目不同)解决幻读问题的方法就是串行化,完全舍弃并发性,事务一个接一个执行,效率低,准确度高,隔离性高。

上述很难做到效率和准确度同时兼顾,需要根据具体场景来选择方法。

MySQL给程序猿提供了四个隔离级别,如下图:
在这里插入图片描述
修改以上的隔离级别是通过修改MySQL中的配置文件来完成的。

2.4 事务的使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。

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

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

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

相关文章

ideaSSM物流运输管理系统短路径算法开发mysql数据库web结构Dijstra编程计算机网页源码maven项目

一、源码特点 idea ssm 物流运输管理系统是一套完善的完整信息管理系统&#xff0c;结合SSM框架完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数…

【Unity】程序创建Mesh(二)MeshRenderer、光照、Probes探针、UV信息、法线信息

文章目录 接上文MeshRenderer&#xff08;网格渲染器&#xff09;Materials&#xff08;材质&#xff09;Material和Mesh对应Lighting光照Lightmapping材质中的光照 光源类型阴影全局光照Probes&#xff08;探针&#xff09;Ray Tracing&#xff08;光线追踪&#xff09;Additi…

家具工厂5G智能制造数字孪生可视化平台,推进家具行业数字化转型

家具制造5G智能制造工厂数字孪生可视化平台&#xff0c;推进家具行业数字化转型。随着科技的飞速发展&#xff0c;家具制造业正迎来一场前所未有的数字化转型。在这场家具制造业转型中&#xff0c;5G智能制造工厂数字孪生可视化平台发挥着至关重要的作用。 5G智能制造工厂数字孪…

基于Java+SpringMVC+vue+element宠物管理系统设计实现

基于JavaSpringMVCvueelement宠物管理系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

橡胶工厂5G智能制造数字孪生可视化平台,推进橡胶工业数字化转型

橡胶5G智能制造工厂数字孪生可视化平台&#xff0c;推进橡胶工业数字化转型。随着信息技术的迅猛发展和智能制造的不断推进&#xff0c;数字化转型已成为制造业转型升级的重要方向。橡胶工业作为传统制造业的重要领域&#xff0c;正面临着产业升级和转型的迫切需求。橡胶5G智能…

【SpringBoot】头条新闻项目实现CRUD登录注册

文章目录 一、头条案例介绍二、技术栈介绍三、前端搭建四、基于SpringBoot搭建项目基础架构4.1 数据库脚本执行4.2 搭建SprintBoot工程4.2.1 导入依赖:4.2.2 编写配置4.2.3 工具类准备 4.3 MybatisX逆向工程 五、后台功能开发5.1 用户模块开发5.1.1 jwt 和 token 介绍5.1.2 jwt…

通付盾Web3专题 | SharkTeam:2023年加密货币犯罪分析报告

2023年&#xff0c;Web3行业共经历了940多起大大小小的安全事件&#xff0c;同比2022年增长了超过50%&#xff0c;损失金额达到17.9亿美元。其中&#xff0c;第三季度发生的安全事件最多&#xff08;360起&#xff09;&#xff0c;损失最大&#xff08;7.4亿美元&#xff09;&a…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十五)-UL-TDOA 定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

【ARM】DS中Coretex-M处理器的常用寄存器介绍

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 了解ArmDS中Coretex-M处理器的常用寄存器的名称及作用。 2、 问题场景 在对Coretex-M处理器进行开发时&#xff0c;了解常用寄存器的名称及作用&#xff0c;可以&#xff1a; 编写正确的程序: 寄存器是程序员用…

【JavaEE -- 多线程3 - 多线程案例】

多线程案例 1.单例模式1.1 饿汉模式的实现方法1.2 懒汉模式的实现方法 2. 阻塞队列2.1 引入生产消费者模型的意义&#xff1a;2.2 阻塞队列put方法和take方法2.3 实现阻塞队列--重点 3.定时器3.1 定时器的使用3.2 实现定时器 4 线程池4.1 线程池的使用4.2 实现一个简单的线程池…

突破编程_前端_ACE编辑器(概述)

1 ACE 框架简介 ACE 框架是一个强大且灵活的前端文本编辑器框架&#xff0c;它提供了一套全面的 API 和丰富的功能&#xff0c;使得开发者能够轻松地在 Web 应用中集成功能强大的代码编辑器。ACE 编辑器不仅适用于在线代码编辑&#xff0c;还广泛应用于文档编辑、实时协作、富…

C语言- strcat(拼接函数的使用和模拟)

strcat&#xff08;拼接函数的使用和模拟&#xff09; strcat的语法 strcat 是 C 语言标准库中的一个字符串拼接函数&#xff0c;它用于将一个字符串&#xff08;source&#xff09;拼接到另一个字符串&#xff08;destination&#xff09;的末尾。该函数定义在 <string.h…

机器学习介绍

监督学习 监督学习涉及使用某种算法来分析过去的观察并从中学习&#xff0c;从而使您能够预测未来的事件。 监督学习的目标是提出或推断出一种近似映射函数&#xff0c;该函数可以应用于一个或多个输入变量&#xff0c;并产生输出变量或结果。 训练过程涉及采用非特征和标签的…

3.14号arm

1. 计算机基础理论 1.1 计算机的组成 输入设备&#xff1a;将数据转换成计算机可以识别&#xff0c;存储&#xff0c;处理的形式&#xff0c;发送到计算机中 输出设备&#xff1a;将计算机对程序和数据的运算结果输送到外部的设备 存储器&#xff1a;用于将数据保存的模块。 …

代码随想录刷题day24|回溯理论基础组合问题

文章目录 day24学习内容一、修剪二叉搜索树1.1、什么是回溯法1.2、递归与回溯1.3、回溯法的效率1.4、回溯法解决的问题类型1.5、如何理解回溯法1.6、回溯算法模板 二、组合问题2.1、思路2.2、正确写法-没有剪枝2.2.1、为什么不能写i < n2.2.2、为什么不能写startIndex02.2.3…

phpcms头像上传漏洞引发的故事

目录 关键代码 第一次防御 第一次绕过 第二次防御 第二次绕过 第三次防御 第三次绕过 如何构造一个出错的压缩包 第四次防御 第四次绕过 本篇文章是参考某位大佬与开发人员对于文件包含漏洞的较量记录下的故事&#xff0c;因为要学习文件包含漏洞&#xff0c;就将大佬…

什么是 HTTPS?它是如何解决安全性问题的?

什么是 HTTPS&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种安全的通信协议&#xff0c;用于在计算机网络上安全地传输超文本&#xff08;如网页、图像、视频等&#xff09;和其他数据。它是 HTTP 协议的安全版本&#xff0c;通过使用加…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Grid)

网格容器&#xff0c;由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 仅支持GridItem…

定时执行专家:自动截屏功能在电脑监控中的卓越应用

一、软件简介 定时执行专家&#xff0c;作为一款专业级的定时任务执行软件&#xff0c;不仅功能强大&#xff0c;而且操作简便。它支持25种任务类型&#xff0c;其中自动截屏功能尤为出色。通过这一功能&#xff0c;用户可以设定定时自动截取电脑屏幕&#xff0c;从而实现对电…

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署&#xff0c;那么如何进行部署呢&#xff0c;先把微服务的各个服务和中间件以及对应的端口列举出来&#xff0c;都打包成镜像&#xff0c;以及前端代码部署的nginx&#xff0c;使用docker-compose启动&#xff0c;访问服务器nginx…