【MySQL】MySQL索引与事务的透析——(超详解)

news2024/9/24 1:14:43

前言

🌟🌟本期讲解关于MySQL索引事务,希望能帮到屏幕前的你。

🌈上期博客在这里:【MySQL】MySQL表的增删改查(进阶篇)——之查询操作(超级详解)-CSDN博客

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

 

目录

 📚️1.引言

 📚️2.索引

2.1索引存在意义

 2.2索引相关操作

   1.查看索引

   2.创建索引

   3.删除索引

 2.3索引原理理解

   1.B树

   2.B+树

2.4索引的缺点

📚️3.事务

3.1事务存在意义

3.2事务的使用

3.3事务的理解

   1.脏读 read committed

   2.不可重复读 repeatable read

   3.幻读 serializable

📚️4.总结


 

 

 📚️1.引言

       Hello!!!家人们,小编上期期讲解了关于增删查改的进阶之查询进阶操作,关于数据库表的增删查改有了就更深的认识,小编这期将深入讲解另一部分内容,即关于数据库的索引事务大家准备好了吗~~~🥳🥳🥳;

 且听小编进行讲解,包你学会!!! 

 📚️2.索引

2.1索引存在意义

在数据库使用select查询数据的时候有以下几个步骤:

1.先遍历表;

2.在把当前的行带入条件看条件是否成立;

3.若成立则保留,反之就不保留,跳过;

那么在一个表的数据非常大的时候,遍历的成本就非常的高了,时间复杂度至少为O(n)

总结:所以索引是针对查询操作引入的操作,避免针对表的遍历,运用索引可以加快查询的操作;

 2.2索引相关操作

1.查看索引

SQL执行语句:show index from 表名;

代码实例如下:

mysql> create table student(id int,name varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> show index from student;
Empty set (0.00 sec)

可以发现在没有建立索引的情况下,表是没有索引的,那么这就涉及另一个问题了;

存在unique,primary key,foreign key 的时候,索引会自动生成;

代码实例如下:

mysql> create table student(id int primary key,name varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

此时可以发现,存在索引了,列名字为id;

注意:如上述,索引会针对指定的列,在查询的过程中只有针对这一列进行查询,查询才会被索引进行优化;

当然还存在外键的时候,代码如下:

mysql> create table student(id int primary key,name varchar(10),classid int,foreign key(classid) references class(classid));
Query OK, 0 rows affected (0.01 sec)

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | classid  |            1 | classid     | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

这里的外键的建立,小编在上期讲解过,不明白的小伙伴就去看看吧~~~ 

注意:此时索引指定的列名就为两个,上面那个是主键建立的索引,下面是外键建立的索引;

2.创建索引

SQL执行语句:create index 索引名 on 表名(列名);

代码实例如下:

mysql> create index id_index on stu(id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from stu;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| stu   |          1 | id_index |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

 注意:创建索引是一个危险的操作,在创建索引时,数据库会根据现有的数据,进行大规模的整理,如果数据过多,会导致服务器卡死;

3.删除索引

SQL执行语句:drop index 索引名 on 表名;

代码实例如下:

mysql> drop index id_index on stu;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from stu;
Empty set (0.00 sec)

通过上述的stu表建立的索引进行删除后,可以发现在再次查找索引的时候就为空了;

注意:这里删除的是自己手动创建的索引,如果为(主键,外键,unique创建的索引)那么此时就不能够进行删除;

 2.3索引原理理解

索引的内部原理其实是一种数据结构:即B+数(N叉搜索树)

那么我们之前学过的关于查询比较高效的就有哈希表,二叉搜索树;

📍哈希表是内部一种顺序表和链表结合的结构,在查找精确的数值时,他是可以实现的,但是在数据库的模糊匹配,范围数据查询,那么哈希表就不适用了;

📍二叉搜索树来说,当数据量过大时,那么此时树的高度就为log(N),那么此时还是完全平衡的状态,如果为单分支,那么树的高度就很离谱了;

那么此时就有一个B+树来解决这个问题;那么接下来,就先讲解B树的结构;

1.B树

B树就是和二叉搜索树基本原理一致,但是一个节点上不止一个数字,当多个数字在时,就会分为几个范围,小编就通过画图解释一下吧;

如图所示:

如上图所示,此时树的高度就大大减少了,那么就缩短了时间复杂度;

注意:

一个节点存储N个key那么就会生成N+1个区域,每个区域会生成对应的子树;

结点是存储在硬盘区域的,一次读硬盘,就取出来几个key,再进行比较;

一个节点中是可以存储N个key的,但是这不是无限制的,当一个节点的key过多时,就要触发节点的分裂;当然当节点的太少时,就会触发节点的合并;

2.B+树

 对于B+树是B树的优化版本,那么还是和上述一样,小编来画图来解释吧;

如图所示:B+树就是省去了大于最大值的区间范围,并且每个区间的子树最大值必须为区间的最大值,即父节点对应区间最大值; 

那么就有以下的特点:

📍 一个节点上存储一个N个key,对应就有N个区间,子树;

📍每个节点的最后一个节点,就相当于当前节点的最大值;

📍父节点的每个key都将以最大值的身份在子结点的对应区间出现;

📍B+树会使用链表这样的结构将叶子结点串联起来;

所以注意:

B+树减少了树的高度,降低了时间复杂度;

所有查询都要在叶子结点进行,使查询之间的时间开销是稳定的;

由于叶子结点存储的是行数据,而非叶子结点存储的是排序的key,非叶子结点是占有的空间少,那么在查询时,将非叶子结点加载到内存中运行,再次降低了IO访问次数;

2.4索引的缺点

1.占用空间,生成索引,需要一系列数据结构,和一系列是数据元素;

2.降低插入修改的执行效率;

📚️3.事务

3.1事务存在意义

为啥要有事务呢,那么就有一下案列:

在之前,父母就要通过银行卡来进行转钱,如果当父母转了钱后,突然服务器崩了,那么此时钱就不会到你的手里;

运用MySQL进行实现:

mysql> create table accout(
    ->  id int primary key auto_increment,
    ->  name varchar(20) comment '账户名称',
    ->  money decimal(11,2) comment '金额'
    -> );

mysql> insert into accout(name, money) values
    -> ('阿里巴巴', 5000),
    -> ('四十大盗', 1000);

mysql> -- 阿里巴巴账户减少2000
mysql> update accout set money=money-2000 where name='阿里巴巴';

mysql> update accout set money=money+2000 where name='四十大盗';

那么假如在转出2000后,突然崩了,那么此时就会造成一些不必要的线下问题,那么此时事务就是为了解决这些问题;

注意:事务可以把多个SQL进行打包成一个整体,要么整个执行正确,要么一个都不执行(这里不是不执行,而是方便理解)即原子性~~~

3.2事务的使用

(1)开启事务:start transaction

(2)执行多条SQL语句

(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。

代码实例:

mysql> start transaction;


mysql> update accout set money=money-1000 where name='阿里巴巴';


mysql> update accout set money=money+1000 where name='四十大盗';


mysql> commit;

那么此时SQL语句部分,可以改变;

注意:回滚是通过日志的操作,记录操作中的关键事务,这样的记录就是回滚的依据;

3.3事务的理解

事务的特点:

📍原子性:通过回滚的方式,保证一系列操作正确;

📍一致性:事务在执行之前和执行之后的数据都不能太离谱(这里要通过约束条件,检查机制)

📍持久性:事务做出的操作是持久的,保存在硬盘上

📍隔离性:数据库并发执行多个事务时的问题,通常来说一个服务器同时给多个用户提供服务,所以并发执行;

 那么在并发过程中会存在哪些问题??

1.脏读 read committed

所谓脏读就是在事务A执行的过程中,事务B进行了读取同一个数据,那么之后事务A修改了数据,那么事务B所读的数据就是无效的数据;

解决脏读:

添加写枷锁,即在事务A执行过程中,B事务不能读取,只能等待事务A执行完成后才能读取;

那么此时:并发性下降,效率下降,数据正确性上升,隔离性提高~~~

2.不可重复读 repeatable read

所谓不可重复读就是在事务A执行完成后,在事务B读取的过程中,事务A又再次修改了数据,那么就造成事务B读取的数据两次结果不一样;(一个事务内部,两次读)

解决不可重复读

添加读加锁,即在脏读的前提下,在事务B进行读取的时候,事务A不能够进行修改;

那么此时:并发性下降,效率下降,数据正确性上升,隔离性提高~~~(相比脏读效果更强)

3.幻读 serializable

所谓幻读就是在前面两种解决前提下,在事务A执行完成后,事务B读取的过程中,事务A又重新执行另一个事务,那么此时事务B在两次读取的过程中,数据没有改变,但是结果集改变了~~~

解决幻读:

引入串行化的解决方式,完全规避了并发执行;

那么此时:完全没有并发了,数据准确率最高,效率最低~~~

所以得根据不同的事务场景来决定不同的隔离级别:《一级:完全并发》《二级:脏读引入写加锁》《三级:不可重复读引入写和读加锁》《四级:幻读完全串行化》,一般默认三级

📚️4.总结

💬💬本期小编讲解了关于MySQL中索引与事务,主要理解了索引的内部原理,和底层数据结构,以及事务的相关使用和并发执行的问题,也附上了对应代码供小伙伴们参考~~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                                                                 😊😊  期待你的关注~~~

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

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

相关文章

CSP-CCF★★★201903-2二十四点★★★

目录 一、问题描述 二、解答 方法一:穷举法(只列举了一部分) 方法二:中缀表达式直接求值,两个栈,一个存放数值,一个存放符号 方法三:将中缀表达式转换为后缀来计算注意&#xff…

台风,也称为热带气旋,是一种在热带海洋上形成的强烈风暴系统。台风的形成需要满足以下几个条件:

台风,也称为热带气旋,是一种在热带海洋上形成的强烈风暴系统。台风的形成需要满足以下几个条件: 1. **温暖的海水**:台风通常在海面温度至少达到26.5C(79.7F)的海域形成,因为温暖的海水能够提供…

八股(8)——Spring,SpringBoot

八股(8)——Spring,SpringBoot 基础1.Spring 是什么?特性?有哪些模块?Spring 有哪些特性呢? 2.Spring 有哪些模块呢?3.Spring 有哪些常用注解呢?Web 开发方面有哪些注解呢…

利用模糊综合评价法进行数值评分计算——算法过程

1、‌模糊综合评价法概述 ‌模糊综合评价法是一种基于模糊数学的综合评价方法,它通过模糊数学的隶属度理论将定性评价转化为定量评价,适用于解决复杂、难以量化的问题。该方法具有结果清晰、系统性强的特点,能够处理多种因素制约下的综合评价…

热门数据恢复软件大盘点

现在大家的数据都喜欢存放在一些电子设备里保存吧。这样既方便存放,也方便我们查找。但是这些设备可能因为病毒、误删除等原因造成数据的丢失。这篇文章我将介绍几款类似易我数据恢复软件的数据恢复工具,减少为数据丢失给我们造成损失。 1.FOXIT数据恢复…

vue国际化

前言 现在的大公司都走国际化路线,我们应用程序也不例外。今天就在 Vue3 项目中整一个比较简单的国际化 背景 之前搞国际化的时候,也搜索了很多帖子,但是没有一个可以完整的实现。今天有空搞了一版,大家有什么问题欢迎留言探讨…

Java设计模式—面向对象设计原则(五) ----->迪米特法则(DP) (完整详解,附有代码+案例)

文章目录 3.5 迪米特法则(DP)3.5.1 概述3.5.2 案例 3.5 迪米特法则(DP) 迪米特法则:Demeter Principle,简称DP 3.5.1 概述 只和你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to stranger…

【CSS in Depth 2 精译_031】5.3 Grid 网格布局的两种替代语法

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

Linux服务器配合Xshell+Tensorboard实现深度学习训练过程可视化

问题背景: 在深度学习领域,监控模型的训练过程是非常重要的。TensorBoard 是 TensorFlow 提供的一个可视化工具,可以帮助我们直观地理解模型的训练和验证过程。我们一般在 Windows 系统只需要在自己的浏览器输入localhost:6006就可以观察训练…

[Linux]:进程间通信(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程间通信介绍 1.1 进程间通信的概念 进程间通信简称IPC(In…

[通信原理]绪论1:信号 × 通信系统

1、消息、信号与信息 消息: 通信系统要传输的对象,是具体的、物理上存在的东西。也是信息的载体。形式多种: 连续消息:语音、温度、活动图片.离散消息:数据、符号、文字. 信息: 消息中所蕴含的内容&…

MySQL练手题--公司和部门平均工资比较(困难)

一、准备工作 Create table If Not Exists Salary (id int, employee_id int, amount int, pay_date date); Create table If Not Exists Employee (employee_id int, department_id int); Truncate table Salary; insert into Salary (id, employee_id, amount, pay_date) va…

ESP8266+httpServer+GET+POST实现网页验证密码

1. 代码 #include "esp_http_server.h" #include "esp_log.h" #include "web_server.h"// 辅助宏&#xff0c;用于计算两个数中的较小值 #define MIN(a, b) ((a) < (b) ? (a) : (b))static const char *TAG "wifi web_server";c…

游戏算法专题之PRD算法:听说你想凭运气抽中荣耀水晶?

PRD算法全称Pseudo-Random Distribution。是概率分布中的一种常见算法&#xff0c;在游戏开发领域中很常用。 PRD用于控制随机事件的触发概率&#xff0c;使其表现得更加符合预期&#xff0c;相比于传统得随机数生成&#xff0c;PRD算法可以平滑得控制随机事件的触发次数&…

cJSON-轻量级解析模块、字符串的神——编织STM32C8T6与阿里云信息传递的纽带

编写方向&#xff1a;本人就不泛泛的编写一篇什么一文学会cJSON了&#xff0c;没什么突出点&#xff0c;也就我水水字数&#xff0c;你们看来看去也不懂&#xff0c;本人是从上阿里云传信息接触的cJSON的&#xff0c;我就此写一篇针对性的文章&#xff0c;希望对大家有用&#…

通信工程学习:什么是UNI用户网络接口

UNI&#xff1a;用户网络接口 UNI&#xff08;User Network Interface&#xff09;用户网络接口&#xff0c;是网络通信中的一个重要概念&#xff0c;它连接了用户设备与智能光网络或其他类型的网络。以下是关于UNI用户网络接口的详细解释&#xff1a; 一、定义与功能 定义&am…

VSCode C++(Code Runner)+ OpenSSL开发环境搭建

本章教程,主要介绍在VSCode中配置OpenSSL环境。 一、安装 OpenSSL 首先,我们需要安装OpenSSL,并配置OpenSSL系统环境变量。 1、下载OpenSSL 下载地址:https://slproweb.com/products/Win32OpenSSL.html 如果下载慢可以通过下方网盘进行下载: 通过网盘分享的文件:Win64Op…

Geneformer AI 模型,有限数据也能解锁基因网络

目录 类似于 BERT 的单单元数据参考模型 NVIDIA Clara 工具组合用于药物研发 用于疾病建模的基础 AI 模型 Geneformer 是最近推出的 和功能强大的 AI 模型&#xff0c;可以通过从大量单细胞转录组数据中进行迁移学习来学习基因网络动力学和相互作用。借助此工具&#xff0c;…

ICPC网络赛 以及ACM训练总结

一、训练反思 关于我自己暑假期间训练的反思&#xff0c;我承认无论是因为什么原因&#xff0c;我自己浪费我整整一个暑假的时间&#xff0c;暑假期间正是我们集训的关键时期&#xff0c;这期间没有任何的事情来打扰我们学习&#xff0c;而我却熬夜&#xff0c;白天训练懈怠&a…

C++类与对象(二)超详细

目录 1.类的6个默认成员函数 2..构造函数 2.1概念 2.2 特征 3.析构函数 3.1 概念 3.2 特性 4.拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载函数 5.1 运算符重载&#xff08;是否重载这个运算符是看这个运算符对这个类是否有意义&#xff09; 5.2 赋值运算符重…