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

news2024/12/28 5:01:02

目录

一、索引

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.coloradmin.cn/o/1636468.html

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

相关文章

FSNotes for Mac v6.7.1中文激活:轻量级笔记管理工具

FSNotes for Mac,一款专为Mac用户打造的轻量级笔记管理工具,让您的笔记管理变得简单而高效。 FSNotes for Mac v6.7.1中文激活版下载 它采用Markdown文件格式,让您轻松创建和编辑富文本笔记,无需担心格式问题。同时,FS…

手写一个uart协议——rs232(未完)

先了解一下关于uart和rs232的基础知识 文章目录 一、RS232的回环测试1.1模块整体架构1.2 rx模块设计1.2.1 波形设计1.2.2代码实现与tb1.2.4 仿真 1.3 tx模块设计1.3.1波形设计 本篇内容: 一、RS232的回环测试 上位机由串口助手通过 rx 线往 FPGA 发 8 比特数据&a…

复杂度(3)

目录 1.二分查找的时间复杂度 2.斐波那契数列及其优化 3.空间复杂度 1.二分查找的时间复杂度 我们熟知的二分查找绝对是一种很厉害的算法,因为这个算法每进行一次都会砍掉一半的数据,相当于是指数级增长,假设我们刚开始的时候数据的个数是…

【对比学习】【论文翻译】Contrastive Multiview Coding

Contrastive Multiview Coding ECCV 2020 0.论文摘要和作者信息 摘要 人类通过许多感官通道观察世界,例如,由左眼观察的长波长光通道,或由右耳听到的高频振动通道。每个视图都是嘈杂和不完整的,但重要的因素,如物理…

【linux-1-Ubuntu常用命令-vim编辑器-Vscode链接ubuntu远程开发】

目录 1. 安装虚拟机Vmare和在虚拟机上安装Ubuntu系统:2. 常用的Ubuntu常识和常用命令2.1 文件系统结构2.2 常用命令2.3 vim编辑器 3. Ubuntu能联网但是ping不通电脑:4. Windows上安装VScode链接ubuntu系统,进行远程开发: 1. 安装虚…

Meltdown 以及Linux KPTI技术简介

文章目录 前言一、Introduction二、 Background2.1 Out-of-order execution2.2 Address Spaces2.3 Cache Attacks 三、A Toy Example四、Building Blocks of the Attack4.1 Executing Transient Instructions4.2 Building a Covert Channel 五、Meltdown5.1 Attack Description…

如何使用Spring Boot导出数据到Excel表格

在开发应用程序时,经常会遇到将数据导出到Excel表格的需求。Spring Boot提供了简单而有效的方法来实现这个功能。本文将介绍如何使用Spring Boot和Apache POI库将数据导出到Excel表格,并提供一个示例代码来演示该过程。 1. 准备工作 首先,确…

ARM学习(27)链接库依赖学习(二)dlopen failed:library xxxx.so

笔者继续学习一下链接的依赖库。 1、起因 Android下面需要需要一个日志解码库,所以笔者就编译了一个parse.so来进行解码, 编译器:Clang,基于llvm后端的编译器平台:交叉编译,linux -> aarch64 linux An…

es环境安装及php对接使用

Elasticsearch Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的…

【LeetCode】拓扑排序——课程表 I II

拓扑排序&#xff1a; AOV网&#xff1a;若用DAG图&#xff08;有向无环图&#xff09;表示一个工程&#xff0c;其顶点表示活动&#xff0c;用有向边<Vi, Vj>表示活动Vi必须先于活动Vj进行的这样一种关系&#xff0c;则将这种有向图称为顶点表示活动的网络&#xff0c;…

餐后血糖波动?学会在米饭里加两物

米饭里加两物&#xff0c;帮你平稳餐后血糖&#xff0c;餐后血糖稳稳的&#xff0c;别让你碗里的米饭太单调&#xff0c;搭着吃对血糖好。今天呢我教大家一招&#xff0c;在蒸米饭的时候&#xff0c;加上两种食材&#xff0c;能够改善餐后血糖。 第一就是在煮米饭的时候加点糙米…

C++多态(全)

多态 概念 调用函数的多种形态&#xff0c; 多态构成条件 1&#xff09;父子类完成虚函数的重写&#xff08;三同&#xff1a;函数名&#xff0c;参数&#xff0c;返回值相同&#xff09; 2&#xff09;父类的指针或者引用调用虚函数 虚函数 被virtual修饰的类成员函数 …

Systemback Ubuntu14.04 制作自定义系统ISO镜像

工作需要&#xff0c;要基于ubuntu自定义一些编译环境并将自己配置好的ubuntu做成镜像。 硬件准备 ​ 为保证能够顺利完成系统iso镜像的制作与系统还原&#xff0c;推荐准备一个较大容量的U盘或者移动固态硬盘&#xff0c;同时确保自己的Ubuntu系统还有比较大的可用空间。 1 S…

Maven入门:1.简介与环境搭建

一.简介与环境搭建 1.Maven&#xff1a;用于自动化构建项目&#xff08;按照企业主流模板构建完善的项目结构&#xff09;和管理项目依赖&#xff08;依赖就是项目的jar包&#xff0c;通过配置的方式进行添加和管理&#xff0c;自动下载和导入&#xff09;的工具。即更加方便构…

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别&#xff0c;你真的知道吗&#xff1f; 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要环节&#xff0c;显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要…

CSS 伪类、伪元素的应用实例:电池充电、高能进度条

一、目的 本文通过 CSS 伪类、伪元素&#xff0c;结合动画 animation 和 Vue 动态样式属性&#xff08;通过 CSS 变量&#xff09;的写法&#xff0c;来实现电池充电、高能进度条的效果&#xff0c;如下图所示。 二、基础知识 1、CSS 伪类、伪元素 简单概括成以下 4 点&#x…

JavaScript转换和校验数字

本节我们使用的案例还是继续之前的银行家应用程序&#xff0c;只不过我们呢增加了两个账号&#xff0c;代码如下&#xff1a; const account1 {owner: Jonas Schmedtmann,movements: [200, 455.23, -306.5, 25000, -642.21, -133.9, 79.97, 1300],interestRate: 1.2, // %pin…

Macos安装OrbStack

什么是OrbStack OrbStack 是一种在 macOS 上运行容器和 Linux 机器的快速、轻便和简单方法。它是 Docker Desktop 和 WSL 的超强替代品&#xff0c;所有这些都在一个易于使用的应用程序中。 在Macos M系列芯片上&#xff0c;经常遇到docker镜像不兼容的问题&#xff0c;此时使…

Git客户端(TortoiseGit)使用详解

1.概述 使用TortoiseGit比直接使用git 客户端和命令实现代码版本管理更为方便&#xff0c;本文根据实际使用情况作一些记录&#xff0c;特别是对于解决冲突的处理。 2.Git安装与配置 下载 Git - Downloads&#xff0c; 可参考Git安装步骤完成Git的安装与配置。 3.TortoiseG…

【最大公约数 排序】2344. 使数组可以被整除的最少删除次数

本文涉及知识点 最大公约数 排序 LeetCode2344. 使数组可以被整除的最少删除次数 给你两个正整数数组 nums 和 numsDivide 。你可以从 nums 中删除任意数目的元素。 请你返回使 nums 中 最小 元素可以整除 numsDivide 中所有元素的 最少 删除次数。如果无法得到这样的元素&a…