MySQL——索引与事务

目录

·前言

一、索引

1.索引概述

(1)基本概念

(2)索引作用

(3)索引特点

(4)适用场景

2.索引的操作

(1)查看索引

(2)创建索引

(3)删除索引

3.索引底层数据结构

(1)概述

(2)B树的基本概念

(3)B+树的基本概念

二、事务

1.事务的概念

2.事务的特性

(1)原子性

(2)一致性

(3)持久性

(4)隔离性

3.有关事务典型问题

(1)脏读问题

(2)不可重复读问题

(3)幻读问题

4.隔离级别

(1)read uncommitted

(2)read committed

(3)repeatable read

(4)serializable

5.事务的使用

·尾声


·前言

        谈到MySQL,避不开索引与事务这两个十分重要的概念,索引使MySQL在查询时效率更高,事务则是为了MySQL能更安全无误的运行,下面就由我来为大家进行今天的知识介绍吧。

一、索引

1.索引概述

(1)基本概念

        索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。索引的英文名是index(更多被翻译成下标),可以理解成目录。

(2)索引作用

        假设你有一本书,如何快速定位某个章节所在的位置,这就需要使用目录进行查找了,在数据库中,进行条件查询的时候经常需要遍历表,由于数据库是把数据存储在硬盘上,所以在数据库上进行遍历表的操作时间复杂度O(N)会比咱们平时说的O(N)要慢很多,因此我们可以给数据库引入索引,从而提高我们的查询速度。

  • 数据库中的表、数据、索引直接的关系,就类似于书架上图书,图书内容和图书目录的关系
  • 索引所起的作用就类似于图书目录,可以快速定位、检索数据
  • 索引对于提高数据库性能有很大的帮助

(3)索引特点

  1. 加快查询的速度;
  2. 索引自身是一定的数据结构,也要占据内存空间;
  3. 当我们需要进行新增、删除、修改操作的时候,也需要针对索引进行更新(额外开销)。

        需要注意的是,进行删除、修改操作时,搭配条件语句,需要先根据条件查找,再进行修改。如果没有使用条件进行查找或者使用条件查找但是没有利用索引的时候,删除、修改操作的速度肯定会慢,并且在修改、删除之后,还需要进行维护索引,这个过程是比较慢的。

(4)适用场景

  1. 存储空间比较充裕(索引会占用额外的空间);
  2. 应用场景中,涉及查询较多,增加、删除、修改都不多。(减少维护成本)

        对于读多写少的场景,是比较常见的,很多web程序(网站)都是这样的。

        满足以上条件,可以考虑对表中的这些字段创建索引,这样可以提高查询的效率,反之,如果使用非条件查询列,或者经常做插入、修改操作,或者磁盘空间不足时,不考虑创建索引。

2.索引的操作

(1)查看索引

        语法格式:

show index from 表名;

        在前面文章介绍约束时,曾提过创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时会自动创建对应列的索引,下面通过示例进一步介绍与演示:        在一个表中,索引可以有多个,每个索引都是根据某个具体的列来展开的,后续按照这个列进行查询,这个时候才能提高效率。

(2)创建索引

        语法格式: 

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

         创建索引的这个操作是一个比较危险的操作,如果表中没有数据,或者数据比较少,此时创建索引是没有危险的,如果表本身就有很多数据,此时创建索引操作就会触发大量的硬盘IO。创建索引的具体操作与效果如下:

        为了减少上述创建索引引起的危险情况,就需要我们在建表之初,做好规划,在创建表时就把需要的索引创建好。 

(3)删除索引

        语法格式:

drop index 索引名 on 表名;

        删除索引也是一个比较危险的操作,逻辑与创建索引逻辑相似,这里演示示例就是将上面刚创建的索引进行删除,具体操作与效果如下: 

3.索引底层数据结构

(1)概述

        索引其实就是通过额外的数据结构,来针对表里的数据进行重新组织,使用什么样样的数据结构对于查询的时间,表的占用空间都有很大的影响,在学习数据结构时,有一个数据结构在查询时,时间复杂度是O(1),这个数据结构是哈希表,由于自身复杂的实现逻辑,保证了它是查询速度最快的,可是,在数据库查询的时候,经常是指定条件进行查询,进行一些范围查询,这时候使用哈希表就十分不友好了,因为哈希表查询是把key通过一定的hash函数转换成数组下标,再在对应下标中进行查找,这里只能比较相等查询一个数据,因此,数据库的索引使用的是B+树作为数据结构,B+树这个数据结构相当于是针对数据库这个场景量身定做的。

(2)B树的基本概念

        再介绍B+树之前,先介绍一下B树的逻辑,因为B+树就是在B树上进行的调整。

        B树是一个N叉搜索树,只不过这里要求数据是有序的,B树就是在二叉搜索树这里进行了扩展,一个节点上可能包含N个值,这N个值就划分出了N+1个区间,这样同样高度的树,B树能表示的元素个数就比二叉搜索树多很多很多了,同时使用B树进行查询的时候,每一轮比较次数比二叉搜索树要更多,但是,这里关键在与同一个节点的这些key都是一次硬盘IO就读出来了,所以即使总的比较次数增加了,但是硬盘IO的次数减少了,进行一次硬盘IO相当于内存中进行1万次的比较,由此可以看出B树相比与二叉搜索树更有优势用在数据库的索引上,B树的大致结构如下:

(3)B+树的基本概念

        B+树,是在B树的基础上进行了改进,B树同样也是N叉搜索树,每个节点包含多个key,N个key划分出N个区间。

        B+树的特点:

  1. N叉搜索树,每个节点上包含N个key,N个key划分出N个区间;
  2. 每个节点的N个key中,会存在一个“最大值”(设定成最小值也一样);
  3. 每个节点中的key,都会在子树中重复出现;
  4. 把叶子节点之间使用链式结构进行相连。

        B+树大致结构如下:

        B+树的优点:

  1. B+树每个节点中的key,都会在子树中重复出现,这一特性中,“重复出现”带来一个好处,就是所有数据都包含在叶子节点这一层中,这样叶子节点就有着数据全集,并且B+树的叶子节点之间使用链式结构进行相连,“重复出现”与链式结构互相配合就使范围查询变得十分简单,高效,举一个例子:进行范围查询id >= 4 and id <= 10,此时根据4找到对应的位置,在沿着链表往后遍历找到10就可以了,如果没有这个链式结构,就要反复对树进行回溯,那就会比较慢了;
  2. 针对B+树,查询的时间是很稳定的,因为B+树进行查询任何元素都是需要从根节点查询到叶子节点的,过程中经过的硬盘IO次数都是一样的(B树,有时候硬盘IO多,有时少),稳定比单纯的快更有用;
  3. 按照这个特点,存储数据只需要在叶子节点存储每个字段具体数据信息即可,其他非叶子节点只存储key即可,比如,我们创建了一个学生表(id,name,gender,classid.......),此时对id使用索引,因此非叶子节点只存储了id,由于id占用空间比较小,所以这些非叶子节点的数据可以缓存到内存,这样在查询的时候,只进行内存的比较,就大幅度减少了硬盘的IO次数了。

         此处对B+树只是粗略的介绍,在后面文章中,我会再对B+树进行更详细的介绍。

二、事务

1.事务的概念

        事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

        对于数据库事务中有一个非常经典的场景:转账,例如有一天张三给李四转账500,这时数据库就需要修改张三的余额减少500,然后再修改李四的余额增加500,但是在其中修改张三余额之后数据库出现问题崩溃了,没有执行修改李四余额增加500的操作,等数据库好了之后就会发现,张三的余额少了,但是李四的余额并没有多,为了解决这种问题,所以引用了事务,这就是事务应用的一个经典场景。

2.事务的特性

(1)原子性

        原子性,就是指通过事务把多个操作打包到一起,这也是事务最重要的特性,也是事务的初心。

(2)一致性

        一致性,就相当于原子性的延伸,当数据库中间出现了问题,不会产生像上述转账场景中“钱凭空消失”这种不科学的情况,并且还可以通过约束,来避免数据出现一些非法的情况。

(3)持久性

        持久性,就是事务的任何修改都是持久化存在的(写入硬盘),这样无论是重启程序,还是重启主机,所进行的修改都不会丢失(数据库本身就是为了持久化存储)。

(4)隔离性

        隔离性,就是多个事务并发执行的时候,可能会带来一些问题,通过隔离性来对这里的问题进行权衡,这时就看你希望数据尽量准确还是希望速度尽量更快了。

3.有关事务典型问题

(1)脏读问题

        当前有两个事务a和b:

事务a:修改了某个数据,但是事务还没有“提交”(提交是指告诉服务器当前指令执行完毕)

事务b:读取了同一个数据。

        此时,事务b读到的数据很可能是一个脏的数据,因为事务a后续可能还要修改这个数据。

        解决脏读问题,核心思路就是降低事务的并发程度,给写操作加锁(加锁,意味着释放锁之前,你是不能访问的),写的时候不能读,写完并且提交事务之后(释放锁),才能让别人读。

(2)不可重复读问题

        不可重复读问题与脏读问题有点像,但不可重复读是在“写操作加锁”的前提下导致的问题,这里虽然写操作加锁了,但是可以分成多个事务,多次提交的方式来修改数据。

        当前有事务a、事务b和事务c:

事务a:先修改某个数据(加锁),此时别的事务想读数据,得等事务a提交完。

事务b:事务a提交完,事务b开始读数据(事务b中可能会多次读取数据)。

事务c:进行修改上述数据。

         此时,在事务c修改完数据,事务b还在读数据,就会导致事务b在一次事务中读到的数据结果不一样,就好比在买东西时,开始看还是30元,等再看时变成60元了,这样就会导致购物体验很不好。

        解决不可重复读问题,就需要给“读操作加锁”,相当于在事务b读取数据时,别的事务不能对这个数据进行修改,这样就使并发程度降低了,数据的准确性提高了。

(3)幻读问题

        有事务a、事务b和事务c三个事务:

事务a:先修改某个数据(加锁)。

事务b:等事务a提交完,开始读数据(加锁),此时不能修改数据。

事务c:新增一个其他数据。

         此时,事务c新增了一个其他数据,导致事务b在进行多次读取数据时,两次读到“结果集”不一样(结果集就类似查询的时候查询的行数)。

        解决幻读问题,可以使所有操作串行化,不再进行任何并发了,每个事务都是串行执行(执行完第一个,再执行第二个……)此时并发程度最低,同时数据的准确性最高。

4.隔离级别

        在MySQL配置中,提供了“隔离级别”这样的选项,我们可以根据需要调整隔离级别,以适应不同的情况。通常事务之间影响越小,隔离程度就越高。

(1)read uncommitted

        读未提交,这是并行程度最高的,隔离程度最低的,效率是最高的,数据是最不靠谱的。此时就可能出现:脏读、不可重复读、幻读这些问题。

(2)read committed

        读已提交,相当于给写操作加锁,并行程度降低了,隔离程度提高了,效率会降低一些,数据会更靠谱一些。此时可能会出现:不可重复读与幻读这些问题。

(3)repeatable read

        可重复读,相当于给读操作和写操作都加锁。并行程度降低了,隔离程度提高了,效率再降低一些,数据更加靠谱。此时可能出现:幻读这种问题。repeatable read是MySQL中默认的隔离级别。

(4)serializable

        串行化,相当于让所有事务都串行执行。并发程度最低,隔离程度最高,效率最低,数据最靠谱。

5.事务的使用

        有关事务的使用,在这我只简单的介绍一下有关事务使用的几个关键字:

start transaction;   --执行事务之前,开启事务

commit;     --告诉服务器,事务完毕

rollback;     --告诉服务器,要进行回滚,把开始事务之后执行的SQL恢复回去

         关于rollback操作,一般不会在控制台使用,以Java为例,会在Java代码中使用,Java代码开始事务,执行SQL,某个SQL抛出异常,在catch语句中捕获到异常时使用rollback。

·尾声

        文章到此就要结束了,上述有关索引与事务的介绍是比较基础的,事实上,有关索引与事务,两个概念都有很多的内容,在本篇文章中就是先简单让大家知道索引与事务是什么,介绍了一些基础的概念,一些基础的使用还有一些需要注意的事项,后续文章还会对这两个重要概念进一步介绍,如果本篇文章对你有所帮助,希望能点赞收藏支持一下咯~~~~您的支持是我最大的动力,让我们在下一篇文章见吧~~

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

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

相关文章

文科论文,使用AI写作时能够提供实证数据吗?

人工智能时代&#xff0c;为了撰写论文提供思路及高效&#xff0c;利用AI撰写论文已是常态&#xff0c;可撰写文科论文通常研究中都需要实证数据&#xff0c;而AI撰写论文时能够提供这样的数据吗&#xff1f; 一、什么是实证数据 实证数据是指从研究报告、财务报表、新闻报道…

计算机网络——TCP 协议的三次握手 / 四次挥手

简述 TCP / UDP 协议都是传输层的协议。 UDP 是面向无连接的协议&#xff0c;就是说发送端不在乎消息数据是否传输到接收端了&#xff0c;所以会出现数据丢失的情况&#xff0c;所以可靠性也不高。 TCP 是面向连接的、可靠的、基于字节流的传输层协议。所谓面向连接的&#…

Flink-cdc更好的流式数据集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一种数据变更捕获技术&#xff0c;用于从数据源&#xff08;如数据库&#xff09;中捕获和处理数据的变更事件。CDC技术允许实时地捕获数据库中的增、删、改操作&#xff0c;将这些变更事件转化为流式数据&#xff0c;并能够…

Windows平台C#版RTSP转RTMP直播推送定制版

技术背景 前几年我们发布了C版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下&#xff0c;客户无需关注开发细节&#xff0c;只需图形化配置转发等各类参数&#xff0c;实现产品快速上线目的。 如监控类摄像机、NVR等&#xff0c;通过厂商…

【启程Golang之旅】深入解析函数的奥秘与技巧

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

【全开源】海报在线制作系统源码(ThinkPHP+FastAdmin+UniApp)

打造个性化创意海报的利器 引言 在数字化时代&#xff0c;海报作为一种重要的宣传媒介&#xff0c;其设计质量和效率直接影响着宣传效果。为了满足广大用户对于个性化、高效制作海报的需求&#xff0c;海报在线制作系统源码应运而生。本文将详细介绍海报在线制作系统源码的特…

AbMole - 肿瘤发展与免疫器官的“舞蹈”:一场细胞层面的时间赛跑

在生物医学领域&#xff0c;肿瘤与免疫系统之间的相互作用一直是研究的热点话题。肿瘤细胞不是孤立存在的&#xff0c;它们与宿主的免疫系统进行着一场复杂的“舞蹈”。 最近&#xff0c;一项发表在《Molecular & Cellular Proteomics》杂志上的研究&#xff0c;为我们揭开…

【C++】二分查找算法

1.题目 2.算法思路 暴力解法&#xff1a;可以将数组遍历一遍&#xff0c;就可以找到。时间复杂度为O(n)。不算太差&#xff0c;可以接受。 但是有更优秀的解法&#xff1a; 就是二分查找算法。 算法的特点&#xff1a;我们所查找的“数组”具有二段性。这里的二段性不一定有…

Oracle 并行和 session 数量的

这也就是为什么我们指定parallel为4&#xff0c;而实际并行度为8的原因。 insert create index&#xff0c;发现并行数都是加倍的 Indexes seem always created with parallel degree 1 during import as seen from a sqlfile. The sql file shows content like: CREATE INDE…

滑不动窗口的秘密—— “滑动窗口“算法 (Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

《python编程从入门到实践》day39

# 昨日知识点回顾 创建主页、继承模版、显示特定主题页面 # view.py from django.shortcuts import render# 导入所需数据相关联的模型 from .models import Topic# Create your views here. def index(request):"""学习笔记的主页"""#…

Java进阶学习笔记13——抽象类

认识抽象类&#xff1a; 当我们在做子类共性功能抽取的时候&#xff0c;有些方法在父类中并没有具体的体现&#xff0c;这个时候就需要抽象类了。在Java中&#xff0c;一个没有方法体的方法应该定义为抽象方法&#xff0c;而类中如果有抽象方法&#xff0c;该类就定义为抽象类…

ISCC2024个人挑战赛WP-迷失之门

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 迷失之门 方法一&#xff1a; IDA看一下 check函数逻辑 进入到check2函数 R键将ascii码转字符&#xff0c;写出逆向脚本 #include <stdio.h> #include &l…

Linux C++ Socket 套接字、select、poll、epoll 实例

文章目录 1. 概述2. TCP 网络编程实例2.1 服务器端2.2 客户端2.3 运行截图 3. I/O 模型3.1 阻塞式I/O模型3.2 非阻塞I/O模型3.3 I/O 复用模型3.4 信号驱动式I/O3.5 异步I/O模型 4. I/O复用之 select4.1 select 函数描述4.2 服务端代码4.3 客户端代码4.4 运行截图 5. I/O复用之 …

RocketMq局部顺序消息

package com.ldj.rocketmq.producer;import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;/*** User: ldj* Date: 2024/5/26* Time: 15:09* Description: 局部顺序消…

css卡片翻转 父元素翻转子元素不翻转效果

css卡片翻转 父元素翻转子元素不翻转效果 vue <div class"moduleBox"><div class"headTitle"><span class"headName">大额案例</span></div><div class"moduleItem"><span class"module…

three.js判断物体在人的前面,还是后面

three.js判断物体在人的前面&#xff0c;还是后面 const player new THREE.Vectors(10, 0, 5); const mesh new THREE.Vectors(15, 0, 6);上面&#xff0c;两个变量分别表示&#xff0c;玩家的位置&#xff0c;物体的位置。 从这发现&#xff0c;当玩家和物体的角度关系 小…

spring boot 整合j2cache 项目启动警告 Redis mode [null] not defined. Using ‘single‘

好 之前的文章 spring boot 整合j2cache 基础操作 在spring boot环境中整合了 j2cache 我们 项目启动时 日志会有一个关键信息 Redis的模式 没有定义 默认使用 single Redis 的这个模式有四种 大家可以自己去网上找一下 做个了解 不用很纠结 我们直接在 j2cache.properties …

一文读懂Apollo客户端配置加载流程

本文基于 apollo-client 2.1.0 版本源码进行分析 Apollo 是携程开源的配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性。 Apollo支持4个维度管理Key-Value格式的配…

比勤奋更重要的是系统思考的能力

不要在接近你问题症状的地方寻找解决办法&#xff0c;要追溯过去&#xff0c;查找问题的根源。通常&#xff0c;最有效的活动是最微妙的。有时最好按兵不动&#xff0c;使系统自我修正&#xff0c;或让系统引导行动。有时会发现&#xff0c;最好的解决办法出现在完全出乎预料的…