【MySQL】索引事务

news2025/1/16 7:46:30

摄影分享~
在这里插入图片描述
在这里插入图片描述

文章目录

  • 索引
    • 概念
    • 使用场景
    • 使用
  • 事务
    • 概念
    • 使用
    • 事务的特性

索引

概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引并指定索引的类型,各类索引有各自的数据结构实现。
通过目录,就可以快速的找到某个章节对应的位置。=》索引的效果,就是为了加快查找的速度。

使用场景

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

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间。
    满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
    反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引

使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

  • 查看索引
show index from 表名;

在这里插入图片描述
表里如果有主键,主键这一列就会自动创建索引。
unique和foreign key也会自动创建索引。

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

在这里插入图片描述
创建索引,最好的方式是在表创建之初就把索引做进去了。否则,如果是针对一个表中已经有很多很多记录来创建索引。这是一个很危险的操作。

  • 删除索引
drop index 索引名 on 表名;

在这里插入图片描述
SQL是通过数据库的执行引擎来执行的,此处涉及到一些“优化”操作
索引其实是不好预期的,我们可以使用explain这个关键字,显示出查询过程中具体的使用索引的情况。
在这里插入图片描述
索引在mysql中的数据结构是什么?
索引的主要目的是为了加快查找速度。
N叉搜索树,每个节点上有多个值,同时有多个分叉。数的高度就降低了。
其中一种典型的实现,叫做B树。
在这里插入图片描述
比较次数虽然没有减少,但是读写硬盘的次数减少了。
B树已经可以比二叉搜索树更适合于做数据库引擎了,但是还不够。针对这里,又引入了B+树。是对B树的进一步改进。B+树就是为了索引这个场景,量身定做的数据结构。
在这里插入图片描述

  1. B+树也是一个N叉搜索树,每个节点上可能包含N个key,N个key划分出N个区间,最后一个Key就相当于最大值。
  2. 父元素的key会在子元素中重复出现,并且是以最大值方式出现的(**这样的重复出现,导致叶子节点就包含了所有数据的全集。非叶子节点中的所有值都会在叶子节点中体现出来。
    **)
  3. 会把叶子节点,用类似于链表的方式,首尾相连。

上述B+树,就带来了一些好处。

  1. 作为一个N叉搜索树,高度降下来,比较的时候,硬盘IO次数就比较少了。
  2. 更适合进行范围查询
  3. 所有的查询,都是要落在叶子节点上的,无论查哪个元素,中间比较的次数差不多,查询比较均衡
  4. 由于所有key都会在叶子节点中,只需要把所有的数据行放在叶子节点中即可。在这里插入图片描述

由于非叶子节点只存了简单id,没有存一整行,这就意味着非叶子结点占用的空间是大大降低的。有可能在内存中可以放进去缓存,更进一步降低硬盘IO。
有的表,不只是主键索引,还有别的非主键列,也有索引。(这个情况会构造另一个B+树,B+树非叶子节点里面存的都是这一列里面的key,到了叶子节点这一层,不是存之前完整的数据行,而是存主键id)
使用主键列来查询,只要查一次B+树就可以了。如果使用非主键列的索引来查询,则需要先查一遍索引列的B+树,再查一遍主键列的B+树。
B+树这个结构,只是针对MySQl的InnoDB这个数据库引擎,里面所典型使用的数据结构。
不同的数据库,不同的引擎,里面的存储数据的结构还可能存在差异。

事务

概念

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

使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功
回滚rollback:回滚就是把执行过得操作逆向恢复回去。类似于电脑上的ctrl+z 。

事务的特性

  1. 原子性:把多个操作打包成一个整体,就叫做原子性。“原子性”是事务最核心的特性。
  2. 一致性:事务执行前后,都得是数据合法的状态。
  3. 持久性:(持久=>硬盘)事务产生的修改,都是会写入硬盘的。即使程序重启,事务都可以正常工作。保证修改是生效。
  4. 隔离性(重点):一个数据库服务器。同时执行多个事务的时候,事务之间的“相互影响程度”。

mysql服务器,要同时给多个客户端提供服务。此时多个客户端之间,可能会同时发起事务,尤其是这多个事务在操作同一个数据库的同一个表的时候,就可能引起一些麻烦。
如果隔离性越高,就意味着事务之间的并发程度越低,执行效率是越慢,但数据的准确性是越高的。
如果隔离性越低,就意味着事务之间的并发程度越高,执行效率是越快,但数据的准确性是越低的。
有时候根据我们的需求不同,对执行效率,准确性的要求就不同。(具体场景,具体实现)
mysql给我们提供了不同档位即mysql的隔离级别(就可以控制隔离性的高低、并发程度的高低,执行效率的高低,数据准确性的高低)

举个例子:
有一天,A看到B正在写一道很难的高数题,正好A也不会,就瞄了一眼B的做题记录。在A瞄完之后,B发现自己的做题思路错了!然后把之前的做题记录修改了。A瞄到的记录实际上是错误的。这种情况,就称为**“脏读”问题(dirty data)(即读到的这个数据有问题!)**。解决脏读问题的办法,就是降低并发性,提高隔离性。具体来说,就是给B的做题过程加密。也就是B做的时候,A不要看!当达成这个约定后,B在完成这个困难的高数题之后,A再看。A看的时候,此时B觉得自己还闲的不行。就想做这个高数题的扩展部分。B在做的时候发现原题可以有更好的解法,就把答案给改了。此时A看到的答案突然又被改了。此时这个情况就叫做“不可重复读”(即一个事务中,连续两次读到的数据,结果不一致)。如何解决这个问题呢?给读这个操作,也加锁~也就是A在看B的答案的时候,B不能修改!这两个事务之间的并发程度,进一步降低了。隔离性提高了,但与此同时,运行速度又进一步变慢了。但数据的准确度又进一步提高了。B说你小子!得,你慢慢看。我不改了!我去做大学物理题!省的我在这闲着!此时 A读到的高数题内容虽然没有变,但是他发现B在这段时间写的作业量变了!这个问题,就叫做“幻读问题(即在同一个事务中,两次读到的结果集不同)

针对以上情况,MySQL提供了四个隔离级别。

  1. read uncommitted:不做任何限制,事务之间都是随意并发执行的。并发程度最高。隔离性最低,会产生脏读+不可重复读+幻读问题。
  2. read committed:对写操作加锁了。并发程度降低了,隔离性提高了。解决了“脏读”问题,仍然存在不可重复读+幻读
  3. repeatable read:对写和读都加锁了,并发程度又降低了,隔离性又提高了。解决了脏读和不可重复读的问题,可能存在幻读问题。
  4. serializable:严格串行化,并发程度最低,隔离性最高,解决了脏读+不可重复读+幻读问题,执行速度最慢

在实际开发中就可以根据当前要解决的问题的需求场景,来决定来使用哪个隔离级别。
通过mysql的配置文件来进行调整的。

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

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

相关文章

如何使用数字示波器

本文介绍以鼎阳SIGLENT SDS1122E数字示波器为例。 带了一根电源线;两根信号线,每根信号线都有几个小配件,如下所示: 使用概述 我们都知道万用表(又称欧姆表)是工程师最常用的调试电路的工具,但万…

技术+商业“双轮”驱动,量旋科技加速推进全方位的量子计算解决方案

【中国,深圳】4月14日,在第三个“世界量子日”,以“‘双轮’驱动 加速未来”为主题的量旋科技2023战略发布会在线上举办。 本次发布会,量旋科技全线升级了三大业务线产品:其中重点布局的超导量子计算体系产品&#xf…

监控系统 Prometheus 的说明

一、Prometheus 是什么? ELK Stack 日志收集和检索平台想必大家应该比较熟悉,Elasticsearch Filebeat Logstash Kibana。 而 Prometheus 就相当于一整个 ELK,但是它其实并不是适合存储大量日志,也不适合长期存储(默…

【AI绘图学习笔记】transformer

台大李宏毅21年机器学习课程 self-attention和transformer 文章目录Seq2seq实现原理EncoderDecoderAutoregressive自回归解码器Non-Autoregressive非自回归解码器Corss-attention总结TrainingtrickCopy MechanismGuided AttentionBeam Search强化学习(Reinforcement…

AVL树,红黑树,红黑树封装map和set

文章目录AVL树AVL树的实现AVL树的节点AVL树的平衡因子AVL树的插入AVL树的旋转左单旋右单旋左右正旋右左正旋中序遍历打印节点判断子树是否平衡整体代码验证代码红黑树概念性质(规则)红黑树的实现结点定义插入parent在grandparent的左情况一:u…

登录认证功能的统一拦截技术(拦截器)

目录 1.说明 2.使用方法 (1) 定义拦截器 (2)注册配置拦截器 (3)示例: 3.interceptor详细说明 (1)拦截路径 (2)执行流程 (3)过滤器和拦截器的区别 4.登录校验的拦截器实现 5.全局异常处理(补充说明) 1.说明 拦截器是一种动态拦截方法调用的机制&#xff0…

3年功能测试被辞,待业3个月,2023不会自动化测试真的找不到工作吗?

前言 来自一位粉丝的投稿,在测试行业已近打拼了3年,一直兢兢业业,前不久被公司以人员优化的理由辞退,到现在已近过去了3个月还没有找到测试工作,让她很焦虑,我通过和她的交流才发现她最大的问题就是技术方…

从零开始学习Python中UnitTest测试框架:实现高效自动化测试流程

目录:导读 引言 1.白盒测试原理 2.自动化测试用例编写 3.UnitTest测试框架 3.1UnitTest组件(测试固件) 3.1.2测试套件 3.1.3测试运行 3.1.4测试断言 3.1.5测试结果 3.2unittest测试固件的详解 3.2.1测试固件每次均执行 3.2.2测试…

【JavaEE】CAS机制(比较并交换)

哈喽,大家好~我是你们的老朋友保护小周ღ,本期为大家带来的是 CAS (compare and swap) 比较并交换,CAS 是物理层次支持程序的原子操作,CAS 是一种完全不同于 synchronized 锁保证多线程安全问题的机制,可以用来进行无锁…

Java基础——Stream流

(1)Stream流概述: 1.什么是Stream流? 用于简化集合和数组操作的API。结合了Lambda表达式。方便操作集合/数组的手段(集合/数组才是开发的目的)。2.体验Stream流的作用: import java.util.Arr…

高并发场景I/O优化

大家好,我是易安! Java I/O是一个众所周知的概念。它常被用于读写文件、实现Socket信息传输等操作,这些都是系统中最常见的与I/O相关的任务。 我们都了解,I/O的速度相较于内存速度较慢。在当前大数据时代背景下,I/O性能…

java足球体育新闻资讯发布系统ssh

为 本系统的功能目标分为以下几个模块:用户管理模块、足球新闻类别管理模块、足球新闻管理模块、留言管理模块和前台足球新闻浏览模块。 系统功能模块的划分,是在需求分析基础上进行的,是把具有复杂功能的系统通过设计分解为具有基本独立&…

【并发编程】AQS源码

ReentrantLock 互斥锁,可重入 AQS是可以支持互斥锁和共享锁的,这里只分析互斥锁的源码 加锁 公平锁和非公平锁 公平锁 final void lock() {acquire(1); //抢占1把锁.}// AQS里面的方法public final void acquire(int arg) { if (!tryAcquire(arg) &&acq…

MySQL:事务、索引、用户管理、备份、数据库设计(三大范式)

文章目录Day 03:一、事务1. 原则2. 测试实现二、索引1. 分类2. 创建索引3. 分析 sql 执行的状况4. 测试索引5. 索引原则三、数据库用户管理四、备份五、规范数据库设计1. 三大范式注意:Day 03: 一、事务 事务(transaction):要么…

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

『pyqt5 从0基础开始项目实战』04. 表格数据的初始化(保姆级图文)

目录导包和框架代码准备json数据文件表格数据接入1. 准备文件路径2. 读取json数据3. 将得到的json数据放入table设置单元格不可修改把数据中的数字转为映射内容完整代码总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏,持续更新中 欢迎关注 『pyqt5 从0基础开始项…

TiDB实战篇-备份恢复策略

简介 简要说明TiDB备份恢复策略。 备份的类型 热备 TiDB使用MVCC机制实现设备的。 冷备 需要停机备份。 温备 备份的时候只能读不能够写。 备份技术 逻辑备份 物理备份 物理备份的限制 基于复制的备份 复制恢复是最快的。(TiDB CDC,TiDB Binlog&#xff…

【C语言】函数详解(嵌套调用和链式访问、声明及定义、递归)

简单不先于复杂,而是在复杂之后。 目录 1.函数的嵌套调用和链式访问 1.1 嵌套调用 1.2 链式访问 2. 函数的声明和定义 2.1 函数声明 2.2 函数定义 3. 函数递归 3.1 什么是递归? 3.2 递归的两个必要条件 3.2.1 练习1(需要画图…

Spring Security实战(三)—— 自动登录与注销登录

目录 一、实现自动登录 1. 散列加密方案 2. 持久化令牌方案 二、注销登录 一、实现自动登录 自动登录是将用户的登录信息保存在用户浏览器的cookie中,当用户下次访问时,自动实现校验并建立登录态的一种机制。 Spring Security 提供了两种非常好的令牌&a…

C ++ 基础入门。加强变量、指针、结构体理解

1、 const放外面,值不可以改。只读 同理于指针 看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量 const 放外面,值不可以改 2、 所有的指针类型,包括结构体指针 double * int *都是和操作系统位数…