【MySQL】索引和事务重点知识汇总

news2025/1/26 15:33:44

目录

    • 1.索引:
      • 1.1 索引的使用:
      • 1.2 索引背后的核心数据结构:
        • 1.2.1 先认识 B 树(N叉搜索树):
        • 1.2.2 再认识 B+ 树(N叉搜索树):
    • 2.事务:
      • 2.1 隔离性:
        • 2.1.1 脏读问题:
        • 2.1.2 不可重复读问题:
        • 2.1.3 幻读问题:
        • 2.1.4 总结:
        • 2.1.5 隔离级别:

1.索引:

  1. 索引存在的意义就是为了提高查询到效率.
  2. 索引的作用就类似与一本书的目录,通过目录就可以快速找到想要的内容.如果没有目录就只能一页一页的翻(遍历).
  3. 使用索引付出的代价(有得就有失): a)消耗了更多的空间,b)虽然提高了查找效率,但是降低了增删改的效率(因为插入修改记录,不仅需要修改硬盘的数据还要调整索引).
  4. 虽然索引有一些代价但是仍然认为还是值得使用索引的,因为大多数情况下查询的频率是高于增删改的.

1.1 索引的使用:

  1. 对于生产环境上比较大的表,一般都是建表之初就把索引都规划好,这样就会避免很多的低效操作.

  2. 查看索引, show index from 表名;在这里插入图片描述

  3. 创建索引, create index 索引名 on 表名(列名);

  4. 创建索引是一个低效的操作,如果表里的数据少,那么创建索引开销就不大;如果表里的数据很多,创建索引操作就会非常的耗时并且带来大量的硬盘IO,甚至会卡死数据库.

  5. 创建索引的时候也会创建出一些相关的数据结构.

  6. 删除索引, drop index 索引名 on 表名;

  7. 删除操作和刚才的创建操作类似都是比较低效的操作.

1.2 索引背后的核心数据结构:

哪些数据结构可以提高查找的效率:

1.哈希表, 增删查改都是O(1)

只能查询 值 相等的情况,但是如果是 < > between and 这类比较大小的范围查询就不行

2.二叉树 / 二叉搜索树, 查询速度最差是O(N)

AVL树 / 红黑树 (比较平衡的二叉搜索树) O(logN)

如果数据库数据特别多,上面的树就会比较的高 O(logN)

程序猿为了数据库索引量身定做了一个专门的数据结构 B+ 树.

1.2.1 先认识 B 树(N叉搜索树):

B树是一个N叉搜索树.每个节点上可能会包含N-1个值(也可能更少), N-1个值就把区间划分成了N份.这样分成N个叉的意义就是表示同样的数据集合的时候,比二叉树的高度要小很多,IO次数就降低了不少!

在这里插入图片描述

1.2.2 再认识 B+ 树(N叉搜索树):

在这里插入图片描述

B 树B+ 树
B树每个节点N-1个值,就分出了N个区间B+树N个值分成N个区间
B树中的值不会重复出现B+树是可能重复出现的 (父元素的值会在子元素中以最大值/最小值的姿态出现)
叶子节点这里,B+树会把所有的叶子节点以链表的形式首尾相连,这个时候非常便于范围查找
正因为叶子节点是全集数据,只需要把每一行(每一条记录的完整的所有列关联到叶子节点上即可);非叶子节点只需要保存索引列(只存个id);
非叶子节点占用空间非常小(相比于完整的数据集合),就可以在内存中缓存.因此这个时候查询就又进一步的减少硬盘IO.

2.事务:

  1. 事务就是用来保证原子性的.

  2. 原子性: 原子是不可分割的最小单位,使用原子来表示不能分割的基本单位.

  3. 数据库里面也有一些操作希望可以按照原子的方式来执行,这种情况下就可以使用"事务"来实现

  4. 类似于转账操作就需要按照原子的方式来完成,要么执行全都执行完,要么都不执行(这里说的不执行不是真的没执行,而是执行一半如果出现问题可以自动的恢复如初)

  5. 事务就能保证,当执行过程中出现问题的时候,自动的把前面的SQL执行的效果进行还原,恢复如初,这个操作叫做回滚(rollback);

  6. 事务执行的过程中, MySQL会记录每一步都执行了啥,一旦出现问题就可以根据记录来回滚.

  7. 既然可以回档, 为什么没有撤回呢? 为了实现事务, 其实需要付出很大的代价! 如果想要实现撤回的话, 意味着每一步都要付出这些代价. 撤回操作不是实现不了, 而是代价太大了, 不划算!

  8. 事务最核心的就是原子性, 事务的开启/提交/回滚,一般都是通过代码来控制的.

  9. 四个特性:

    4个特性解释
    原子性这就是事务存在的意义!, 能够把多个SQL打包成一个整体,要么全都执行完,要么一个都不执行(如果执行过程中出错,则自动回滚)
    一致性事务执行前后,数据处在一致的状态, (数据能够对的上)
    持久性事务进行的改动都是写到硬盘上的,不会随着程序重启/主机重启而丢失
    隔离性多个事务并发执行的时候,事务之间能够保持"隔离",不会相互干扰

2.1 隔离性:

  1. 并发执行, 简单的理解就是同时做很多件事情.并发执行事务可能存在问题,就需要隔离性.
  2. 隔离性存在的意义就是让并发执行事务的过程中,尽量不出问题(问题在可控范围之内)

2.1.1 脏读问题:

  1. 想象一个场景, 室友问我要作业,我把修改之前的作业发给他, 他用了之后,我把作业给改了.
  2. 上述就是一个脏读问题, 脏读数据就是一个临时的数据, 不代表最终的结果.
  3. 脏读: 一个事务A在修改数据,提交之前,另外一个事务B读取了数据,此时A极有可能在提交的时候把数据给改了.此时事务B读到的就是"无效的数据"就称为脏读, 读到了脏数据.
  4. 如何解决脏读问题: 结合上述场景,我就和室友约定好, 等我作业写好了再来找我要.在我写好之前,你们不要问我要! 这个操作就相当于是对 写操作加锁!
  5. 写加锁之前, 我的写操作和室友的读操作,就是完全并发的,此时并发是最高的,隔离性是最低的!
  6. 写加锁之后,我写作业的时候,室友就不能问我要,并发性降低了, 但是隔离性提高了!
  7. 但是这又引入了新的问题, 不可重复读!

2.1.2 不可重复读问题:

  1. 概念: 在一个事务A中,多次读取同一个数据发现不一样!!! (读的过程中数据被人修改了)
  2. 想象一个场景, 由于约定过写加锁, 室友在看我作业的时候,我又有了新的想法就把作业又给改了, 这个时候我再次发给室友, 他们就发现作业变了! , 这个过程就是不可重复读的问题.
  3. 不可重复读需要使用读加锁来解决, 我和室友约定我写作业的时候,你们不要问我要; 同时室友看我作业的时候, 我也不要去改.
  4. 随着引入读加锁,并发程度又进一步的降低了(效率降低), 隔离性又提高了(数据准确性也提高了).

2.1.3 幻读问题:

  1. 想象一个场景, 刚刚和室友约定了写加锁和读加锁, 我还是闲不住, 室友读取文件A的时候, 我去修改文件B/新增删除文件…,只要不影响到大家正在读的那个数据就好了呀!(我是这么想的)
  2. 这样做虽然同学们直接读取的数据没有影响, 但是同学们会发现,俩次读虽然关系的数据一样但是结果集变了.(第一次大家只能看到一个.java文化,现在看到了俩个.java文件)
  3. 上面这种情况称之为幻读问题, 可以看成是不可重复读的特殊情况.
  4. 为了解决幻读问题, 我和室友约定好,他们读数据的时候,我就得关上电脑就要去摸鱼,作业一点都不能碰!
  5. 此时并发程度最低了(串行执行的了)效率是最低的, 隔离性是最高的,数据的准确性最高!

2.1.4 总结:

  1. 上述的脏读问题,不可重复读问题,幻读问题. 都是在并发执行事务中, 可能带来的影响.产生这些影响不一定是bug.
  2. 如果需求对于数据精度要求不高,上述问题就不是bug,因此就可以让并发程度高一点,隔离性低一点,提高效率!
  3. 如果需求对于精度要求很高,上述问题就是可能是bug,因此就需要rag并发程度低一点,隔离性高一点,保证数据的可靠性!
  4. 类似于转账,必须要精度很高,效率低一点都没事.
  5. 类似于抖音点赞/投币数,精度要求就不高.

2.1.5 隔离级别:

MySQL提供了隔离级别这个选项,给了四个档位, 让我们根据实际需求来选择不同的档位. 在MySQL的配置文件中 my.ini 进行配置,根据不同的需求场景,就可以分别设置不同的档位了.

选项说明
read uncommitted允许读未提交的数据,并发程度最高,隔离性最低,可能存在脏读/不可重复读/幻读问题
read committed只能读取提交之后的数据, 相当于是写加锁,并发程度降低,隔离性提高,解决了脏读问题
repeatable read (默认)相当于写加锁和读加锁了, 并发程度再次降低,隔离性再提高,解决了脏读/不可重复读问题
serializable严格执行串行化, 并发程度最低,隔离性最高,解决了脏读/不可重复读/幻读问题,效率最低

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

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

相关文章

【AI理论学习】Python机器学习中的特征选择

Python机器学习中的特征选择特征选择方法特征选择的Python库使用Scikit-learn实现特征选择方差卡方检验ANOVALasso正则化递归特征消除使用Feature-engine进行特征选择单变量特征选择相关性Python 中的更多特性选择方法参考资料任何数据科学项目的一个重要步骤是选择最具预测性的…

vue实现文件下载

引言 最近在自己做项目的需求的过程中&#xff0c;需要vuespringboot实现文件的下载功能&#xff08;导出博客文件&#xff09;。 问题重现 在我后端文件下载接口开发完成后&#xff0c;使用vue前端去进行对接时出现了问题。 我是直接使用的axios去进行请求接口&#xff0c…

Python 炫技操作:条件语句的七种写法

原代码 这是一段非常简单的通过年龄判断一个人是否成年的代码&#xff0c;由于代码行数过多&#xff0c;有些人就不太愿意这样写&#xff0c;因为这体现不出自己多年的 Python 功力。 if age > 18:return "已成年" else:return "未成年"下面我列举了六…

SwiftUI 中创建谷歌字体浏览器

Google Fonts是设计用户界面时使用的免费字体的转到站点。本教程将展示如何编写一个简单的工具来预览这些字体,而无需在系统中注册每种字体。 该应用程序包含一个拆分视图,该视图在左侧面板中包含字体列表。右侧面板将显示字体样式选项的预览。 项目设置 创建一个名为 Googl…

Vue2之webpack篇(一)

目录 前言 1、什么是webpack&#xff1f; 2、传统开发模式 一、传统开发模式 1、场景 2、问题 3、原因 4、解决方案 二、ES6模块化 1、ES6的解决方案 3、拓展 4、取别名 5、*搭配取别名 6、导出default{} 三、CommonJS规范 1、推荐文档 2、使用CommonJS规范解决方…

十二、DockerFile构建过程解析

1、概述 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 在Docker 常用命令篇中&#xff0c;我们已经知道了2中构建镜像的方式 export\import 和 commit方式。这两种方式都需要先运行并创建容器&#xff0c;然后在容器…

python自学之《21天学通Python》(5)

第8章 复杂程序组织 当一个应用程序简单时&#xff0c;将程序代码写入一个文件即可。但随着应用程序或项目复杂度增加时&#xff0c;如果将所有代码都写入同一个文件中时&#xff0c;会出现文件过长或过大&#xff0c;即不方便代码浏览&#xff0c;也不方便代码的管理、使用与维…

人工智能人才缺口暴增,想转行的你赶紧把Python学起来...

当前AI人才极度紧缺&#xff0c;据《中国ICT人才生态白皮书》研究分析&#xff0c;到2018年底&#xff0c;我国人工智能人才缺口将突破100万&#xff0c;到2020年&#xff0c;这一数字将攀升到226万。 在过去的几年中&#xff0c;Python已经成为现代软件开发&#xff0c;基础设…

Web测试的各个测试点,居然这么全!(文末送web测试方法大全一份)

1 什么是Web测试&#xff1f; Web测试测试Web或Web应用程序的潜在错误。它是在上线前对基于网络的应用程序进行完整的测试。 UI测试功能测试数据库测试性能测试兼容性测试安全测试自动化测试 2 WEB测试主要测试场景 1.UI测试 界面是否美观&#xff0c;风格、字体、样式是否…

初识: 对象的属性特征

1. 前言 2. 什么是对象的属性特征 3. 灵活控制对象的属性特征 4. configurable: false 是单向设置的 1. 前言 众所周知&#xff0c;默认情况下我们可以任意对自己定义的对象进行增删改的。但是&#xff0c;在某些情况下&#xff0c;我们不能让别人去随便修改我们定义的对象的…

《数据结构》二叉数

学习目录树型结构概念树的重要概念树的表示形式二叉数概念特殊的二叉树二叉树的性质练习题树型结构 概念 树是一种非线性的数据结构&#xff0c;由 n 个有限节点组成一个有层次关系的集合 它具有以下的特点&#xff1a; 有一个特殊的结点&#xff0c;称为根结点&#xff0c;…

【 Threejs 】- Shader 着色器实例渲染教程

着色器在threejs中是一个难点&#xff0c;话不多说&#xff0c;先来看看着色器是什么&#xff1f; 如果您已经有使用计算机绘图的经验&#xff0c;您就会知道在这个过程中您先画一个圆&#xff0c;然后画一个矩形、一条线、一些三角形&#xff0c;直到您组成您想要的图像。这个…

面试真题 | 什么是 Redis ? Redis缓存应用场景有哪些?

面试官问题 redis击穿、穿透有什么区别&#xff1f;如何设计用例及测试 Redis 的基本概念 在没有添加 Redis 的时候&#xff0c;后端的查询流程是&#xff1a; 用户访问页面。请求后端服务。经过逻辑处理后&#xff0c;去数据库查询信息。 在添加 Redis 的之后&#xff0c;…

MySQL 服务端口大全

介绍 MySQL默认服务端口3306/TCP都不会陌生&#xff0c;但MySQL提供服务只有单纯的这个端口吗。在8.0版本默认启动的时候会发现&#xff0c;出现新的端口。 可以说MySQL使用的端口数量取决于所启用的特性、所使用的组件、应用程序连接的方式以及环境的其他方面。 按照官方说…

转速传感器信号隔离变送器正弦波输入方波信号输出

特点 转速传感器信号直接输入&#xff0c;方波信号输出正弦波、锯齿波信号输入&#xff0c;方波信号输出200mV峰值微弱信号的放大与整形不改变原波形频率&#xff0c;响应速度快电源、信号&#xff1a;输入/输出 3000VDC三隔离辅助电源&#xff1a;5V、12V、15V或24V直流单电源…

Huffman编码

目录背景Huffman编码代码部分背景 在数据传输&#xff0c;保存的时候&#xff0c;特别是在数据量特别大的时候传输&#xff0c;保存数据是一件特别麻烦的事。比如逛淘宝的时候&#xff0c;首页会有很多商家展示自己产品的高清图片&#xff0c;如果不对图片进行压缩服务端保存图…

经历百度、美团两次被裁后,我能在小公司躺平吗?

百度裁员后我进入体制内&#xff0c;专心学习自动化 百度被裁后&#xff0c;我意识到自学效果不佳&#xff0c;跟不上职场的所需&#xff0c;于是有了系统学习的想法。 这时的新工作是在体制内&#xff0c;工作强度不大&#xff0c;时间上也比较自由&#xff0c;便正式成为了…

非零基础自学Golang 第12章 接口与类型 12.5 类型断言

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.5 类型断言12.5.1 ok-pattern12.5.2 switch-type第12章 接口与类型 12.5 类型断言 类型断言是使用在接口变量上的操作。 简单来说&#xff0c;接口类型向普通类型的转换就是类型断言。 类型断言的语法是…

【关于时间序列的ML】项目 1 :使用 Python 进行 Covid-19 病例 预测

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

rk3568 | 瑞芯微平台GPIO引脚驱动编写

最近在玩瑞芯微平台的产品&#xff0c;移植了几个设备的驱动&#xff0c;遇到了一些问题&#xff0c;总结后发现大部分问题都出在了GPIO配置的问题上&#xff0c;写下本篇文章&#xff0c;用来分享一下调试的心得。 有喜欢瑞芯微的朋友&#xff0c;可以加我好友&#xff0c;拉…