Mysql 索引与事务

1. 索引

1.1 什么是索引 

当我们看一本书时可以通过目录快速的定位到我们想要的章节 ,在数据库中查询数据也需要遍历表,而且数据库是把数据存储在硬盘上的,所以读取数据十分的慢,因此就可以给数据库引入索引,提高查询速度。

1.2 索引的特点

  1. 加快查询速度
  2. 索引自身是一种数据结构,需要占用空间
  3. 当我们对数据进行 增删改 时 ,也要对索引进行更新

1.3 适用场景

  • 储存空间比较充裕
  • 应用场景中查询操作比较多,增加,删除,修改操作比较少

1.4 索引的使用

1.4.1 查看索引 

查看某个表是否有索引,有几个索引

语法:

show index from 表名;

注意:

  • MySQL 中 primary key ,unique,foreign key 都会自动生成索引,这几个操作都会频繁涉及到查询
  • 一个表的索引可以有多个
  • 每个表的索引都是根据某个列来展开的,按照这个列来查询才能提高效率
1.4.2 创建索引 
create indext 索引名 on 表名(列名);

注意:创建索引是一个比较危险的操作,如果这个表中有大量的数据,创建索引时就会引发大量的硬盘 IO 很可能会把数据库卡死,造成大量损失

1.4.3 删除索引 
drop index 索引名 on 表名;

 注意:与创建索引相同,删除索引是一个比较危险的操作,创建索引时,一定要在建表之初就规划好

1.5 B+树

1.5.1 什么是B+树?

B+树是一种自平衡的树形数据结构,它通常用于实现关系数据库中的索引。B+树的名称中的"B"代表"平衡",而"+"意味着它的所有叶子节点都被链接在一起,形成一个有序的链表。B+树的特点包括:

  1. 所有数据都存储在叶子节点上,而非叶子节点只包含索引信息。
  2. 所有叶子节点之间通过指针连接形成一个有序链表,便于范围查询。
  3. 由于所有关键字都出现在叶子节点上,因此每次查找都需要遍历到叶子节点。
  4. B+树的高度通常比较低,使得检索速度非常快。
1.5.2 B+树的结构

B+树由根节点、内部节点和叶子节点组成,其中根节点可以同时是内部节点和叶子节点。每个节点包含多个关键字和指向子节点的指针。

  1. 根节点:

    • 根节点是B+树的起始节点,也可以同时是内部节点和叶子节点。
    • 它包含至少一个关键字和指向子节点的指针。
    • 如果根节点同时也是叶子节点,那么它会包含指向数据的指针。
  2. 内部节点:

    • 内部节点是位于根节点和叶子节点之间的节点。
    • 每个内部节点包含多个关键字和对应的子节点指针。
    • 除了关键字和指针外,内部节点还包含指向其下属子树中最大关键字的指针,这样可以快速定位到需要查询的关键字所在的叶子节点。
  3. 叶子节点:

    • 叶子节点是B+树中存储实际数据的节点。
    • 每个叶子节点包含多个关键字和对应的数据指针。
    • 所有叶子节点通过指针连接成一个有序链表,便于范围查询和区间扫描操作。 
1.5.3 B+树的操作
  1. 插入:从根节点开始,按照关键字的大小逐层向下寻找插入位置,并确保插入后该节点的关键字仍然有序。如果叶子节点满了,则进行节点分裂,同时更新父节点的信息。
  2. 删除:从根节点开始,定位到要删除的关键字所在的叶子节点,并删除之。若删除后节点关键字数量过少,则进行合并操作,同时更新父节点的信息。
1.5.4 B+树在数据库中的应用

在数据库中,B+树主要用于索引的实现。数据库中的表可以根据某一列的数值大小构建B+树索引,从而加速对该列的查询操作。B+树索引的优点在于:

  1. 支持快速的单值查询。
  2. 支持范围查询,因为叶子节点之间通过指针连接成有序链表。
  3. 适用于范围扫描,例如查找某个区间内的数据。

总的来说,B+树作为一种高效的自平衡树结构,在数据库系统中扮演着关键的角色,为快速的数据检索提供了重要的基础支持。

2. 事务

2.1 什么是事务?

事务是一组被认为是单个逻辑工作单元的SQL操作,它们要么全部成功执行,要么全部不执行。事务可以包含一个或多个数据库操作(例如插入、更新、删除等),这些操作要么全部生效,要么全部回滚,以保证数据的一致性和完整性。

例如:转账的时候,银行先在卡里扣钱,然后再把钱转到另一张卡上,这是两个步骤,如果刚把卡里的钱扣了,然后数据库崩了,“把钱转到另一个卡上”这个语句还没执行,事务就是为了避免这类情况。

注意:回滚的原理是依赖日志,当事务执行一半,数据库崩了,前面已经执行的语句会被日志记录下来,然后进行回滚恢复。

2.2 事务的特性

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,没有中间状态。
  • 一致性(Consistency):事务执行前后,数据库从一个一致的状态转变为另一个一致的状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
  • 隔离性(Isolation):并发执行的事务之间应该相互隔离,每个事务都应该感觉不到其他事务的存在,每个事务应该认为它是唯一在运行的事务。
  • 持久性(Durability):一旦事务提交,它对数据库的修改就应该是永久性的,即使系统崩溃也不会丢失。

2.3 事务的隔离级别

 MySQL支持多种事务隔离级别,用于控制并发事务之间的隔离程度。常见的隔离级别包括:

  1. 读未提交(Read Uncommitted):这是最低的隔离级别。在这个级别下,一个事务可以读取另一个事务尚未提交的数据。这意味着可能会出现脏读问题,因为一个事务可能会读取到另一个事务正在进行的修改,导致数据不一致 。

  2. 读已提交(Read Committed):这个级别确保了一个事务只能读取到其他事务已经提交的数据,从而避免了脏读的问题。在这个级别下,当一个事务正在修改数据时,其他事务不能读取到未提交的数据 。

  3. 可重复读(Repeatable Read):这个级别确保在同一个事务内多次读取同一数据时,结果是一致的。它通过在读取某行数据时加锁来实现,这样其他事务无法在此期间修改这一行数据,从而避免了不可重复读和幻读的问题 。

  4. 串行化(Serializable):这是最高的隔离级别。它通过强制事务串行执行来避免任何并发问题,确保了数据的一致性。然而,由于事务必须按顺序执行,这可能会导致性能下降 。

解释:

  • 脏读(Dirty Read):这是事务隔离级别为“读未提交”时可能出现的问题。在一个事务读取数据的过程中,另一个事务也在对这部分数据进行修改,但第一个事务并不知道这一点。如果此时第一个事务读取了这部分数据,那么它读取到的将是尚未提交的、可能是错误的数据。这就是所谓的脏读。

  • 重复读(Non-repeatable Read):这是事务隔离级别为“读已提交”时可能出现的问题。在一个事务多次读取同一行数据的过程中,另一个事务也对这部分数据进行了修改。如果此时第一个事务再次读取这一行数据,那么它将读到与第一次读取时不同的数据。这就是所谓的不可重复读。

  • 幻读(Phantom Read):这是事务隔离级别为“可重复读”时可能出现的问题。在一个事务多次读取表中的数据的过程中,另一个事务插入了新的行。如果此时第一个事务再次读取表中的所有数据,那么它将看到一些原本不存在的行。这就是所谓的幻读。

2.4 事务的使用 

在MySQL中,事务主要用于处理操作量大、复杂读较高的操作,例如插入、删除和更新多条数据。事务主要用来管理insert、delete、update语句。

举例来说,假设现在有一张仓库表,仓库表中记录了每一个物品的数量,还有一张用户表,用户购买产品时,仓库表的产品数量减少,而用户拥有产品的数量增加。但是如果仓库中的产品数量不足时,我们就需要用到事务来处理这种情况。

start transaction;
update 仓库表 set 产品数量 = 产品数量 - 1 where 产品ID = '1';
update 用户表 set 拥有产品数量 = 拥有产品数量 + 1 where 用户ID = '1';
commit;

 在这个例子中,我们首先通过start transaction开始一个事务。然后,我们分别更新仓库表和用户表中的数据。如果两个更新操作都成功执行,那么我们就通过commit提交事务,否则,我们可以通过rollback回滚事务。

这样,我们就可以确保数据的一致性和完整性。如果在执行过程中发生错误或者失败,我们可以回滚到事务开始之前的状态,避免数据的不一致。

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

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

相关文章

python数据可视化之matplotlib.pyplot

文章目录 模块引用折线条图实际应用案例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 不论是数据挖掘还是数据…

Hadoop-- hdfs

1、HDFS中的三个进程:NameNode(NN)、DataNode(DN)、SecondNameNode(SNN) 2、NameNode(NN) 1、作用: 1、接收客户端的一个读、写的服务,在namenode上存储了数据文件和datanode的映射的关系。 …

移动云电脑:摆脱传统桎梏,助推企业数字化转型

如今,随着“云”在企业数字化转型战略中的作用日益凸显,上云是企业数字化转型第一步,已成为业界共识。尤其对于中小企业而言,数字化转型更是一种生存之道。 实际上,企业数字化转型面临很多传统桎梏。例如,数…

企业数字化转型的好处?_光点科技

企业数字化转型是当今商业世界中一个至关重要的议题。数字化转型不仅仅意味着采用新技术,而是涉及到企业在文化、运营和客户体验方面的根本变革。那么,企业数字化转型的好处是什么呢? 1.数字化转型可以显著提高企业的运营效率。 通过自动化流…

Hafnium之分区运行时模型

端点的运行时模型描述了执行上下文在不同状态之间允许的转换。下面是支持的四种分区运行时模型(请参阅[1]第7节): RTM_FFA_RUN:呈现给执行上下文的运行时模型,该执行上下文通过FFA_RUN接口分配CPU周期。RTM_FFA_DIR_REQ:呈现给执行上下文的运行时模型,该执行上下文通过FFA_…

java-jdbc快速入门

文章目录 简介快速入门 简介 JDBC就是使用Java语言操作关系数据库的一套APIJava DataBase Connectivity 快速入门 -- mysql 中准备工作 create database if not exists my_db; use my_db; create table account(id int,name varchar(20),money int ); insert into account v…

进程和线程

在操作系统中,进程(Process)和线程(Thread)是两个基本的执行单元,它们之间有密切的关系,但又有一些重要的区别。 进程(Process): 定义: 进程是一…

深度学习之基于YoloV5血红细胞检测识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习已经在许多领域中得到了广泛的应用,包括医疗健康领域。其中,YOLO(You O…

[EFI]Dell XPS 9500电脑 Hackintosh 黑苹果引导文件

硬件型号驱动情况主板Dell XPS 9500 P91F001处理器Intel Core i7-10750H已驱动内存16GB DDR4-2933MHz, 2x8G已驱动硬盘Western Digital PC SN530 NVMe SSD已驱动显卡Intel UHD Graphics 630已驱动声卡Realtek ALC3281 (ALC289 rebranded)已驱动网卡Realtek RTS5260 PCI-E Card …

Python实现WOA智能鲸鱼优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

国学---佛系算吉凶~

佛系算吉凶咯~,正经走访深山庙宇,前辈老人,经过调研后,搭建的轻衍计算模型,团队对国学的初次信息化尝试。 共享给有需要的朋友,准不准没关系,开心最重要。 后续还有财富,事业&…

SVM之SVR参数详解以及调参

SVM之SVR参数详解以及调参 一、参数、属性及方法1、参数kernel = ‘rbf’degree=3gamma=‘scale’coef0=0.0tol=0.001C=1.0epsilon=0.1shrinking=Truecache_size=200verbose=Falsemax_iter=-12、属性class_weight_coef_dual_coef_fit_status_interce

milvus数据库-管理数据库

一个 Milvus 集群最多支持 64 个数据库。 1.创建数据库 先连接数据库服务器,再创建 from pymilvus import connections, dbconn connections.connect(host"127.0.0.1", port19530)database db.create_database("book")2.连接数据库 可以改变…

2020年12月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 角色初始位置坐标是(0,0),执行下面程序后,角色会出现在什么位置上? A:x坐标为10,y坐标为50 B:x坐标为40,y坐标为50 C:x坐标为50,y坐标为40 D:x坐标为30,y坐标为50 答案…

代码随想录算法训练营第23期day56|647. 回文子串、516.最长回文子序列

一、647. 回文子串 力扣题目链接 重点是构造了一个dp[i][j]&#xff0c;来表示s字符串i到j是否是一个回文串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;…

将TiDB换成MySQL之后,我踩了一个坑

在之前的文章《MySQL 分库分表与 TiDB&#xff0c;如何选择&#xff1f;》中&#xff0c;提到了TiDB与MySQL的高度兼容性&#xff0c;以及可以平滑迁移替换MySQL数据库的优势。正是因为这个优势&#xff0c;我们的一个项目踩到了一个坑。 事情的经过是这样的&#xff1a;在项目…

解决Kibana初始化失败报错: Unable to connect to Elasticsearch

现象&#xff1a; 原因&#xff1a; docker run生成容器的时候&#xff0c;指定elastic server时指向了localhost 为什么不能是localhost, 因为这个localhost指向的是容器本身的网络&#xff0c;而elastic用的是物理网络&#xff0c;两个网络是隔离的&#xff0c;所以如果kiba…

STM32F4移植SPI注意事项

一、注意事项 可以看我之前移植的文章&#xff0c;那些就不提了&#xff0c;记得要复用&#xff0c;把IO复用成对应的功能io&#xff0c;然后还要注意时钟&#xff0c;看你需要的功能&#xff0c;去调对应的时钟&#xff0c;把时钟调匹配了&#xff0c;基本上不会有问题。 比如…

有Mac或无Mac电脑通用的获取安卓公钥的方案

从2023年9月开始&#xff0c;所有上架应用市场的app都需要进行APP备案。 其中后端服务器在阿里云的可以在阿里云备案&#xff0c;后端服务器在腾讯云的可以在腾讯云备案。但无论你是在什么云厂商里做备案&#xff0c;无一例外的是&#xff0c;无论是上架安卓应用还是上架IOS应…

# Apifox前后端开发人员使用场景

Apifox前后端开发人员使用场景 概述 官网&#xff1a;Apifox 快速入门 | Apifox 帮助文档 功能描述 1、在日常编程开发过程中经常使用前后端分离架构的模式&#xff0c;一个项目的落地会通过产品、开发、测试三方会审&#xff0c;对项目需求评审过后&#xff0c;前后端开发会…