mysql中的事务和索引

news2024/11/25 4:18:58

1. 索引

        索引:index(下标)->目录

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

1.1 索引的作用

        MySQL 索引是一种数据结构,用于加快数据库查询的速度和性能,数据库是把数据存储在硬盘上的;

        MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高MySQL 的检索速度。

        举例说明:

  • MySQL 索引类似于书籍的索引,通过存储指向数据行的指针,可以快速定位和访问表中的特定数据。

1.2 索引的使用场景 

        创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为WHERE 子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。索引虽然能够提高查询性能,但也需要注意以下几点:

        1、索引需要占用额外的存储空间。

        2、对表进行插入、更新和删除操作时,索引需要维护,可能会影响性能。

        3、过多或不合理的索引可能会导致性能下降,因此需要谨慎选择和规划索引。

        满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

1.3 索引的使用

        创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约(FOREIGN KEY)时,会自动创建对应列的索引,接下里我们来学习一些索引的基本操作和使用

1.3.1 查看索引

        Show index from 

show index from chengyuan;

        结果如下:我们将显示之前创建的成员表的所有索引(其中下图表一和表二是一个图);

表一:

表二:

        由此可以看到,执行上述显示表的所有索引命令后,将会显示指定表中所有索引的详细信息,如:索引名称(Key_name)、索引列(Column_name)、是否是唯一索引(Non_unique)、排序方式(Collation)、索引的基数(Cardinality)等

         注意:

        Mysql中的primary key和unique和foreign key都会生成自动索引。这几个操作都会频繁涉及到查询。

        一个表的索引,可以有多个。每个索引,都是根据某个具体的列来展开的。后序按照这个列来查询,这个时候才能提高效率。(类似于同一个字典,有很多个目录,拼音,笔画,偏旁部首)

1.3.2 创建索引

        Create index 索引名 on 表名(列名);//那个表的那个列

        对于非主键、非唯一约束、非外键的字段,可以创建普通索引,使用 CREATE INDEX 语句可以创建普通索引。普通索引是最常见的索引类型,用于加速对表中数据的查询。

 create index index_chengyuan_id on chengyuan(id);

        结果如下:

表一:

表二:

        注意:

        创建操作是一个比危险的操作。如果表数据时空着或者比较少,此时创建索引就没有关系。

如果表本身有很多数据,此时常见索引,就会出发大量的硬盘io;

1.3.3 删除索引

        Drop index 索引名 on 表名;

drop index index_chengyuan_id on chengyuan;

        以上操作就是删除我们刚才创建的index,结果如下;

        产看当前表的索引:

表一:

表二:

1.4 索引保存的数据结构 

        Q:DICENG索引底层数据结构的实现?

        A:1、索引其实就是通过额外的数据结构,来针对表里的数据进行重新组织,使用啥样的结构,对于查询的时间和表占用的空间都有很大的影响的。且顺序表,链表,栈,队列(不适合进行查找)

        2、因此,数据库的索引使用了一个B+树作为数据结构---->B+树,相当于是针对数据库这个场景,量身定做的。学习B+树之前首先了解B树,即B-树(-是连字符,不是减号,因此不读B减树)

1.4.1 B树

        B树是一个N叉搜索树(要求这里是有序的),就是在二叉搜索树里面进行了扩展(一个节点可能包含n个值,n个值划分出了n+1个区间。)下图是B树的数据结构;

        即同样高度的树,相比于二叉搜索树来说能表示的值会跟多。

        我们在使用b树来查询的时候,虽然比较次数比二叉搜索树多。但是,这里的关键在于,同一个节点的这些key都是一次硬盘io就读出来的。所以即使总的比较次数增加了,但是硬盘io的次数就少了(一次硬盘io相当于内存中惊醒1w次比较)

1.4.2 B+树

        在B树的基础上,我们引入了B+树同样是n叉搜索树,每个节点包含多个key,n个key划分出n个区间(每一个节点的key会在左下方的key的最右边显示出来),B+树的数据结构图如下所示:

        B+树的特点:

  1. n叉搜索树,每个节点上都包含n个key,n个key划分出n个区域
  2. 每个节点的n个key中,会存在一个“最大值”(设成最小值也一样)
  3. 每个节点的key都会在子树中重复出现。(好处:所有的数据都会包括在叶子结点的数据中)

      4.把叶子节点使用链式结构相连。(此时我们进行范围查询就会十分方便)

        优点:

  1. 如果没有这一个链式列表结构,就可能需要反复的对树进行回溯
  2. 针对B树查询,b+树的查询时间是比较稳定的。查询任何一个元素,都是需要从根节点查询到叶子结点的,过程中经过的硬盘io次数是一样的(b树,有时候的硬盘io多,有时候少,不稳定)
  3. 按照上述结构来存储的话,只需要在叶子结点来存储,其他的非叶子节点只存储key,这个key十个整数,占用空间是比较少的。一个key才4个字节,100w个key才是4mb,这些非叶子节点的数据,是可以缓存到内存中去的,这个时候我们在进行查询的时候,可以只进行内存的比较了,大幅度减少了硬盘的io次数.

2. 事务

2.1 事务的概念

        事务就能让多个执行语句要么都执行成功,要么语句都执行失败。(其实是执行了,但是数据恢复的时候,将之前执行的数据恢复了---此行为叫回滚rollback)

        事务的原子性本质上是依托于回滚机制的。通过回滚到机制把数据恢复到之前的状态。

        数据库对于事务治理有特殊的机制(undo + redo log)通过日志,printin,写到文件里记录之前的数据,进行的操作。

        数据库中间挂了,但是日志保存下来了,等到数据库重启之后,读取之前的日志,看看是否有执行了一半的事务,如果有,将之前执行过的数据进行回滚。

        虽然事务让数据变得更加靠谱,但是付出了巨大的执行效率代价。

2.2 事务需要满足的四大条件

  1. 原子性,通过事务,把多个操作打包到一起(事务最重要的特性)
  2. 一致性:相当于原子性的衍生,当数据库中出现问题了,不会产生向上述这种“钱凭空消失”这种不科学的现象,另一方面,还通过约束,来避免出现一些非法的情况。
  3. 持久性:事务人核对修改都是持久化存在的(写入硬盘的),无论是重启程序、还是重启主机、修改都不会丢失。(数据库本身就是为了持久存储)
  4. 隔离性:多个事务并发执行的时候,可能会带来一些问题,通过隔离特性来对这些问题进行权衡,看你是希望数据尽量准确,还是速度尽量快。

2.3 多线程与事务

        多线程:属于是“并发编程”中的一种典型实现方式。

        如果多个客户端,同时给服务器数据库发送事务请求,这个时候叫做“并发执行事务”

        如果多个事务修改不同的表,问题不大;如果是修改相同的表,就可能产生一些bug。

详细bug如下图所示:

Bug1:脏读问题。

        当前有两个事务1,2

事务1:修改了某个数据,但是事务本身还没有提交(提交->告诉数据库服务器,完毕)

事务2:读取了同一个数据,此时实务二读到的数据可能是脏的数据,因为事务1后序可能还要再次修改代码

        解决脏读问题,核心思想降低事务的并发程度,给写操作进行加锁。(意味着释放之前,其他人是不能访问的)-->写的时候不能读,写完之后提交之后释放,才可以让别人读了

Bug2:不可重复读:

        不可重复读,是在写“加锁”的前提下导致的,虽然写了加锁,但是可以分为多个事务,多次提交的方式来修改数据,虽然没有之前频繁,但是也是可能会出现的

       有事务1,2,其中事务一,先修改数据(加锁),此时事务二读取数据,就需要事务一提交完。等到事务一提交了之后,事务二开始读数据(实务二可能会多次读取数据)

       又来了一个事务3,这就导致事务二两次读取的数据是不一样的(刚刚的规则,写的时候不能读,但没有读的时候不能写),事务二要求两次读到的同一个数据是一样的。

       解决这个问题,就是进行“读加锁”操作,在读的时候不能写,虽然该操作让并发程度降低了,但是准数据的确性就提高了。

Bug3、幻读:

       事务一和二:事务一修改数据,提交,事务二开始读数据;

        此时事务三,新增了一个其他的数据,所以事务二就可能出现两次读取的“结果集”不同。(查询的时候,有不同的行)

        解决幻读问题,串行化,不在进行任何并发了,每个事务都是串行执行的(执行完第一个,在执行第二个,在执行第三个)

        上面问题的解决措施:

Mysql在配置中,提供了“隔离级别”这样的选项,我们可以根据需要,调整隔离级别,适应不同的情况。

  1. read uncommitted;读未提交,并行程度是最高的,隔离程度是最低的,效率是最高的,数据是不靠谱的,此时不可能出现上述的三个大问题。
  2. read committed;读已提交,相当于给写加锁,并行程度降低了,隔离程度提高了,效率数据会靠谱一些,此时可能会出现不可重复读+幻读(事务之间,影响越小,就是隔离程度越高)
  3. repeatable read 可重复读,相当于给读操作和写操作都加了锁,并行程度降低了,隔离程度提高了,数据更靠谱了,效率降低了,此时可能出现幻读。(一般来说,是默认的隔离级别)
  4. serializable 串行化,让所有的事务都串行化执行,并行程度最低,隔离程度最高,效率最低,数据最靠谱。

ps:本次的内容就到这里了,如果大家感兴趣的话就请一键三连哦!!!

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

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

相关文章

MVVM响应式

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介MVVM响应式1. 什么是MVVM模式?2. Vue中的响应式数据3. 数据绑定与视图更新⭐ 写在最后⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

SWUST-会理财的小明

一波操作之后我发现我在乱写,发现原来利息是这样算的 然后我一波操作之后发现也不是这样算的。原来利息是这样算的 原来是幂运算! 什么东西。。。 原来总金额就是本金*(1利率)^年限。利息就是总金额-本金!&#xff01…

一款DC-DC控制器应用方案

一、General Description The TX5121 is a step-up DC/DC converter specifically designed to drive up to 6 series white LEDs with constant current. Series connection of the LEDs provides identical LED currents resulting in uniform brightness and eliminates th…

要使自己用C++制作的游戏可以多人在不同电脑上对战要学什么?

要使自己用C制作的游戏可以多人在不同电脑上对战要学什么? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「C的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享…

揭秘 Go 中 Goroutines 轻量级并发

理解 Goroutines、它们的效率以及同步挑战 并发是现代软件开发的一个基本概念,使程序能够同时执行多个任务。在 Go 编程领域,理解 Goroutines 是至关重要的。本文将全面概述 Goroutines,它们的轻量级特性,如何使用 go 关键字创建…

【Mode Management】CanSM详细介绍

1. Introduction and functional overview AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。 CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个…

实现单链表的基本操作(力扣、牛客刷题的基础笔试题常客)

本节来学习单链表的实现。在链表的刷题中,单链表占主导地位,很多oj题都在在单链表的背景下进行;而且很多链表的面试题都是以单链表为背景命题。所以,学好单链表的基本操作很重要 目录 一.介绍单链表 1.链表及单链表 2.定义一个…

【设计模式--结构型--代理模式】

设计模式--结构型--代理模式 代理模式概述结构静态代理案例:卖车票jdk动态代理cglib代理三种代理对比优缺点使用场景 代理模式 概述 由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接引用目标对象&#xff0…

Java集合大家族(学习推荐版,通俗易懂)

4.集合(ArrayList)、其他集合框架及容器遍历方式 1.ArrayList 注意:索引从0开始 该集合可以添加任意类型的数据,要约束添加数据的类型,需用泛型约束(jdk1.7开始支持泛型) 删除遍历集合方式1&a…

卡尔曼(kalman)滤波学习测试例

下面两套代码一套是python,一套是matlab,效果是一样的。 PYTHON import numpy as np import matplotlib.pyplot as pltt np.arange(1, 1001) nsig 5 * np.sin(0.01 * t) np.random.rand(len(t)) np.random.randn(len(t)) 5 * np.cos(0.05 * t np.…

mac电脑m1 arm架构安装虚拟机教程

1、准备一台虚拟机,安装CentOS7 常用的虚拟化软件有两种: VirtualBoxVMware 这里我们使用VirtualBox来安装虚拟机,下载地址:Downloads – Oracle VM VirtualBox 001 点击安装 002 报错:he installer has detected an…

js禁止打开控制台,如何强行打开控制台?

当我在查看某个网站的源码时,按F12会跳转到百度页面,或者先打开F12再输入网站也会进入到百度首页。 首先我们要关闭控制台进入到这个网站的首页,然后右键查 看网站的源码。 1.找到这个js文件,点进去。 2.点击这个js文件之后&a…

sensitive-word 敏感词之 DFA 双数组实现源码学习

拓展阅读 敏感词工具实现思路 DFA 算法讲解 敏感词库优化流程 java 如何实现开箱即用的敏感词控台服务? 各大平台连敏感词库都没有的吗? v0.10.0-脏词分类标签初步支持 v0.11.0-敏感词新特性:忽略无意义的字符,词标签字典 …

SpringSecurity深度解析与实践(2)

目录 引言1.Springboot结合SpringSecurity用户认证流程1.1 配置pom文件1.2.配置application.yml 2.自定义MD5加密3.BCryptPasswordEncoder密码编码器4.RememberMe记住我的实现5.CSRF防御5.1.什么是CSRF 引言 上篇网址 1.Springboot结合SpringSecurity用户认证流程 1.1 配置p…

【Date对象】js中的日期类型Date对象的使用详情

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript小贴士 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续…

RocketMQ系统性学习-RocketMQ高级特性之消息存储在Broker的文件布局

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

2023.12.19 关于 Redis 通用全局命令

目录 引言 Redis 全局命令 SET & GET KEYS EXISTS DEL EXPIRE TTL TYPE redis 引入定时器高效处理过期 key 基于优先级队列方式 基于时间轮方式 引言 Redis 是根据键值对的方式存储数据的必须要进入 redis-cli 客户端程序 才能输入 redis 命令 Redis 全局命令 R…

手写单链表(指针)(next域)附图

目录 创建文件: 具体实现: 首先是头插。 注意:一定要注意:再定义tmp时,要给它赋一个初始值(推荐使用 new list_next) 接着是尾插: 随后是中间插: 然后是最简单的改值&#xf…

【Linux】权限篇(一)

权限篇目录 1. 前言2. shell3. 权限介绍3.1 什么是权限3.2 权限的本质3.3 Linux中的用户3.4 Linux中文件的权限 1. 前言 在之前的博客中已经学习了一些相关的操作,这次来分享的是与Linux的权限有关的一些笔记。 在正片开始之前,先来讲讲外壳(shell)。 …

实体店如何进行线上线下统一管理

随着互联网的普及和消费者行为的改变,实体店不再满足于单一的线下销售模式,开始探索线上线下的融合。本文将介绍如何通过搭建小程序和乔拓云平台,实现实体店的线上线下统一管理。 实体店可以通过微信小程序搭建自己的线上平台,实现…