MySQL索引与事务

1. 索引

(1)概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。

(2)利弊

利:

  1. 数据库中的索引目的是为了加快查询速度,在执行select这样的操作时,默认是按照遍历的方式来进行查询的;比如在执行where判断语句时就是遍历来进行,满足条件则留下,不满足则跳过判断下一个(此处每取一行的时间复杂度为O(N),每次遍历都是需要读硬盘的,之前像数组遍历的操作是读内存的操作
  2. 所谓的"索引"就相当于是在数据库中,构建一个特殊的"目录"(一系列特定的数据结构,硬盘)
    通过这样的数据结构,加快查询的速度,尽可能避免针对表数据的遍历操作. 

弊:

引入索引后可能会影响增删改的效率
        变慢:增加维护索引的开销,当在表中插入,修改或删除数据时,数据库不仅需要更新表中的数据,还需要更新相关的索引结构。这增加了额外的开销
        变快:在进行where语句的删除操作时就会加快效率,因为会在查询的基础上来进行删除,查询的效率变高了

遍历读内存数据和遍历读硬盘数据有什么区别 ?(了解即可)

  1. 访问速度
    内存:因为内存与CPU直接相连,因此访问内存数据的速度非常快。
    硬盘:与内存相比,硬盘的访问速度较慢,因为数据需要从硬盘读取到内存,然后才能被CPU处理。硬盘的存取速度往往是主存的几百分分之一。
  2. 数据预读
    内存
    :内存访问通常是直接和即时的,不需要预读。
    硬盘:硬盘往往不是严格按需读取,而是每次都会预读
  3. 存储结构
    内存:内存通常组织成线性的字节数组,可以直接通过地址访问。
    硬盘:硬盘上的数据按照文件系统和目录结构组织,需要通过文件系统API进行访问。
  4. 数据持久性
    内存:内存中的数据在断电后会丢失,因此是易失性的
    硬盘:硬盘上的数据在断电后仍然保留,因此是非易失性的。
  5. 访问方式
    内存:内存访问通常通过指针或引用进行,可以直接访问内存中的任何位置
    硬盘:硬盘访问通常通过文件系统API(如open、read、write等)进行,这些API提供了对文件和目录的抽象操作。
  6. 遍历方式
    内存:遍历内存数据通常使用循环和指针或引用操作
    硬盘:遍历硬盘数据通常涉及打开文件、读取文件内容、关闭文件等操作。

(3)使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  1. 数据量较大,且经常对这些列进行条件查询。
  2. 该数据库表的插入操作,及对这些列的修改操作频率较低。
  3. 索引会占用额外的磁盘空间。

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

(4)使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。 

--查看索引
show index from 表名;--查看affair的索引
show index from affair;

 说明:

  • id为主键约束,自动创建了该列的索引,在进行形如:
    select * from affair where 
    id .....的操作时就会大大提高查询的效率
  • select * from affair where name .....则不会提高效率,注意一定是基于索引的语句

对于外键索引来说,在子表中插入/修改,需要查询父表.在父表进行修改/删除,也需要查询子表.


--创建索引
create index 索引名 on 表名(字段名);--给affair的name创建索引
create index name_index on affair(name);

 注意:

创建索引,也是一个"危险操作",如果是针对空表,或者表中的数据比较少(几千,几万..)创建索引,就谈不上危险不危险.
一旦表的数据量比较大,千万级别....此时创建索引操作,就可能会触发大量的硬盘IO,直接把机器就搞的卡死住了.
在最初建表的时候,都要有哪些索引,提前规划好,创建好...

万一某个表,确实没有提前创建索引,现在又有了很多数据了,非加索引不可,此时咋办呢??

使用新机器新创建一个数据库,旧库的数据导入到新库中,变为旧库访问新库操作
 


--删除索引
drop index 索引名 on 表名;--删除affair中name的索引
drop index name_index on affair;

注意:只能删除自己创建的索引,不能删除自动生成的

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

所谓的"构建索引"其实就是引入一些数据结构,对数据进行存储,从而提高查找的速度. 

那哪些数据结构可以提高查找的速度呢?

  • 二叉搜索树:当要保存的元素多时,就会使整个树的高度变高,这样比较的次数就会越来越多,但由于是在硬盘上,所以不太合适。
  • 哈希表:最大的问题在于,只能进行"相等"查询.无法进行><这样的"范围查询",也无法进行like模糊查询.哈希表是要通过哈希函数,把查询的key映射成数组下标
  • B+树就是为数据库索引量身定做的数据结构


B树,也就是N叉搜索树,每个节点可以有多个子树(树的度为N),这样每个节点存储的key就会是多个值了

某个节点上保存了N个key就可以延伸出N+1个子树;此时,进行查询的时候,针对每个节点,都需要比较多次,才能确定下一步走哪个区间,高度得到了降低,但比较次数变多了;

B树优势:访问硬盘的次数变少了,和某个节点进行比较的时候,是先一次硬盘IO,把所有的这个节点上的内容都读取出来接下来的比较都是在内存中进行的了.
这里主要的目的,不是为了减少比较的次数,而是要减少硬盘IO的次数.


B+树 是针对B树做出的进一步的改进的数据结构,B+树也是N叉搜索树

特点:

  • B+树是有N个key,划分出N个区间
  • 父节点的key会在子节点中以最大值的形式再次出现
  • B+树会把叶子节点像链表一样首尾相连

B+树的优势:

  1. N叉搜索树,高度比较低, 此时硬盘IO次数就比较少.
  2. 叶子结点是全集,并且用链表结构连接,非常便于范围查询
  3. B+树,所有的查询都是要落到叶子结点上完成的,任何一次查询,经历的IO次数和比较次数都是差不多的.查询的开销稳定
  4. 由于B+树,叶子结点是全集,非叶子节点上不必存储"数据行",只需要存储索引列的 key即可.使得非叶子节点,消耗的空间比较少~~

2.事务

(1)概念

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

举例说明:A用户给B用户进行转账操作,会进行两步操作

  1. A用户原本的余额为1000元,向B转账500元,余额变为500元
    update 账户余额表set balance = balance - 500 where id = 1;
  2. B用户原本的余额为500元,接收到A的转账,余额变为1000元
    update 账户余额表set balance = balance + 500 where id = 2;

执行此事务时我们必须保证两步操作必须都要完成,不能出现类似"转账未到账的情况",这时,我们引入事务就是为了解决此类问题
 

简单来说,所谓事务就是将多个要执行的SQL语句打包成一个整体,这个整体在执行的过程中就可以实现要么整个都执行完,要么都不执行,这样就可以避免转账一半的中间状况

 (2)注意事项

注意:此处的一个都不执行,并不是一个SQL语句都没执行,而是执行一半发现出错会自动进行"还原操作",相当于将前面的SQL进行了"撤销操作",最终像是没执行一样,这样的机制称为"回滚",同时把事务支持的上述特性称为原子性

数据库是如何知道具体是怎样回滚的,如何知道前面的sql做出了什么修改?

数据库内部存在一系列的"日志体系",记录到文件中(可以应对程序崩溃和主机掉电的问题),当开启事务的时候,此时每一步执行的sql,都对数据进行了哪些修改,这些信息就会记录在案.后续如果需要回滚,就可以参考之前记录的内容,进行还原了.
 

(3)特性

事务最核心的特性,就是原子性,能够解决的问题,就是批量执行sql的问题.
例:有新生登记~~(可能需要往学生表/班级表同时插入数据)

        电商网站上下单(可能需要改商品表的库存数据/新增订单数据)

(1)开启事务:start transaction;
(2)执行多条SQL语句

(3)回滚或提交:rollback/commit;

  说明:rollback即是全部失败,commit即是全部成功。

start transaction;
-- 张三账户减少2000
update accout set money=money-2000 where name = '张三';
-- 李四账户增加2000
update accout set money=money+2000 where name = '李四';
commit;

事物的四个核心特性:

  1.  原子性(最重要的特性)
  2. 一致性,描述的是,事务执行前和执行后,数据库中的数据,都是'合法状态',不会出现非法的临时结果的状态.
  3. 持久性,事务执行完毕之后,就会修改硬盘上的数据.事务都是会持久生效的.
  4. 隔离性,描述了多个事务并发执行的时候,相互之间产生的影响是怎样的.
    MySQL是一个"客户端-服务器"结构的程序,一个服务器通常会给多个客户端同时提供服务.  因此,很可能,这多个客户端,就同时给这个服务器提交事务来执行.与之相对,服务器就需要同时执行这多个事务,此时就是"并发"执行

此时,如果这些同时执行的事务,恰好也是针对同一个表,进行一些增删改查,此时就可能会引入一些问题
1)脏读
2)不可重复读
3)幻读问题

1)脏读

有两个事务A和B并发执行.
其中事务A在针对某个表的数据进行修改.A执行过程中,B也去读取这个表的数据.当B读完之后,A把表里的数据又改成别的.
这就导致,B读到的数据,就不是最终的"正确数据"而是读到了临时性的,"脏数据"

通俗来说就是,小红学习很好,小刚学习不好,考试时小刚想要抄小红的答案,而小红因为粗心,最后才察觉到错误,需要重新修改,而此时小刚并未察觉小红已修改内容,此时小刚读到的内容就是"脏数据"(往往指的是"数据过期,过时了"错误的数据了~~)

如何解决呢?

小刚和小红约定好最后五分钟修改完再抄,修改之前,小刚不能抄,也可以称为"给写操作加锁"(JavaEE多线程会学习)  小红修改的时候,小刚不能抄

一个事务在修改的时候,其他事物不能读取该事务

2)不可重复读

此时,有三个事务,ABC.
首先,事务A执行一个修改操作.A执行完毕的时候,提交数据.接下来事务B执行,事务B读取刚才A提交的数据....
在B读取的过程中,又来了一个事务C,C又对刚才A修改的数据再次做出了修改.
此时对于B来说,后续再读取这个数据,读到的结果就和第一次读到的结果是不一样的.

如果是有多个事务,每个事务读到的数据不一样这种情况认为是正常

通俗来说就是,小刚和小红约定好在最后五分钟小红确定答案后小刚再进行抄写,在小刚进行抄写的过程,小红发现刚才的题好像有点问题,于是又进行了重新修改,此时小刚的视角看起来就是答案突然变样了


如何解决?

再次进行约定,小红在修改的时候小刚不进行抄写

小刚在抄的时候,小红不能写
一个事务在读取数据的过程中,其他的事务不能修改它正在读的数据.给读操作加锁
 

3)幻读问题

相当于不可重复读的特殊情况

有一个事务A在读取数据.读的过程中,另外一个事务B,
新增了/删除了一些其他的数据....此时站在A的视角,多次读取的数据内容虽然一样,但是"结果集”不同
 

通俗来说就是,小刚和小红已经约定好了,小红写完再抄,小刚抄的时候小红不再去修改

小刚在抄的时候,小红没有修改错误的答案,在错题的旁边标注正解二字并写了正确答案,而站在小刚的角度来看,虽然小刚在读的过程中小红没有在修改答案,但是抄着抄着突然出现了正解,这样的问题就是幻读

如何解决?

小刚在抄的过程中出现了其它内容

还是跟小红进行约定,在抄的过程中不进行任何操作,这样的操作成为串行化


并发执行的事务设计的三个问题又和隔离性有什么关系呢?

在mysql中提供了四个隔离级别.可以通过配置文件来设置当前服务器的隔离级别是哪个级别.
设置不同的隔离级别,就会使事务之间的并发执行的影响产生不同的差别,从而会影响到上述的三个问题的情况~~


1)read uncommitted读未提交.
这种情况下,一个事务可以读取另一个事务未提交的数据.此时,就可能会产生脏读,不可重复读,幻读三种问题.....
但是此时,多个事务并发执行程度是最高的,执行速度也是最快的.

并发程度越高,速度就越快;并发程度越低,速度就越慢

2)read committed读已提交
这种情况下,一个事务只能读取另一个事务提交之后的数据(给写操作加锁了)\此时,可能会产生不可重复读,幻读问题(脏读问题解决了)
此时,并发程度会降低,执行速度会变慢,同时也称为,事务之间的隔离性(事务之间的相互影响变小了得到的数据更准了)提高了.

3)repeatable read可重复读     mysql默认的隔离级别
这个情况下,相当于是给写操作和读操作都加锁了.此时,可能产生幻读问题,解决了脏读和不可重复读问题.
并发程度进一步降低,执行速度进一步变慢,事务之间的隔离性,进一步提高了.
4) serializable串行化
此时,所有的事务都是在服务器上一个接一个的执行的.此时,解决了脏读,不可重复读,幻读问题.
并发程度最低,执行速度最慢,隔离性最高,数据最准确

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

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

相关文章

基于51单片机的温湿度控制系统

一.硬件方案 本设计采用51单片机每2秒钟从DHT11温湿度传感器中读入温度和湿度&#xff0c;在液晶屏上即时显示。液晶屏上同时显示温湿度上限值&#xff0c;该上限值保存外外部EEPROM存储器中&#xff0c;掉电不失&#xff0c;并且可以通过四只按键上调或下调。当温度或湿度值超…

车机壁纸生成解决方案,定制化服务,满足个性化需求

在数字化与智能化浪潮的推动下&#xff0c;汽车内部设计已不再仅仅满足于基本功能的需求&#xff0c;更追求为用户带来前所未有的视觉享受与沉浸式体验。美摄科技&#xff0c;凭借其在图像生成与处理领域的深厚积累&#xff0c;推出了一款创新的车机壁纸生成解决方案&#xff0…

LORA微调,让大模型更平易近人

技术背景 最近和大模型一起爆火的&#xff0c;还有大模型的微调方法。 这类方法只用很少的数据&#xff0c;就能让大模型在原本表现没那么好的下游任务中“脱颖而出”&#xff0c;成为这个任务的专家。 而其中最火的大模型微调方法&#xff0c;又要属LoRA。 增加数据量和模…

VMware ESXi 7.0 U3q 发布 - 领先的裸机 Hypervisor

VMware ESXi 7.0 U3q 发布 - 领先的裸机 Hypervisor VMware ESXi 7.0 Update 3 Standard & All Custom Image for ESXi 7.0U3 Install CD 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出…

[pdf,epub]《软件方法》2024版电子书共290页(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 已上传本账号CSDN资源。 或者到以下链接下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html&#xff0c;或点击“阅读原文”。 如果需要提取码&#xff1a;umlc 已排…

浅谈网络安全态势感知

前言 网络空间环境日趋复杂&#xff0c;随着网络攻击种类和频次的增加&#xff0c;自建强有力的网络安全防御系统成为一个国家发展战略的一部分&#xff0c;而网络态势感知是实现网络安全主动防御的重要基础和前提。 什么是网络安全态势感知&#xff1f; 态势感知一词来源于对…

图形学初识--空间变换

文章目录 前言正文矩阵和向量相乘二维变换1、缩放2、旋转3、平移4、齐次坐标下总结 三维变换1、缩放2、平移3、旋转绕X轴旋转&#xff1a;绕Z轴旋转&#xff1a;绕Y轴旋转&#xff1a; 结尾&#xff1a;喜欢的小伙伴可以点点关注赞哦 前言 前面章节补充了一下基本的线性代数中…

软件安全复习

文章目录 第一章 软件安全概述1.1 信息定义1.2 信息的属性1.3 信息安全1.4 软件安全1.5 软件安全威胁及其来源1.5.1 软件缺陷与漏洞1.5.1.1 软件缺陷1.5.1.2 漏洞1.5.1.3 软件漏洞1.5.1.4 软件缺陷和漏洞的威胁 1.5.2 恶意软件1.5.2.1 恶意软件的定义1.5.2.2 恶意软件的威胁 1.…

Mysql搭建主从同步,docker方式(一主一从)

服务器&#xff1a;两台Centos9 用Docker搭建主从 使用Docker拉取MySQL镜像 确保两台服务器都安装好了docker 安装docker请查看&#xff1a;Centos安装docker 1.两台服务器都先拉取mysql镜像 docker pull mysql 2.我这里是在 /opt/docker/mysql 下创建mysql的文件夹用来存…

java人口老龄化社区服务与管理平台源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人口老龄化社区服务与管理平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 人口老龄化…

在线思维导图编辑!3个AI思维导图生成软件推荐!

思维导图&#xff0c;一种以创新为驱动的视觉化思考工具&#xff0c;已经渗透到我们日常生活和工作的各个角落。当我们需要整理思绪、规划项目或者梳理信息时&#xff0c;思维导图总能提供极大的帮助。 近些年随着云服务等基础设施的完善&#xff0c;我们可以看到越来越多提供…

可视化大屏也在卷组件化设计了?分享一些可视化组件

hello&#xff0c;我是大千UI工场&#xff0c;这次分享一些可视化大屏的组件&#xff0c;供大家欣赏。&#xff08;本人没有源文件提供&#xff09;

Nacos 微服务管理

Nacos 本教程将为您提供Nacos的基本介绍&#xff0c;并带您完成Nacos的安装、服务注册与发现、配置管理等功能。在这个过程中&#xff0c;您将学到如何使用Nacos进行微服务管理。下方是官方文档&#xff1a; Nacos官方文档 1. Nacos 简介 Nacos&#xff08;Naming and Confi…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充 WindowsCMD插件IDEAVsCode MavenvagrantDocker解决MySQL连接慢问题启动&#xff08;自动&#xff09;Docker注意切换到root用户远程访问MySQL MyBatisPlusVue模块化开发项目结构…

横截面分位数回归

一、分位数回归简介 分位数回归&#xff08;英语&#xff1a;Quantile regression&#xff09;是回归分析的方法之一。最早由Roger Koenker和Gilbert Bassett于1978年提出。一般地&#xff0c;传统的回归分析研究自变量与因变量的条件期望之间的关系&#xff0c;相应得到的回归…

Leecode热题100---二分查找--4:寻找两个正序数组的中位数

题目&#xff1a; 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解法1、暴力解法&#xff08;归并&#xff09; 思路&#xff1a; 合并 nums1&#xff0c;nums2 为第三个数组 排序第三个数…

如何降本增效获得目标客户?AI企业使用联盟营销这个方法就对了!

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 为什么AI企业难以获客呢&#xff1f; 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功…

创建特定结构的二维数组:技巧与示例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;二维数组的奇妙世界 二、方法一&#xff1a;直接初始化 1. 初始化一个…

K8s集群之 存储卷 PV PVC

目录 默写 1 如何将pod创建在指定的Node节点上 2 污点的种类(在node上设置) 一 挂载存储​​​​​​​ 1 emptyDir存储卷 2 hostPath存储卷 ①在 node01 节点上创建挂载目录 ② 在 node02 节点上创建挂载目录 ③ 创建 Pod 资源 ④ 在master上检测一下&#xff1a;…

Hadoop3:HDFS中DataNode与NameNode的工作流程

一、DataNode中的数据情况 数据位置 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-823420375-192.168.31.102-1714395693863/current/finalized/subdir0/subdir0块信息 每个块信息&#xff0c;由两个文件保存&#xff0c;xxx.meta保存的是数据长度、校验和、时间戳&am…