MySQL的索引和事务

news2025/3/2 2:20:10

一、索引

(一)索引概念

索引是一种特殊的文件,包含数据库中所有记录的引用,可以对表中的一列或多列创建索引, 并指定索引的类型(存储引擎),每种索引在不同的存储引擎中的实现都有可能不同。

(索引类似数组的下标,通过下标拿到数组中的数据是很快的,同样通过索引去查询数据库中的数据也是很快的。)

(二)MySQL中经典的两种存储引擎

存储引擎:就是MySQL对数据进行增删改查的不同实现方案。

MyISAMMySQL5.5之前的默认存储引擎,不支持事务,性能较高
InnoDBMySQL5.5之后的默认存储引擎,支持事务,性能不如MyISAM

查看当前的存储引擎:

show variables like 'default_storage_engine';

 (三)索引适用情况

索引适用于数据量比较大,并且查多改少的情况。可以提高查询数据的效率,但是会拖慢增、删、改的效率。同时创建索引也需要时间和空间的开销。

  1. 演示:

step1:创建一张插入了8000000条记录的数据表

step2:在不创建搜索引的情况下,查询某条数据的具体信息。

在不创建索引的情况下,是进行全表扫描,在800万的记录中一行行扫描,知道查找到id_number为556677的信息为止,耗时3.58s。

step3:将id_number这一属性设置为索引。

可以看出,此时检索的速度是非常快的。

 2. 创建索引

create index 索引名称 on tb_name(属性名称)

 

3.查看索引

show index from tb_name;

4.可以通过explain可以查看MySQL的引擎分析SQL语句可能会用到的索引等信息,包括扫描的行数。

(1)没有创建索引的情况

(2)创建了索引的情况

5.删除索引

drop index  索引名称 on tb_name; 

(四)索引背后的数据结构

MySQL的索引实现基于B+树的设计(N叉搜索树)。

1.为什么数据库存储不用常见的高效查找数据的数据结构 (BST/哈希表等)

(1)BST:二叉搜索树 -- >RBTree :红黑树 

无论是二叉搜索树还是红黑树,它查找的时间复杂度为logN,当数据量非常大时,由于二叉树的每个节点最多只有两个子树,二叉树的高度会很高。而且数据库的数据都在磁盘上保存,每访问一个二叉树的节点都要读写一次磁盘,这样就会很慢。

(2)哈希表:

理论上利用哈希表可以在常数时间O(1)时间复杂度,找到指定数据,但哈希表无法处理区间查询操作。

2.B树 -- (N叉搜索树)

1. 每个树节点上都有多个值;

2.每个节点上的子树(分叉树)的个数,就是当前结点值的个数 + 1;

3.子树的结点值一定处在父节点的范围之内。

3.B+树

1.B+树中,子树节点中存在的最大值(最小值)是在父节点中出现过得值--->这样做的目的就是让最底层的叶子节点包含整个数据的全集!!!

2.B+树中,最底层的叶子节点使用链表连接 -- >更高效的区间查找

3.对于B+树来说,所有的数据都存储在叶子节点,非叶子结点只需要保存索引列的辅助信息(索引列的值),非叶子结点占用空间小,可以直接放在内存中,减少磁盘的IO。

4.聚簇索引 与 非聚簇索引

由于B树家族的每一个结点值都是一个复合值(都包含key(索引值) 和 value(对应数据)),根据索引类型和保存对应数据的的不同可以分为聚簇索引和非聚簇索引。

1.聚簇索引

聚簇索引(主键索引),一个表只有一个聚簇索引,构建索引树上的每个节点,除了要保存索引列的信息,还需要保存这条记录的完整内容。  ---- 查询速度快,一个表中只有一个聚簇索引,保存的信息多,占用空间大。

2.非聚簇索引

非聚簇索引(二级索引、普通索引、唯一索引、index创建的都是非聚簇索引,一张表中可以有多个非聚簇索引)。索引树上的每个节点,除了保存索引列的信息之外,还需要保存该记录的行号(对应的主键id)。--查询速度慢(只能找到主键信息,需要回表查询 -- 非聚簇索引相较于聚簇索引有更多的查表操作,也就是读写磁盘操作),一个表中可以有多个非聚簇索引,保存的信息少,占用空间小。

二、事务

(一)事务的概念

        所谓事务,就是把若干sql操作打包为一个整体,实际执行的时候,这个整体要么全部执行,要么全都不执行。

(如 银行转账业务:A要给B转钱,银行先要把A要转的钱扣除,然后再将钱转给B,这个过程在我们看来是一个整体,不可能说把A的钱扣了,但是B却没有收到。)

若执行的过程中,出现了突发事故,某些操作执行不下去了,MySQL可以保证在突发情况恢复之后,(数据没有遭到破坏为前提),通过事物的回滚(rollback)操作进行数据的还原。

事务的三个操作:

        1.开启事务:start transaction;

        2.执行多条sql语句(一个整体)

        3.提交或回滚:commit / rollback

        提交事务就是把开启事务之后所有sql语句统一在数据库上持久化。

        回滚操作就是取消上次对数据库做得修改。

(二)事务的特性(ACID)

        1.原子性 :

         一个事务中的所有操作,要么全都执行,要么全都执行失败。(执行失败之后,通过rollback操作进行数据的恢复)。

        2.持久性 :

         一个事务执行完成之后,这个事务对数据库的所有修改都是永久的(持久化,保存到磁盘上),不会丢失。

        3.一致性 :

        一个事务执行前后的数据都一种合法性的状态,事务永远都是从一个一致性的状态到另一个一致性的状态。

(仍以银行转账为例,在执行转账操作之前,A账户有100万,B账户有50万,这些确确实实是他们拥有的(合法状态),此时A要给B转10万,A账户应有90万,B账户应有60万(合法状态)。但如果A转账结束后是90万,B还是50万(不合法状态))

        4.隔离性 :

        多个并发事务访问数据库时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,不同事务之间相互隔离。

(一个sql中的执行操作,MySQL自身通过读写锁是可以保证数据并发时的正确性 ,但如果是事务,并发执行就会存在相应问题。)

(三)脏读  VS  幻读  VS  不可重复读

        1.脏读:

        事务A在修改数据,此时A还没将修改后的数据提交到数据库,事务B读取到了事务A修改后的数据,但事务A又进行了“回滚”,前面的修改都不作数了,事务B读到的就是“脏数据”,这种情况就称为脏读。

        2.幻读 :

        幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。事务不是独立执行时发生的一种现象,且其他事物的修改对于本事务不可见。(明明没有修改,但是读的同一组数据却发生了改变)

        3.不可重复读 :

        是指在同一个事务内,在多次读同一数据得到的结果不同。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。其他事务的修改对于本事务来说是可见的

        事务A此时在读一组数据为“XXXX”,事务A 读取了数据,但还未提交事务,这时事务B也读取了这组相同的数据,并将其修改为“****”,事务A再次读取这组数据时,结果就与上次读取时不一致,这种情况称之为不可重复读。

    

(四)事务的四种隔离级别

1.读未提交

在该隔离级别下事务可以看到其他还没有提交事务对数据库的修改。

2.读已提交

处在该隔离级别下的事务可以看到其他已经提交事务对数据库的修改。(Oracle数据库默认的隔离级别)

3.可重复读

一个事务一旦开启,在该隔离级别下,事务提交之前,多次查询看到的结果是相同的。无论其他事务如何修改数据库,在当前这个事务提交之前都是不可见得。

4.串行化

事务最高的隔离级别,所有事务都串行访问数据库,不会发生冲突,不会产生任何事物问题(没有并发执行)。

 

 1.读未提交:v1,v2,v3的值:2  2  2

 2.读已提交:v1,v2,v3的值:1  2  2

 3.读未提交:v1,v2,v3的值:1  1  2

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

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

相关文章

Vite,Vue3项目引入dataV报错的解决方法

背景:开发一个大屏项目中,需要是要DataV的那边边框,装饰等,只是DataV是基于vue2的,vue3版的作者还在开发中,于是翻了DataV的源码,发现使用esm方式时是直接引入源码而不经过打包,其源码中使用的vue语法vue3也支持,所以可以直接在vue3中引入使用. vite,vue3项目直接引入DataV 安…

ELK日志框架图总结

ELK日志框架图总结 本文目录 ELK日志框架图总结Elastic Stack介绍模式分层图beatselasticsearchkibana模式logstashelasticsearchkibana模式beatslogstashelasticsearchkibana模式beats缓存/消息队列logstashelasticsearchkibana模式elkspringboot Elastic Stack介绍 官网&…

数据挖掘实验-主成分分析与类特征化

数据集&代码https://www.aliyundrive.com/s/ibeJivEcqhm 一.主成分分析 1.实验目的 了解主成分分析的目的,内容以及流程。 掌握主成分分析,能够进行编程实现。 2.实验原理 主成分分析的目的 主成分分析就是把原有的多个指标转化成少数几个代表…

【项目 计网11】4.29 epoll API介绍 4.30 epoll 代码编写 4.31 epoll的两种工作模式

4.29 epoll API介绍 epoll_create实例在内核区&#xff0c;创建了一个eventpoll结构体。这个函数的返回值是一个文件描述符&#xff0c;通过这个fd去操纵eventpoll #include <sys/epoll.h> //创建一个新的epoll实例。在内核中创建了一个数据&#xff0c;这个数据中有两个…

MergeTree表的三种格式

MergeTree表的三种格式 MergeTree表引擎有三种格式&#xff1a;Compact、Wide和In-memory&#xff0c;前两个为主要格式。具体区别是&#xff1a; Compact - 所有的列的数据放在一个文件&#xff1b;Wide - 每个列的数据放在一个文件&#xff1b;In-memory - 数据存在内存中&…

muduo 32 muduo项目总结

Timestamp时间管理类 ①&#xff1a;主要提供now函数显示当前时间&#xff1a;自1970年1月1日0点以来经过的秒数&#xff0c;使用time函数 ②&#xff1a; toString函数将字符串转化成时间字符串&#xff0c;使用localtime函数将秒数格式化成日历时间 解析tm_time 并以日历格…

JavaFX之Stage

Stage&#xff08;舞台&#xff09;&#xff0c;它代表了一个顶级窗口&#xff0c;是JavaFX应用程序的主要容器。Stage可以包含多个场景&#xff08;Scene&#xff09;&#xff0c;每个场景可以包含各种用户界面元素&#xff08;如按钮、文本框等&#xff09;。Stage提供了许多…

Android Studio配置

Android Studio安装包下载安装 安装包下载 进入网站 https://developer.android.google.cn/studio 下载Android Studio安装包&#xff08;本文版本android-studio-2021.1.1.22-windows&#xff09; 点击按钮之后会弹出条款&#xff0c;点击同意 安装包安装 点击next 选择…

Redis(详细)

目录 Redis是什么 Redis的主要特点 Redis的使用场景 会话存储 缓存存储 实现分布式锁 Redis为什么这么快 基于内存操作 高效的数据结构 多路I/O复用模型 单线程执行 Redis常见的数据结构 Redis有序列表的实现 跳跃表的执行流程 Redis分布式锁实现 使用分布式锁…

vue学习之属性绑定

内容渲染 采用 &#xff1a;进行属性渲染创建 demo3.html,内容如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

Kafka/Spark-01消费topic到写出到topic

1 Kafka的工具类 1.1 从kafka消费数据的方法 消费者代码 def getKafkaDStream(ssc : StreamingContext , topic: String , groupId:String ) {consumerConfigs.put(ConsumerConfig.GROUP_ID_CONFIG , groupId)val kafkaDStream: InputDStream[ConsumerRecord[String, Strin…

centos7安装airflow2.7.1

python3安装 版本 Python-3.9.17 ./configure --prefix/usr/local/python3 make && make install随后用ln -s短链接python3和pip3 airflow安装 版本2.7.1 export AIRFLOW_HOME~/airflow编写一个sh文件 AIRFLOW_VERSION2.7.1# Extract the version of Python you…

C 风格文件输入/输出---直接输入/输出---(std::fread)---(std::fwrite)

C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数&#xff0c;而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 从直接输入/输出 文件读取 std::fread 从给定输入流 stream …

基于ESP32设计可以通过 WiFi 控制的基于 ESP32 的定制四轴飞行器

介绍 我想选择一个涉及物联网概念的项目,例如无线通信和服务器端脚本编写。我最终决定建造一架四轴飞行器,使用定制的机载飞行控制器进行飞行,该控制器通过 WiFi 从触摸屏平板电脑接收操纵命令。该项目的最终目标是让四轴飞行器从相机图像中跟踪移动物体并跟随它。 硬件 对…

正则表达式:实数

正则表达式&#xff1a;实数 校验字符串&#xff0c;为有效的实数。 可以为&#xff1a;正数或负数&#xff1b; 可以为&#xff1a;整数或小数&#xff1b; 但是&#xff0c;不可以为非数值型的字符串&#xff0c;不可以是一连串的“0” 。 原始正则表达式 ^-?(0|[1-9]\d…

高可用Kuberbetes部署Prometheus + Grafana

概述 阅读官方文档部署部署Prometheus Grafana GitHub - prometheus-operator/kube-prometheus at release-0.10 环境 步骤 下周官方github仓库 git clone https://github.com/prometheus-operator/kube-prometheus.git git checkout release-0.10 进入工作目录 cd kube…

GDB的C++调试方法

本文记录基础的GDB调试过程&#xff0c;包含指令如下&#xff1a; 文章目录 准备编译文件GDB启动GDB开启代码行设置断点运行程序查看pc的指令查看监视的变量以及断点设置快照checkpoint实验1实验2 nextnextistepx/i $pcfinishinfo break 和 delete Numrefbreak col. if condit…

浅谈原型链

一.在掌握原型链之前首先要了解这三点 1.每个函数都有prototype这个属性我们称为原型对象 2.每个对象都有__proto__这个属性 3.对象的__proto__可以访问原型对象上的方法和变量,如果访问不了,就会向上进行查找,直到找不到为止,会出现报错的情况l。 二.例子 1.代码: let arr …

云计算与虚拟化

一、概念 什么是云计算&#xff1f; 云计算&#xff08;cloud computing&#xff09;是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果…

基于folium绘制黑河腾冲线,胡焕庸线

背景 黑河腾冲线&#xff0c;又名胡焕庸线&#xff0c;是我们人口密度分布的的近似分界线。今天基于folium&#xff0c;使用python来绘制这条线。 代码 # -*- coding:UTF-8 -*-# region 引入必要依赖 from selfPyTools.mapModule import * # endregion# 准备一个地图类对象,…