Mysql数据库原理--查询收尾+索引+事务

文章目录

  • 1.查询收尾
    • 1.1自查询
    • 1.2合并查询
  • 2.索引事务
    • 2.1约束自动生成索引
    • 2.2create手动添加索引
    • 2.3.删除手动创建的索引
    • 2.4索引背后的数据结构
    • 2.5B+树的结构特点和优点--经典面试题
  • 3.事务--经典面试题
    • 3.1基本理解
    • 3.2事务的特性
    • 3.3隔离级别

1.查询收尾

1.1自查询

子查询就是套娃的过程,下面的这个例子就可以帮助我们理解这个过程:

例如在一个学生表里面,我们想要查询这个张三同学的同班同学:

select classid from student where name=‘张三’;----首先需要找到张三同学的这个班级信息,假设结果是6

select name from student where class_id=6 and name!=‘张三’;—这个时候我们已经查询出来结果了;

但是子查询就是要套娃:

select name from student where class_id=(select classid from student where name=‘张三’) and name!=‘张三’;

这个就是子查询,其实就是把两个语句合并成为了一个,把一个的结果套进另外一个语句里面去;

下面看一下这个多行子查询:就是返回的结果是多条记录;

查询英语,或者语文成绩信息:这个我们可以使用联合查询(相关联的这个表连接起来),也可以使用子查询;

select score.student_id,course.name,score.score from course,score where course.id=student.course_id and(course.name=‘语文’ or course.name=‘英语’); 这个是联合查询;

下面的这个是子查询的方法:

select id from course where name=‘语文’ or name=‘英语’; ------------打印结果4,6

==select score.student_id,score.course_id,score.score from score where score.course_id in (4,6); == 这个是根据课程进行分数的查询

子查询就是合并上面的两个语句:

==select score.student_id,score.course_id,score.score from score where score.course_id in (select id from course where name=‘语文’ or name=‘英语’); ==

1.2合并查询

合并查询就是把多个sql的查询结果,合并到一起去,这个就是合并查询,我们使用的这个union关键字进行合并查询的操作;

查询id<3或者是课程名称是英语的课程:

select * from course where course_id<3 or name=‘英语’;

select * from course where course_id<3 union select * from course where name=‘英语’;

上面的两个可以实现相同的查询效果,但是我们的这个合并查询的这个union可以在不同的表里面进行查询,但是我们的这个or只可以是对于一个表进行处理;

2.索引事务

我们的这个下面的演示还是基于学生表来进行的,简单的介绍一下这个学生表,这个学生表里面的这个id是属于int类型的数据,name是属于varchar类型的,这个就是常规操作,之前的演示基本上也是这样搞得;

2.1约束自动生成索引

我们的主键primary,unique约束,以及这个外键约束都是会向这个表里面自动添加索引的,我们可以通过具体的sql语句尝试一下;

下面的这个是为我们的学生表添加主键约束primary key之后,我们使用这个show index的语句进行查询,这个时候就可以看到这个主键添加之后,这个表里面就会自动生成索引;

create table student(id int primary key,name varchar(20));

show index from student;

下面的这个就是添加的这个unique的约束,我们查看这个表的相关的索引之后,发现这个对应的约束也是成为了索引;

create table student(id int unique,name varchar(20));

show index from student;

下面的这个是添加的外键约束,使用的就是我们的这个foreign ky以及已经设置的这个主键约束,让我们的这个学生表里面的这个id和我们的班级表里面的这个classid进行相互的检查,防止出现问题;

create table student(id int primary key,name varchar(20),classid int,foreign key(classid) references class(id));

show index from student;

2.2create手动添加索引

create index stu_index_name on student(name);

show index from student;

2.3.删除手动创建的索引

我们的删除索引只可以删除我们自己手动创建的索引,就是上面的这个我们使用的create index这个语句创建的索引才可以被我们删除,如果是类似于这个主键,unique以及这个外键约束之类的这个索引,我们自己是无法进行删除的;

drop index stu_index_name on student;

而且一般的建议都是,如果我们的这个数据量很大,我们不建议中途向这个表里面添加索引,因为这个时候大概率会出现问题,我们的索引最开始的时候就确定好,后期尽量不要进行修改;

2.4索引背后的数据结构

我们的这个索引是在数据库里面进行使用的,这个就需要和我们的这个数据库具体的业务相符合,例如这个数据的查询,以及这个精准匹配和模糊匹配

例如这个id=10就是精准匹配,例如这个age<20就是模糊匹配,我们选择的这个数据结构需要可以处理类似这样的这个具体的情况,最后发现背后的数据结构是B+树–这个是一个改进的树状结构;也称为N叉搜索树,使我们之前学习的这个二叉搜索树的一个升级版本;

要想了解这个B+树,我们首先要知道这个B树结构以及特点

下面的这个就是我自己手动绘制的一个简单的B树结构,在这个树里面,我们可以简单的看一下,再去了解这个数的结构特点:

首先,这个树的叉变多了,而且每一个的叉的这个点的数据多少是可以不一样的,我们的这个最上面的这一层的数据是30 40 50 60这是把我们的数轴划分为了5个区间(这个应该不难理解吧);

我们的第一个分叉》就是位于这个小于30的区间里面的数据,所以我写了这个15 20 25之类的;

第二个分叉就是属于是位于30—40之间的数据,我也写了三个数据,以此类推,后面的这个数据也是遵循的这个规律;

同理,第三层的这个数据,我们也是把这个15 20 25作为基准,把这个数轴划分为4个部分,每一个部分都是有自己的这个节点数据的,下面的这个数据也是分别按照这个 小于15 15–20 20—25 大于25 的这个顺序情况进行罗列的,这个就是对于B树的一个简单初步的认识;

在这里插入图片描述
和二叉树相比:二叉树只可以有两个分支,数据量很大的时候,这个树的高度就会比较高,但是我们的这个B树的分支比较多,因此这个树的高度就不会太高;

2.5B+树的结构特点和优点–经典面试题

B+树的特点
1)N叉搜索树,有N个节点,把这个划分为了N+1个区间;

2)每一个节点的N个key里面的最后一个,就是当前子树的最大值;

3)父节点的每一个key都会在子节点区间里面以最大值的形式出现;

4)B+树使用链表的结构,把子节点连接起来,方便我们进行遍历等操作;

通过下面的这个图,简单的结合者说一下这个B+树的情况,就是我们的这个8,一定是这个第二层的左子树的最大值(2 5 8里面的这个8就是最大值),我们的这个15在下面的一层的一个节点里面,也一定是最大值(11 13 15里面的这个15确实是最大值);

我们的这个2 5 8 这个节点里面,2 5 8 分别是他的这个子节点对应区间里面的最大值,而且必须要出现,这个可以很显然的看到,同理,这个11 13 15在这个对应的子节点里面也分别是作为最大值出现的;

这个时候,我们的这个最下层的这个6个节点里面的12个数据实际上就已经囊括了我们的整个B+树的所有的数据,因为我们的第一层数据在第二层里面会以最大值的形式存在,第二层的数据在第三层里面会以最大值的形式存在,这样算下来我们的这个上面的两层的数据,在第三层里面一定是存在的,因此这个第三层就包含了我们的所有的数据,到这个地方,我们就可以理解这个上面的介绍的B+树的前面的三个特点;

第四个链表结构,就是我们的最下面的这个叶子节点之间是类似于链表的解构链接起来的,方便我们取出来这个里面的对应区间的查询结果,例如我们的这个查询结果是id>6 and id<14,这个时候我们可以通过上面的非叶子节点快速定位这个6具体在什么位置,14在什么位置,不断地向下找,最后确定是这个7 8 9 11 12 13这个区间,这个时候正好是链表连接的叶子结点,我们就可以很快的确定结果;

如果其他的树状结构,没有使用这个链表链接,这个时候每次需要进行回溯,这个时候会降低我们的查询效率,因此这个B+树的第四个特点可以提高我们的这个查询的速度,这个B+树就是为了我们的mysql查询量身定做的一个数据结构~~
在这里插入图片描述

B+树和其他的数据结构相比之下的优点

1)N叉搜索树,这个树的高度是有限的,降低了IO的次数(磁盘读取和写入的速度);

2)非常擅长范围查询(例如我们要查找这个具体的数据,直接根据父节点的这个key和最下层的子节点的具体的数值,很快就可以找到);

3)所有的查询最终都是要落在这个子树上面,因此这个查询和查询之后的这个时间的开销是很稳定的(不会说这次特别快,下次特别慢的情况);

4)叶子节点是全集,全部的节点在我们的叶子结点这个全集上面都是存在的,这个时候我们的这个非叶子结点只会用来存储这个key(查询的参照物);

3.事务–经典面试题

3.1基本理解

开发时候的一些场景需要我们一气呵成完成操作,转账~~张三的账户向李四转账,张三的这个账户减少500元,李四的账户多了500,如果这个时候张三账户金额少了之后,因为其他的状况,李四的账户没有没有到账,这样的不上不下的情况,就是非常明显的bug;

事务(transaction)的引入就是为了解决上面的这个问题:把sql打包成为一个整体,要么全部执行,要么“一个都不执行”(这个也是执行之后才可以看出来,出现了故障,好像是一个也没有执行);

多个sql打包到一起进行执行,这样的特性叫做原子性

我们需要先开启事务,然后再执行sql,这个时候才会有原子性;

commit-----事务结束了;

roll back—主动回滚(回滚就是我们的这个sql执行出错之后,就会返回初始状态,因为事务需要一起执行,这个时候为了原子性,就会回滚,上面的是出错导致回滚,这个roll back是我们主动地让这个回滚);

我们通过日志(打印一些执行的节点内容到这个文件里面,相当于记录之类的东西,方便我们查看这个执行的过程),记录这个事务里面的关键操作,我们的操作就是通过日志进行的,这个日志就是我们回滚的依据;

3.2事务的特性

1)原子性:就是要么全部正确执行,要么全部进行恢复到最初的状态,就是假设我们的这个程序在执行,如果打包的这个事务没有遇到问题,这个时候就皆大欢喜,如果执行的过程中遇到问题,这个时候肯定是有一部分是执行的,有一部分还没有执行,这个时候因为这个事务是一个sql语句的打包,这个时候我们就会通过回滚的方式让已经执行的这个内容回归到最初始的状态;

2)一致性:数据执行之前和执行之后,这个数据不可以太离谱,例如还是我们上面的这个转账的操作,我们小张像小李转了500元,这个执行结束之后变成了100元,这个数据就对不上,可能这个例子不是很合适,但是这个一致性就是这个意思,可以类比着去解释;

3)持久性:事务做出的修改,都是在这个硬盘上面持久保存的,即使我们的这个服务器重启,这个数据依然是在这个硬盘上面存在的,我们之前的这个修改还是生效的;

4)隔离性:数据库并发执行多个事务的时候涉及到的问题,我们的服务器向多个客户端提供服务,如果一个客户端的执行失败了,另外一个客户端才开始执行,这个时候数据库服务器需要同时处理这两个情况,服务好这两个客户端,这个就是并发执行;

隔离性就是用来衡量当我们的并发执行的时候,不同的程序之间的这个影响程度,如果一个程序的情况对于另外其他的影响很大,这个隔离性就是弱,如果程序之间几乎没有依赖性和影响性,我们就成这个并发执行的过程隔离性很强;

我们想要这个执行效率高,就需要提高这个服务器的并发程度,但是如果这个兵法的程度过高的时候,就会出现一些问题,这个隔离性就是在这个执行效率和数据的准确性的权衡;

并发执行事务的时候,可能出现的问题:

1)脏读问题:举例说明,我们的老师在写代码,我们的学生在老师写的过程中看代码,老师写完了,他也看完了,但是最后发现老师讲课的时候的代码和他之前看的完全不一样,这个就是因为他看到的是老师当时写的,后来老师进行了修改,他只读取了第一次的数据,没有读取这个修改之后的代码数据,这个时候他读取的这个数据就是无效的数据,因为学生读取的数据是我们最开始版本的数据,这个无效的数据就叫做脏数据

解决这个脏读的手段就是在写的时候加锁:老师写的时候,我们不可以读,直到老师完全确定这个内容,我们才可以进行读取;

2)不可重复读问题:并发执行事务的时候,事务A在一次读取内容的时候,出现了不同的情况,例如我们上面的这个老师写的时候我们不可以看了,老师写完之后把这个代码上传到码云上面,这个时候我们正在看,但是这个老师又进行了修改,再次重新提交,这个时候我们正在读取,发现这个时候的数据突然变化了,这个现象就是不可重复读;

有的同学可能会说上面不是加锁了吗,为什么还会有问题,我们上面加的这个锁,只是老师写的时候我们不可以读,并没有说我们读的时候老师不可以再写,因此这个时候解决手段就是给读加锁–我们读取的时候,老师不可以写;

3)幻读问题:还是接着上面的这个现象,上面我们已经给读加锁,给写加锁,但是我们读取的时候读取的是A文件,这个时候老师无法写,是无法写A文件,但是老师可以写这个B文件啊,因为我们的加锁是给我们读取的文件加锁,这个时候我们读取的时候发现这个码云上面突然多出来一个B文件,这个现象就叫做幻读;

官方解释:事务A执行的过程中,两次的读取操作,数据的内容虽然没改变(读取的A文件内容没有改变),但是我们的数据集发生了改变(数据集里面多出来了B文件),这个现象就是幻读;

解决幻读现象的手段就是串行化的方式,保证绝对的串行执行事务,此时就完全没有并发了,这个时候效率是最低的,但是这个隔离性是最高的;

3.3隔离级别

这个隔离的层级和上面的这个现象就是相互对应的,这个需要根据实际情况选择:例如我们的银行转账,这个最求的就是准确性,这个时候效率就不是特别重要(和我们的转账的金额的准确性相比),例如我们的这个B栈上面的视频,点赞,收藏量的参数,这个效率就更重要,因为这个要不断地实时更新(点赞量100000和100006的差别显得没有那么重要这个时候,我们显示10w就可以了),因此这个需要我们根据实际情况确定下面的这个隔离的级别使用,选择合适的即可;

1)read uncommitted(读未提交):并发性最高,隔离程度最低,执行的速度最快;

2)raed committed(读已提交):写完之后才可以进行读取,这个时候并发的程度降低,隔离性增强;

3)repeatable read(可重复读):读的时候不可以写,写的时候也不可以读取,这个隔离性进一步增强,并发程度进一步降低;

4)serializable(串行化):这个时候就是一个一个的执行事务,并发性最低,隔离性最高;

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

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

相关文章

《CUDA编程》6.CUDA的内存组织

前面几章讲了一些编写高性能CUDA程序的要点&#xff0c;但还有很多其他需要注意的&#xff0c;其中最重要的就是合理的使用设备内存 1 CUDA的内存组织简介 现代计算机中的内存存在一种组织结构(hierachy)&#xff0c;即不同类型的内存具有不同的容量和访问延迟&#xff08;可以…

力扣203.移除链表元素

题目链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6…

PDF怎么转换成TXT文本?这4个方法简单还免费,pdf转txt就靠它!

PDF怎么转换成TXT文本&#xff1f;PDF文件虽然广泛支持&#xff0c;但在某些设备或软件上可能无法完全正确显示&#xff0c;尤其是当文件包含特殊字体或复杂布局时。此外&#xff0c;PDF文件的阅读体验也可能受到格式干扰&#xff0c;如复杂的背景颜色或字体样式。将PDF转换为T…

IDEA几大常用AI插件

文章目录 前言列表GPT中文版TalkXBito AIIDEA自带的AI 前言 最近AI、GPT特别火&#xff0c;IDEA里面又有一堆插件支持GPT&#xff0c;所以做个专题比较一下各个GPT插件 列表 先看idea的plugins里支持哪些&#xff0c;搜索“GPT”之后得到的&#xff0c;我用下来感觉第一第二和…

阿里云云虚拟主机SSL证书安装指南

在安装SSL证书的过程中&#xff0c;您需要确保已经正确获取了SSL证书文件&#xff0c;并且能够访问阿里云云虚拟主机的管理页面。以下是详细的步骤说明&#xff1a; 第一步&#xff1a;准备SSL证书 申请SSL证书&#xff1a;访问华测ctimall网站&#xff08;https://www.ctimal…

Unite Barcelona主题演讲回顾:深入了解 Unity 6

本周&#xff0c;来自世界各地的 Unity 开发者齐聚西班牙巴塞罗那&#xff0c;参加 Unite 2024。本次大会的主题演讲持续了一个多小时&#xff0c;涵盖新功能的介绍、开发者成功案例的分享&#xff0c;以及在编辑器中进行的技术演示&#xff0c;重点展示了 Unity 6 在实际项目中…

Java | Leetcode Java题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution {public boolean circularArrayLoop(int[] nums) {int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {continue;}int slow i, fast next(nums, i);// 判断非零且方向相同while (nums[slow] * nums[fast]…

游戏开发指南:使用 UOS C# 云函数快速构建与部署服务端逻辑实战教学

零基础的服务端小白&#xff0c;现在也可以使用 Unity 结合 C# 来轻松搞定游戏服务端啦&#xff01; 在本篇文章中&#xff0c;我们将以游戏中的“抽卡”功能为例&#xff0c;展示如何使用 Unity Online Services&#xff08;UOS&#xff09;提供的强大 C# 云函数服务&#xf…

如何革新源代码保密?七大方法教你应对!

在数字化时代&#xff0c;源代码的安全保密对于企业而言至关重要&#xff0c;它不仅关系到企业的核心竞争力&#xff0c;还涉及到知识产权的保护。源代码一旦泄露&#xff0c;可能会给企业带来无法估量的损失。因此&#xff0c;采取有效的源代码保密措施&#xff0c;是每个企业…

焊接缺陷分割系统源码&数据集分享

焊接缺陷分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DiverseBranchBlock&#xff06;yolov8-seg-C2f-DCNV3等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI…

爱心曲线公式大全

local r a*((math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4142) - 2 * math.sin(angle) 2) local x r * math.cos(angle) -- 计算对应的x值 local z r * math.sin(angle) 1.5*a - --曲线公式绘画 local function generateParabola()…

【论文笔记】Flamingo: a Visual Language Model for Few-Shot Learning

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Flamingo: a Visual Langu…

第十四章 Redis之全局唯一ID(分布式集群)

目录 一、概念 ‌二、全局唯一ID的生成方法‌ 三、Redis生成全局ID 3.1. 生成策略 3.2. 代码 一、概念 全局唯一ID是指在分布式系统中&#xff0c;每个实体都有一个唯一的标识符&#xff0c;确保在不同的节点或服务之间能够唯一标识一个实体。这种唯一性对于数据的一致性…

Vue项目开发注意事项

事项一&#xff1a;项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候&#xff0c;会自动把对应的npm卸载掉 情况1&…

2024-你自学网络安全的顺序可能一直是反的!

作为一名在网络安全领域工作了八年的技术人员&#xff0c;我想分享一些经验给2024年学习黑客技术的朋友们。 千万不要毫无基础就开始学黑客!一定要先了解相关的信息和知识! 对于刚入行的朋友&#xff0c;我建议先从网络安全或Web安全/渗透测试入手&#xff0c;这些方向市场需求…

【优选算法】(第二十八篇)

目录 K个⼀组翻转链表&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 两数之和&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 K个⼀组翻转链表&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;Leet…

掌握RocketMQ——基本概念和系统架构

简述RcoketMQ 概念&#xff1a;RocketMQ是一个开源的分布式消息中间件&#xff0c;由阿里巴巴开发并贡献给Apache软件基金会。它用于处理高吞吐量、低延迟的消息传递&#xff0c;并广泛应用于现代分布式系统中。 1 基本概念 1.1 消息 (Message) 概念&#xff1a;消息是信息传…

Ubuntu24.04远程开机

近来在几台机器上鼓捣linux桌面&#xff0c;顺便研究一下远程唤醒主机。 本篇介绍Ubuntu系统的远程唤醒&#xff0c;Windows系统的唤醒可搜索相关资料。 依赖 有远程唤醒功能的路由器&#xff08;当前一般都带这个功能&#xff09;有线连接主机&#xff08;无线连接有兴趣朋友…

Pikachu-Sql-Inject -基于boolian的盲注

基于boolean的盲注: 1、没有报错信息显示&#xff1b; 2、不管是正确的输入&#xff0c;还是错误的输入&#xff0c;都只显示两种情况&#xff0c;true or false&#xff1b; 3、在正确的输入下&#xff0c;输入and 1 1/and 1 2发现可以判断&#xff1b; 布尔盲注常用函数&…

YOLO11改进|注意力机制篇|引入反向残差移动快iRMB

目录 一、【iRMB】注意力机制1.1【iRMB】注意力介绍1.2【iRMB】核心代码 二、添加【iRMB】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【iRMB】注意力机制 1.1【iRMB】注意力介绍 反向残差移动快iRMB结构如下所示&#xf…