【MySQL精炼宝库】深度解析索引 | 事务

目录

一、索引

1.1 索引(index)概念:

1.2 索引的作用:

1.3 索引的缺点:

1.4 索引的使用场景:

1.5 索引的使用:

1.6 面试题:索引底层的数据结构(核心内容):

1.7 索引列查询(主键 | 非主键)过程:

二、事务

2.1 事务的概念:

2.2 事务操作:

2.3 面试题:事务的基本特性:

2.4 MySQL事务的隔离性:


一、索引

1.1 索引(index)概念:

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

注意:数组下标,目录,索引这三个是不同的术语,虽然它们的英文都是 index 但是表示的含义各不相同,希望友友们不要混淆。

本文章主要讲解MySQL中的索引及事务。

1.2 索引的作用:

• 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。

• 索引所起的作用类似书籍目录,可用于快速定位、检索数据。

• 索引对于提高数据库的性能有很大的帮助。

1.3 索引的缺点:

主要体现在下面两点:

• 索引本身要占据存储空间。

• 索引能提高查询速度,但是可能会拖慢增删改的速度(对数据进行增删改都是要同步更新索引的)。

1.4 索引的使用场景:

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

• 数据量较大,且经常对这些列进行条件查询(索引是用在条件查询的时候)。

• 该数据库表的插入操作,及对这些列的修改操作频率较低。

• 索引会占用额外的磁盘空间。

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。

相反,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

1.5 索引的使用:

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

例如下图:只需关注画红框的这几个即可,至于如何查看表中的索引,后续马上讲到。

通过sql我们能够创建索引,查看索引,删除索引。 

 • 查看索引

sql脚本语法:

show index from 表名;

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

show index from student;

问题:为什么建立外键约束时,子表中的对应列(外键)为什么也要建立索引? 

解答:在父表中进行删除修改的时候要去子表查询(如果子表有对应外键那么要先修改子表).为了让子表查询的速度加快,所以这里加上了索引。

 • 创建索引

sql脚本语法:

create index 索引名 on 表名(字段名);

案例:创建班级表中,name字段的索引。

create index idx_classes_name on classes(name);

注意1:创建索引都是根据具体的列来创建的,所以后续查询的时候,也必须针对这一列进行条件查询才能够通过索引来提速。

注意2:索引的创建是一个危险操作。如果表中的数据不多,创建索引啥的哪都无所谓。如果表本身很大,这个时候进行创建索引操作,就会引起大量的 CPU / 硬盘 IO 的消耗,也是可能会把数据库给搞挂了的(年终奖也挂了😭)。

那么如果我们因为业务需要就是要加上索引该怎么加呢?

解决办法如下:

(1)另外弄一个机器,也是搭建好一样的数据库服务器。

(2)创建表,建立索引(空表无所谓)。

(3)把旧的数据库的数据,导入到新的数据库中(非常耗时)我们可以慢慢导~控制一下数据传输的速度。

(4)数据导好了,把应用程序的请求切换到新的服务器上。

这样就可以在数据库不会挂的前提把索引加上。

 • 删除索引

sql脚本语法:

drop index 索引名 on 表名;

案例:删除班级表中name字段的索引

drop index idx_classes_name on classes;

注意:删除索引也是一个比较危险的操作,因为会涉及到大量的 IO ,那么就可能会把 mysql 主机弄挂了。

1.6 面试题:索引底层的数据结构(核心内容):

在面试中,mysql 相关的面试题很少出现,如果考 SQL 的话就是考察多表查询,更加常见更加高频的问题是(1)索引:谈谈索引内部的结构是怎么样的。(2)谈谈事务的基本特性。

数据库索引数据结构的最终形态是 B+ 树,B树的升级版。例如下图就是一颗B+树。

这里解释一下为什么不使用二叉搜索树和哈希表。

• 不使用哈希表的原因

哈希表只能查询 key 相等的情况无法进行大于小于的范围查询。

• 不使用二叉搜索树原因

二叉搜索树虽然可以进行范围查询但是要找到中序遍历的下一个后继元素的操作很可能需要向父亲节点进行回溯,才能找到后续。如果通过“线索化”的方式来解决,需要付出更多的存储空间。当元素非常多的时候由于是二叉,树的高度就会比较高,查询的效率就会低,数据库的数据/索引都是存储在硬盘上的,上述的每次比较都需要一次硬盘 IO 操作,是非常耗时的因此,红黑树(二叉搜索树)不太适合于大规模在硬盘上管理数据的场景。

• 使用B树的优点

为了方便叙述下面就是一颗B树。注意:每个方框是一个节点(每个数字代表一个key,一个方框里面可以存储多个数字)。

优点:

1. 每个节点上的 key 也是有序排序的,比较的时候可以直接进行二分查找。

2. B 树会控制(可以自己调整),某个节点上存储的 key 不会太多,如果插入更多的元素,那么节点会分裂出更多的子树出来。

3. 多个数据放在一块连续的存储空间上,在进行比较的时候,一次硬盘 IO 就能读取出整个节点(进行多次比较,实际上只有一次硬盘的 IO)。

• B+树相对于B树的优点

要想理解B+ 树的优点那么至少要知道B+ 树的特点(图在上面给过了)

• B+ 树的特点:

1. N叉搜索树.

2. 每个父节点中的元素都会在子节点中以最大值的方式存在。

3. 叶子节点这一层通过链表连接。

4. 所有节点都会在叶子节点出现。

• B+ 树的优势:

1. 方便查询范围(数据都是在叶子节点,可以直接通过链表找到下一个数据不用回溯)。

2. 查询操作稳定(每次都要查询到叶子节点,稳定本身就是最大的优势)。

3. 数据存储在叶子节点,非叶子节点能够存储在内存。(由于叶子节点是数据的全集,非叶子节点都是重复出现的数据,那么就可以把表中的每一行数据,最终都关联到叶子节点这一层。非叶子节点中只保存一个单纯的 key 值即可,例如(id))。

因为B+ 树的稳定,查询的速度又快,所以我们选择B + 树作为底层的数据结构。 

B+ 树这个结构是一直存在的如果定义了主键,那么就是按照主键来建立,如果没有定义主键,数据库会用自带的隐藏的列建立。

查询一次B+树的时间复杂度为O(以M为底的logN)M为树的度。

1.7 索引列查询(主键 | 非主键)过程:

• 针对索引列进行查询

非叶子节点存储索引对应列的信息。

1. 主键索引:叶子节点存储数据行(全部信息)。

2. 非主键索引:叶子节点存储的是主键的id,找到id后再进行主键的索引(称为“回表”),也就是要查询两次。

• 针对非索引列查询

直接去最底下的叶子节点,遍历链表(直接遍历是最慢的)。

二、事务

在日常开发中,有很多操作不是通过一个 SQL 就能完成的,往往需要多个SQL配合完成,当执行多个SQL操作的时候,如果中间出现了特殊的情况(程序奔溃,系统奔溃,网络断开等)可能会出现前面的 SQL 执行成功,后面的 SQL 执行失败了。例如:转账,钱扣了但是账没有转出去,那么钱就丢了,这是非常严重的问题。因此事务的出现就是为了解决这个问题。

2.1 事务的概念:

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

简单来说事务就是把多个操作打包成一个整体,那么就能够包装这个整体要么都执行成功,要么就

一个都不执行,这样就能有效避免,部分执行产生的一些“中间状态引起的问题”。

其实出现问题并非是没有执行,而是事务能够保证当执行到某一条出现问题,数据库能够自动的把前面 sql 造成的影响恢复回去,看起来就好像没有执行过一样。把这里的“翻新”操作称为“回滚”(rollback)。为了实现回滚机制,数据库会在执行事务的时候记录日志。

2.2 事务操作:

为了方便叙述我们先引入测试表:

drop table if exists accout;
create table accout(
 id int primary key auto_increment,
 name varchar(20) comment '账户名称',
 money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('阿里巴巴', 3000),
('四十大盗', 3000);

操作流程如下:

• 开启事务:start transaction;

• 执行多条SQL语句  

• 回滚或提交: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;

 案例演示效果如下:

上面这些都是基本操作,

2.3 面试题:事务的基本特性:

基本特性主要有四个:原子性,一致性,持久性,隔离性。

• 原子性

把多个操作打包成一个整体。

• 一致性

执行事务之前,和执行事务完毕之后,数据是一致的(不会出现 “对不上” 的情况)。

• 持久性

把数据存储在硬盘上(程序重启/主机重启,数据依然能存在)。

• 隔离性

描述的是,数据库并发(多个客户端同时给服务器发起事务)执行事务时,产生的情况。

这个是最难理解的,面试官考你事务的四个核心特征其实就是在考隔离性。

将事务同时处理会出现三个问题:

1. 脏读问题:

描述:事务B读到了事务A中未提交的临时数据(脏数据)。

解决方法:写操作加锁。

2. 不可重复读问题:

描述:事务B读的过程中,又有一个事务C对刚才事务A提交的数据进行了修改,使事务B内部不同的读操作读到的结果不同。

解决方法:读操作加锁。

3. 幻读问题:

描述:和不可重复读类似,事务B读的过程中,事务C没有修改数据内容,而是修改了“结果集”,导致B内部不同的读操作读到的结果集合不同。

解决方法:串行化。

解决上述问题的过程中,要想让数据更准确,就需要牺牲一部分的并发/效率。

2.4 MySQL事务的隔离性:

那么在MySQL 中事务的隔离性具体是如何体现的呢?

MySQL给程序员提供了四个隔离级别。可以在MySQL配置文件中进行设置。具体如下:

到这我们今天要讲解的内容就已经全部讲解完毕了🎉🎉🎉 ,还是希望大家一定要把面试题多看看,这是最重要的部分。

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【opencv4.8.1 源码编译】windows10 OpenCV 4.8.1源码编译并实现 CUDA 12加速

Windows 下使用 CMake3.29.2 Visual Studio 2022 编译 OpenCV 4.8.1 及其扩展模块cuda12.0teslaT4显卡 记录自己在编译时踩过的坑,避免下次再犯或者给有需要的人。 在实际使用中,如果是对处理时间要求比较高的场景,使用OpenCV处理图片数据很…

Flask教程2:flask高级视图

文章目录 add_url_rule类视图的引入装饰器的自定义与使用蓝图的使用url_prefix设置蓝图前缀 add_url_rule 欲实现url与视图函数的绑定,除了使用路由装饰器app.route,我们还可以通过add_url_rule(rule,endpointNone,view_funcNone)方法,其中&…

Flutter笔记:Widgets Easier组件库(1)使用各式边框

Flutter笔记 Widgets Easier组件库(1):使用边框 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

【stomp 实战】Spring websocket 用户订阅和会话的管理源码分析

通过Spring websocket 用户校验和业务会话绑定我们学会了如何将业务会话绑定到spring websocket会话上。通过这一节,我们来分析一下会话和订阅的实现 用户会话的数据结构 SessionInfo 用户会话 用户会话定义如下: private static final class Sessio…

利用Argo数据分别计算温度、盐度和温盐所造成的比容海平面变化

本文所用到的温盐数据集:IPRC(美国夏威夷大学国际太平洋研究中心) Argo data products | Argo (ucsd.edu)https://argo.ucsd.edu/data/argo-data-products/ 理论知识(相关计算公式): 代码和工具包准备&…

python 中的数据结构

python 中的数据结构 1.1 序列 序列时有索引的数组 举例实现: a["北京","上海","广州","深圳","重庆","成都"] print(a[2]) print(a[-1] " " a[-2]) print(a[1:3]) # 运行结果 "&…

Vulnhub-DIGITALWORLD.LOCAL: VENGEANCE渗透

文章目录 前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、smb下载线索三、制作字典四、爆破压缩包密码五、线索分析六、提权!!! Vulnhub靶机:DIGITALWORLD.LOCAL: VENGEANCE ( digitalworld.local: VENGEANCE …

chrome和drive安装包路径

Chrome for Testing availability (googlechromelabs.github.io) 下载Stable下面的包哈

【Leetcode每日一题】 分治 - 排序数组(难度⭐⭐)(69)

1. 题目解析 题目链接:912. 排序数组 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 归并排序(Merge Sort)是一种采用“分而治之”(Divide and Conquer)策略…

LLM之RAG实战(三十八)| RAG分块策略之语义分块

在RAG应用中,分块是非常重要的一个环节,常见的分块方法有如下几种: Fixed size chunkingRecursive ChunkingDocument Specific ChunkingSemantic Chunking a)Fixed size chunking:这是最常见、最直接的分块方法。我们…

C/C++基础语法练习 - 计算阶乘(新手推荐阅读✨)

题目链接:https://www.starrycoding.com/problem/160 题目描述 给定一个整数 n n n,输出阶乘 n ! n! n!。 输入格式 一个整数 n ( 1 ≤ n ≤ 20 ) n(1 \le n \le 20) n(1≤n≤20)。 输出格式 一个整数 n ! n! n!。 输入样例1 16输出样例1 20922…

树的中心 树形dp

#include<bits/stdc.h> using namespace std; int n; const int N 100005; // 无向边 int ne[N * 2], e[N * 2], idx; int h[N]; int vis[N];int ans 0x7fffffff;void add(int a, int b) {e[idx] b, ne[idx] h[a], h[a] idx; }int dfs(int u) { // 作为根节点vis[u]…

机器学习:基于Sklearn,使用随机森林分类器RandomForestClassifier检测信用卡欺诈

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

分享一份物联网 SAAS 平台架构设计

一、架构图**** 二、Nginx**** 用于做服务的反向代理。 三、网关**** PaaS平台所有服务统一入口&#xff0c;包含token鉴权功能。 四、开放平台**** 对第三方平台开放的服务入口。 五、MQTT**** MQTT用于设备消息通信、内部服务消息通信。 六、Netty**** Socket通信设…

IoTDB 入门教程①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道&#xff0c;博主在物联网领域深耕多年。 时序数据库&#xff0c;博主已经用过很多&#xff0c;从最早的InfluxDB&a…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-9.1-LED灯(模仿STM32驱动开发实验)

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

IDEA:Server‘s certificate is not trusted(服务器的证书不受信任)

IDEA&#xff1a;Server‘s certificate is not trusted&#xff08;服务器的证书不受信任&#xff09; 打开idea&#xff0c;发现一个莫名其妙的证书弹出来&#xff0c;还关不掉发现组织名是 Doctorcom LTD.百度了下 不知道是什么东西 这也不是下面这种破解了idea的情况 30069…

Ajax.

目录 1. 服务器相关的基础概念 1.1 服务器 1.2 客户端 1.3 服务器对外提供的资源 1.4 数据也是资源 1.5 资源与 URL 地址 1.6 什么是 Ajax 2. Ajax 的基础用法 2.1 POST 请求 2.2 GET 请求 2.3 DELETE 请求 2.4 PUT 请求 2.5 PATCH 请求 3. axios 3.1 axios 的基…

IoTDB 入门教程 问题篇①——内存不足导致datanode服务无法启动

文章目录 一、前文二、问题三、分析四、继续分析五、解决问题 一、前文 IoTDB入门教程——导读 二、问题 执行启动命令&#xff0c;但是datanode服务却无法启动&#xff0c;查询不到6667端口 bash sbin/start-standalone.sh 进而导致数据库连接也同样失败 [rootiZ2ze30dygwd6…

Go 语言(三)【面向对象编程】

1、OOP 首先&#xff0c;Go 语言并不是面向对象的语言&#xff0c;只是可以通过一些方法来模拟面向对象。 1.1、封装 Go 语言是通过结构体&#xff08;struct&#xff09;来实现封装的。 1.2、继承 继承主要由下面这三种方式实现&#xff1a; 1.2.1、嵌套匿名字段 //Add…
最新文章