MySQL索引、事务

news2024/11/27 14:46:48

目录

索引

作用

查看索引

创建索引

删除索引

索引背后的数据结构

B树

B+树

事务

事务的本质

事务的特性

并发执行事务产生的问题

脏读问题

不可重复读

幻读

MySQL中隔离级别

read uncommitted

readcommitted

repeatable read

serializable


索引

索引的本质就是为了加快数据库的查询速度。但是有利就有弊,同时也付出了一定的代价:

  • 空间代价来保存索引
  • 索引可能会拖慢增加、修改、删除的效率

但是总体来说,利大于弊。

作用

  1. 数据库中的表,数据,索引之间的关系就像是书架上的书、书里面内容、和书的目录之间的关系。
  2. 索引的作用就是类似于书的目录,用于快速的定位,检索数据。
  3. 索引对提高数据库性能有很大帮助。

查看索引

创建索引

 把表中的内容根据username创建了一个目录。

删除索引

索引背后的数据结构

根据特定的数据结构重新组织数据,在进行查询时,速度加快。

B+树:索引关键的数据结构。为数据库的索引量身制作的数据结构。

B树

我们先认识B树

B树可以认为是一个N叉搜索树。

 B树由于是一个N叉搜索树,所以当节点上的子树多了之后,节点保存的key也就多了,这就意味着在同样key的个数前提下,B树的高度要比二叉搜索树低很多。

当树的高度越高时,进行查询比较的时候,访问磁盘的次数就越多。

B+树

在B树的基础之后做了修改。同时也是N叉搜索树。

 整个树的所有数据都是在叶子节点上存储,而非叶子节点中的key最终都会出现在叶子节点上。

 B+树的特点

  •  一个节点,可以存储N个key,这N个key划分了N个区间(而不是N+1个区间)。
  • 每个节点中key的值,都会在叶子节点存在,同时该key是子节点的最大值。
  • B+树的叶子节点,是完整的数据集合,只在叶子节点这里存储数据的每一行的数据,而非叶子节点,只存储key值本身即可。

B+树的优势

  • 当前一个节点上存储了更多的key,最终树的高度是相对更低的,查询的时候减少了IO的访问次数。
  • 所有查询的节点最终都会在叶子节点上(查询任何一个数据,经过的IO访问次数是一样的)
  • B+树的所有叶子节点构成一个链表,此时就更加方便进行范围查询
  • 由于数据都存储在叶子结点上,非叶子节点只存储key值,导致非叶子节点占用空间时比较小的。

上述的B+树就是MySQL组织数据的方式。

也就是说当你看到一张数据库二维表时,实际上这个表不一定就是按照表格这样的数据形式来存储数据的,数据的组织结构也不在硬盘,也是很有可能就是按照上述的B+树来存储的。

具体是那种结构,取决于你表里面有没有索引,以及数据库使用了那种存储引擎。

上述B+树结构,就是默认按照ID为索引展开的。

事务

事务的本质

我们先来看看下面这样的情况:

比如转账操作:

账户表:account   (id   balance)

用户1要给用户2转账500块钱,那么在数据库中肯定是要把用户一的余额-500,把用户2的余额+500,如下SQL:
 

update account set balance = balance-500 where id = 1;

update account set balance = balance+500 where id = 2;

假如在数据库执行过程中,执行完成第一条语句之后,数据库宕机了,此时用户1的余额已经被扣除了,但是用户2的余额却没有到账。

事务就是为了解决上述问题。

事务的本质就是把多个SQL语句打包成一个整体,这个整体要么全部执行成功,要么全部执行失败。而不会出现上面这种执行一半的情况。事务保证原子性

如果采用事务出现了上述的这种情况,当第一条语句执行完成之后,数据库宕机了,当下次数据库重新启动的时候,就会把上次修改一半的数据进行恢复还原。

事务的特性

  1. 原子性(最核心的特性)。
  2. 一致性   事务在执行前和执行后,保证数据一定是有效的。
  3. 持久性   事务修改的内容是写在硬盘上的,持久存在的。
  4. 隔离性   这里的隔离性是为了解决并发执行事务的问题。

并发执行事务产生的问题

脏读问题

一个事务A在对数据进行修改的过程中,还没有提交之前,此时另一个事务B,也对同一个数据进行读取,此时B的操作就成为脏读。读到数据也是脏数据。(无效数据)。

解决方案

给写操作进行加锁,当给写操作进行加锁之后,在修改数据的时候就不能同时进行读取数据了,这就意味着写操作和读操作不能同时进行了,不能并发执行了。

这个给写操作进行加锁,将降低了并发的效率,但同时提高了隔离性。提高了数据的准确性。

不可重复读

事务1已经提交了数据,事务2开始读数据,在读取的过程中,事务3又提交了新数据。

这就意味着同一个事务2,对此读取数据,读取出来的数据是不一致的,(预期是一个事务中,多次读取结果都是一样的)。这就叫不可重复读。

解决方案

通过给读操作进行加锁,这就意味着在读数据库的时候,其他事务不能进行修改数据,这就保证了多次读取数据的一致性。但是同时也是降低了并发的效率。进一步提高了事务的隔离性,数据的准确性又提高了。

幻读

当前我们约定给读操作和写操作进行加锁,解决了不可重复读和脏读问题。

在给读加锁和写加锁的前提下,一个事务多次读取数据,发现数据值是一样,但是数据的结果集不一样。这就产生了幻读问题。

解决方案

数据库使用串行化的方式来解决幻读问题,具体就是彻底的放弃并发处理事务,采取串行方式来一个接着一个的处理事务,这样做,并发程度是最低的,同时效率也是最低的,但是隔离性却是最高的,数据的准确性也是最好的。

对于上述的问题,MySQL提供了4中隔离级别,就对应上述的几个情况。

MySQL中隔离级别

read uncommitted

没有任何的锁的限制,并发程度是最高的,效率也是最高的,但是隔离性却是最低的,数据的准确性是最低的。

readcommitted

给写加锁了,并发程度降低 隔离行提高了

repeatable read

给写和读都进行了加锁,并发程度又降低了,隔离性又提高了

serializable

彻底的串行化执行,并发程度最低,隔离性最高。

上述的4种隔离级别,但是MySQL内置的机制,可以通过修改MySQL的配置文件进行设置当前工作在那种状态下。

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

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

相关文章

SolidUI AI生成可视化,0.1.0版本模块划分以及源码讲解

1.背景 随着文本生成图像的语言模型兴起,SolidUI想帮人们快速构建可视化工具,可视化内容包括2D,3D,3D场景,从而快速构三维数据演示场景。SolidUI 是一个创新的项目,旨在将自然语言处理(NLP)与计算机图形学相…

【Java虚拟机学习1】JVM运行时数据区

JVM运行时数据区 一、前言 我们知道Java程序是运行在JVM(Java虚拟机)上的,Java程序运行时会占用一定的内存,在虚拟机自动管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现…

指针进阶详解(下)

指针进阶详解(下) 前言1. 函数指针1.1 两端有趣代码 2. 函数指针数组2.1 函数指针数组的用途之一:转移表 3. 指向函数指针数组的指针4. 回调函数5. 结尾 前言 在指针进阶详解(上)中,我们已经介绍了部分指针…

基于数据安全的风险评估(三):风险分析与评估

完成了资产识别、脆弱性识别及威胁识别后,我们可以采用适当的方法和工具确定威胁利用脆弱性导致安全事件发生的可能性。综合安全事件作用资产价值及脆弱性的严重程度,判断事件造成的损失及对组织的影响,即安全风险。 一 风险计算形式及关键环…

HTTP协议对比HTTPS协议

HTTP协议对比HTTPS协议 1. HTTP协议1.1 概述1.2 HTTP协议格式1.3 HTTP协议支持的方法1.3.1 GET方法1.3.2 POST方法1.3.3 其他HTTP方法1.3.4 GET对比POST 1.4 请求报文1.4.1 Content-Type:请求体中数据格式1.4.2 Cookie:浏览器缓存 1.5 响应报文1.5.1 状态…

LED驱动(原始架构优化:分层/分离)——STM32MP157

文章目录 优化思想:分层Demo的LED驱动程序led_opr.hboard_demo.cleddrv.cledtest.cMakefile编译测试 STM32MP157的LED驱动程序board_stm32mp157.cleddrv.cled_opr.hMakefiel编译测试 优化思想:分离Demo的LED驱动程序led_resource.hboard_A_led.cchip_dem…

MacOS系统(M1/M2)安装AI绘画StableDiffusion保姆级教程

TOC 安装完成后,推荐阅读这篇教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 实操环境: macOS 13 Arm64(建议12以上的系统使用) Apple M1 先来看几个样例: AI绘画S…

goland自定义代码模版

在 GoLand 中我们既可以修改已有代码模版,也可以新建属于我们自己的代码模版,按需配置。 一、修改已有代码模版 现在代码编辑页输入你想更改的代码模版,然后点击右下角的小灯泡按钮,接着选中编辑活动模版设置即可。 二、新建…

[机缘参悟-99] :关于局部最优与全局最优解的人生感悟

在没有获取全局信息之前,要获得全局最优解几乎是不可能的,最多是概率大一点而已,大多数时候,由于时空资源的限制,获得往往是局部最优解,局部最优解,放在全局,往往并非全局最优&#…

数学专题训练3 数论1

1. Problem - 27E - Codeforces 给定 n ( 1 ≤ n ≤ 1000 ) n(1 \le n \le 1000) n(1≤n≤1000)​​​,找到因子个数恰好为 n n n​​​ 个的最小正整数. 保证答案不大于 1 e 18 1e18 1e18. 和 反素数 的思路是一样的,深搜 这个是枚举当前数字可以…

Shiro反序列化漏洞(CVE-2016-4437)+docker靶场+工具利用

一、Shiro反序列化漏洞-CVE-2016-4437原理 将java对象转换为字节序列(json/xml)的过程叫序列化,将字节序列(json/xml)恢复为java对象的过程称为反序列化。 Shiro框架提供了“记住我”的功能,用户登陆成功…

JPA 概述及常用注解详解、SpringDataJpa 使用指南

JPA(Java Persistence API)是 Java 标准中的一套ORM规范(提供了一些编程的 API 接口,具体实现由 ORM 厂商实现,如Hiernate、TopLink 、Eclipselink等都是 JPA 的具体实现),借助 JPA 技术可以通过…

Unity3D 入门

文章目录 拖拽快捷键资源商店地形构建器 拖拽快捷键 首先看到Scene界面,我们布置游戏场景中的游戏对象基本是在这个界面完成的 鼠标滚轮键按住:能够拖拽平面,不移动对象鼠标右键按住:能够旋转我们观察界面的视角,不移…

快速理解并实现权限控制

什么是权限控制? 权限控制是指在一个系统或应用中对用户或角色的操作进行限制和管理的过程。它用于确保只有经过授权的用户或角色能够执行特定的操作或访问特定的资源。权限控制是信息安全和访问控制的重要组成部分。 权限控制的主要目的是保护系统的安全性和完整性&#xf…

GEE:支持向量机(SVM)分类参数说明和官方案例

作者:CSDN @ _养乐多_ 本文记录了在GEE平台上进行支持向量机(SVM)分类使用ee.Classifier.libsvm的说明和官方案例。 文章目录 一、函数介绍1.1 GEE上说明1.2 函数说明二、官方案例一、函数介绍 1.1 GEE上说明 ee.Classifier.libsvm(decisionProcedure, svmType, kernelTyp…

CentOS5678 repo源 地址 阿里云开源镜像站

CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$r…

Springboot JPA 集成多租户

背景: ​ iot-kit项目用的是jpa,不是mybatis,项目中需要引入多租户 参考文章: 【讲解多租户的实现与原理】 https://www.bilibili.com/video/BV1F84y1T7yf/?share_sourcecopy_web&vd_source981718c4abc87423399e43793a5d3…

pytest实现用例间参数传递的方式

pytest实现用例间参数传递的方式 一、通过conftest创建全局变量二、使用tmpdir_factory方法 我们在做接口自动化测试的时候,会经常遇到这种场景:接口A的返回结果中的某个字段,是接口B的某个字段的入参。如果是使用postman,那我们可…

前端精度丢失处理

前端操作数据时,如果数据超出一定范围会出现精度丢失的问题,这是因为,在传输过程中,数据类型被转换成Number,Number的精度范围在2^53之间,即 -9007199254740991 ~ 9007199254740991,超出范围就会…

Unity游戏源码分享-迷你高尔夫球游戏MiniGolfConstructionKitv1.1

Unity游戏源码分享-迷你高尔夫球游戏MiniGolfConstructionKitv1.1 有多个游戏关卡 工程地址:https://download.csdn.net/download/Highning0007/88052881