SQL索引事务

news2024/11/22 4:39:14

SQL索引事务

索引

创建主键约束(primary key),唯一约束(unique),外键约束(foreign key)时,会自动创建对应列的索引

1.1 查看索引

show index from 表名

 

现在这个表中没有索引,那么我们现在将这几个表删除之后创建新表

我们现在建立一个班级表一个学生表,并且学生表与班级表存在外键约束

班级表

学生表

我们可以看到子表中有两个索引

1.2 创建索引

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

1.3 删除索引

drop index 索引名 on 表名

删除索引,只能针对手动创建的索引,自动生成的索引(如:因主键约束与外键约束所生成的索引),是不能被删除的.

删除索引这个操作也是比较危险!

如果我现在确实需要`给一个已经有很多数据的表 创建/删除 索引,并且这个数据库还是生产环境的数据库,怎么办?

冗余

数据库服务器往往也不是单台服务器,为了整个系统的可靠性,通常会搞多个mysql服务器节点,这些节点的数据都是一样的,能够提供相同的服务(其中某个挂了,也不影响大局)

准备好一个新的MySQL服务器,把表和索引都创建好,然后把数据都导入过来,再把要替换的MySQL服务器关闭,把新的MySQL服务器替换上去就行了

索引底层的数据结构(非常重要)

MySQL的索引的数据结构到底是啥样的数据结构?并非是定式!!取决于MySQL使用哪个存储引擎

答:MySQL这个程序,里面包含很多模块

有点负责解析SQL,有的负责网络通信,有的负责储存数据.

存储引擎,本质上就是代码中的一个模块(这里包含了若干个代码文件以及一大堆具体的代码)

具体如何存储数据,MySQL支持多种存储方案

innodb当下最主流的一种方式

然而数据库这块组织数据使用的数据结构,是在硬盘上的,内存上的数据结构,对于访问操作来说,是不敏感的(找数据的过程,花时间多,真正访问的时候时间不多)硬盘上的数据结构,对于访问操作来说,比较敏感!!读写一次硬盘,开销远远大于内存的

索引的数据结构

hash

不能够进行范围查询,不能够进行模糊查询

解释:还记得我们学hash的时候吗?哈希其实是运用hash函数先计算下标然后进行查找,那么就导致对于hash来说,找到的只可能是准确的数据,不可能进行模糊查询的这一类操作的

红黑树

能够进范围查询和模糊匹配,但是引入较多的硬盘IO

B+树,是为了数据库量身定做的数据结构(针对于MySQL的innodb引擎而言)其他因为存储引擎的不同也可能会用到hash,这不过这种引擎所制作的数据库只能进行精准查询,会损失一些功能.

而实际上 B 树和二叉搜索树差不多.B树本质上是一个N叉搜索树

一个节点上,可以保存多个key.N个key就能 衍伸出N+1个分叉来.

N个key就划分出了N+1个区间

上图就是B树的物理图

此时每个节点上,都可以保存多个元素了,当总元素的个数固定的时候,相比于二叉搜索树,涉及到的节点的总数就大大降低了,树的高度也就大大降低了,硬盘IO也就减少了.

对于数据库来说,每个节点,都需要把数据从硬盘上读出来才能进行比较,一个节点上有多个key,和一个节点上有一个key,硬盘IO的开销是差不多的.

然而 B+树 才是数据库索引的主角,在 B树 的基础上,又进一步做出了一些改进=>针对数据库的查询场景展开的.

  1. B+树 也是N叉搜索树,但是N个key分出了N个区间,其中节点上最后一个key就是最大值了
  2. 父节点的key会在子节点中重复出现(而且是以最大值的身份)

看起来是有很多重复元素,浪费了空间,实际上能够达成一个重要的效果:叶子结点这一层,包含了整个数据的全集

  1. 将叶子节点,按照链表(双向)的方式首尾相连
  2. (此时通过叶子节点之间的这个连接,快速找到"下一个""上一个"元素,进一步也方便进行范围查询)

    上面三个是B+树的特点,这些特点,产生的优势是什么呢?

  3. 特别擅长范围查询
  4. 所有的查询操作,最终都会落在叶子节点上,比较次数,是均衡的.查询时间是稳定的!!!
  5. 由于叶子节点上是完整的数据全集,因此每一行数据的其他列,都可以保存到叶子节点上,而非叶子节点,只存储构建索引的key即可(只存id就行了)

其实在物理层面上不需要"表格"这样的数据结构,直接使用B+树来存储这个表的数据,"表格只是用户看起来像是个表格而已" 

用户看到的

实际存储的

此时,非叶子节点的存储空间,消耗是非常小的!!!,小到可以在内存中缓存一份!!!此时,进行数据查询的时候,就可以通过内存来直接进行比较从而更快速地找到叶子结点上的记录(进一步减少了硬盘IO的次数)

事务

事物的本质就是将多个操作打包成一个操作来完成的,也就是说这几个操作,要么都执行,要么都不执行,就相当于把他们几个操作捆绑起来,也被称作具有"原子性"

注意:"一个都不执行"不是真的没执行.执行成不成功要执行了才知道,比如我们在一个事物中有三个操作,在真正的执行之前我们是不知道1,2,3哪一步会失败的.如果执行到中间出错了,就需要字自动的把前面已经成功执行的操作,进行还原,还原回最初的模样(这种操作,叫做回滚(rollback)),这样就和看起来没有执行是一样的了,那么怎么进行回滚呢?

我们只需要将之前的操作都记录下来,需要回滚的时候,就对之前的操作进行"逆操作"就可以了(通过特定的日志,来记录数据库事务操作的中间过程),那么如果在回滚的过程中数据库挂了,数据库服务器重启了怎么办?

因为我们是通过日志来进行回滚的,日志上的数据始终在硬盘上存在的.即使是数据库服务器重启,就会在重启之后,针对之前没有回滚完的情况继续进行回滚

使用

1.开启事务: start transaction

2.执行多条SQL语句

3.commit提交事务: 把这些SQL按照原子的方式来进行执行(带有回滚机制)

rollback:手动触发回滚

注意:一个事物,务必要以 commit 或者 rollback 结尾

如果没有这两个操作,接下来的各种SQL操作都会被认为是事务的一部分.

事务的基本特性

1.原子性:保证多个操作被1打包成一个整体,要么能够全部执行正确,要么就一个都不执行.

2.一致性:事务执行之前,和事务执行之后,数据都能对上,数据不能离谱(用约束以及回滚机制来保证数据是靠谱的)

3.持久性(在计算机中,谈到持久,十有八九都是和硬盘有关的,硬盘上存储的数据,就是持久化存储):事务这里执行的各种操作,都是持久生效的,也就是说,最后会写入硬盘当中的,一旦事务执行成功了,那么这里所有操作产生的修改,都是写到硬盘里的.

4.隔离性:并发执行事务的时候,隔离性,会在执行效率和数据可靠之间做出权衡."隔离"描述的是同时执行事务之间,相互的影响,隔离性越高,并发性就越低,数据越可靠,性能就越低.

那么接下来说一下什么是并发?

并发可以简单理解成同时执行

数据库是一个客户端 服务器 结构的程序,既然是服务器,服务器就可以同一时刻,给多个客户端提供服务,这两个客户端,就能给服务器提交事务,如果提交的这两个事务,是修改不同的数据库/不同的表,相互之间是没啥影响的,如果这两个事务,修改的是同一个表,这个时候就可能存在麻烦

如何解决脏读问题?

给 写 操作加锁,一个事务A写的时候,其他事务B不能读了.知道A事务写完数据,提交事务,其他的事务B才能来读取数据.

引入了写加锁,降低了两个事务之间的并发性,提高了隔离性,降低了效率,使数据更准确了

在同一个读取数据的事务中,可能会涉及到多次读操作,多个操作读到的数据,不一样.

如何应对不可重复读?

给读操作也加锁

给写操作加锁的意思,就是我在写的时候,别人不能读(除非是我写完提交,别人才能读),此时别人读的过程中,我还可以再开启一个事务来写,第二个事务提交之前,其他读事务独到的都是旧版本的数据,第二个事务提交之后,别人再读读到的就是新版数据了.

给读操作加锁的意思是,别人读的时候,我不能写了.

此时并发程度进一步降低了,也就是执行效率降低了

隔离性进一步提高了,也就是数据可靠性更高了

一个事务在多次读的过程中,虽然读到的数据的值是一样的,但是结果集不同,比如第一次读是10条记录,第二次读是11条记录,11条记录中的10条,和之前的10条是一模一样的,但是多出来一个

可以视为是:不可重复读 的特殊情况.

解决幻读的办法:串行化(彻底放弃并发执行事务,所有的事务都是一个挨一个的串行执行(执行完一个事务,再执行下一个事务)并发性是最低的,隔离性是最高的,效率是最低的,数据是最可靠的)

小结

在并发执行事务的过程中,可能产生以下问题

1.脏读

读到了写事务提交之前的中间数据(脏数据)

解决方法:写加锁,提交之前,不能读

2.不可重复读

一个事务之内,多次读取同一个数据,发现数据不一样(在读的过程中,另一个事务修改了数据)

解决方法:给读加锁,读的时候,不能修改了

3.幻读

一个事务之内,多次读到的数据,值相同,但是结果集不同

解决方法:彻底串行化,完全放弃并发执行

MySQL提供了四种事务的隔离级别:

read uncommitted(RU):允许读未提交的数据(存在脏读,不可重复读)

此时隔离性最低,并发程度最高,数据可靠性最低,效率最高.

read committed(RC):允许读取已经提交的数据(给写加锁了),解决了脏读问题,但是存在不可重复读和幻读,此时隔离性提高了,并发性降低了,数据可靠性提高了,效率降低了

repeatable read(RR 默认的隔离级别):可以重复读取数据(给写操作和读操作都加锁)解决了脏读和不可重复读的问题,存在幻读问题,此时隔离性又提高了,并发性有降低了,数据可靠性又提高了,效率又降低了

serializable:事务彻底的串行执行.解决了脏读,不可重复读,幻读的问题,隔离性最高,并发性最低(没有),数据最可靠,效率也最低.

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

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

相关文章

高速PCB设计Tips

在进行原理图输入过程中,需要注意将设计分解为功能块,将所有相关组件放在同一页。例如,以太网相关的组件,通常运行在50MHz或更高频率,在原理图设计中应集中在同一页。清晰标记高速连接和电源连接。差分信号和单端阻抗控…

免费分享:中国三级及以上河流(附下载方法)

河流分级法的分级方法是从源头最小河流开始,称为一级河流;两条一级河流汇合成二级河流;以此类推,三级河流等等;最后是干流。本文将介绍中国三级及以上河流数据。 数据简介 1:100万中国三级及以上河流矢量数据是涵盖了全国范围内三级及以上级别河流的详细地理信息和空间分布。这…

5百多本分章节古籍内容大全ACCESS\EXCEL数据库

很多明清小说现在越来越不容易查看其内容,虽然之前搞到过一份《3万8千多古代文学大全ACCESS数据库》,但简体中文总让我感觉有删减、非原版的印象,今天正好遇到一个好的古籍网站,繁体字繁体文,感觉非常不错,…

期权学习必看圣书:《3小时快学期权》要在哪里看?

今天带你了解期权学习必看圣书:《3小时快学期权》要在哪里看?《3小时快学期权》是一本关于股票期权基础知识的书籍。 它旨在通过简明、易懂的语言和实用的案例,让读者在短时间内掌握股票期权的基本概念、操作方法和投资策略。通过这本书&…

LeetCode刷题记录:(15)三角形最小路径和

知识点&#xff1a;倒叙的动态规划 题目传送 解法一&#xff1a;二维动态规划【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i层第…

Gemini for China 大更新,现已上架 Android APP!

官网&#xff1a;https://gemini.fostmar.online/ Android APP&#xff1a;https://gemini.fostmar.online/gemini_1.0.apk 一、Android APP 如果是 Android 设备&#xff0c;则会直接识别到并给下载链接。PC 直接对话即可。 二、聊天记录 现在 Gemini for China&#xff…

QWidget成员函数功能和使用详细说明(四)(文字+用例+代码+效果图)

文章目录 1.测试工程配置2.成员函数2.1 void setParent(QWidget *parent)2.2 void setMouseTracking(bool enable)2.3 bool hasMouseTracking() const2.4 void setPalette(const QPalette &)2.5 const QPalette &palette() const2.6 int QWidget::grabShortcut(const Q…

gradle构建工具

setting.gradle // settings.gradle rootProject.name my-project // 指定根项目名称include subproject1, subproject2 // 指定子项目名称&#xff0c;可选jar包名称 方式一 jar {archiveBaseName my-application // 设置 JAR 文件的基本名称archiveVersion 1.0 // 设置…

实验四 图像增强—灰度变换之直方图变换

一&#xff0e;实验目的 1&#xff0e;掌握灰度直方图的概念及其计算方法&#xff1b; 2&#xff0e;熟练掌握直方图均衡化计算过程&#xff1b;了解直方图规定化的计算过程&#xff1b; 3&#xff0e;了解色彩直方图的概念和计算方法 二&#xff0e;实验内容&#xff1a; …

泰迪智能科技企业项目试岗实训——数据分析类型

当今社会&#xff0c;就业技能的瞩目度正与日俱增。在竞争激烈的就业市场中&#xff0c;重视技能的培养和提升&#xff0c;通过学习与实践&#xff0c;增强自己的竞争力&#xff0c;为未来的职业发展打下坚实的基础&#xff0c;不仅有助于解决各类工作技能问题&#xff0c;更能…

跨境干货|最新注册Google账号方法分享

谷歌账号对做跨境外贸业务的人来说是刚需&#xff0c;目前来说大部分的海外社媒平台、工具都可以用谷歌账号来注册。但是仍然有很多朋友并不知道如何注册这个谷歌账号&#xff0c;今天就来给大家分享2个注册谷歌账号的方法&#xff0c;一个是手机号注册&#xff0c;一个是如何跳…

PEFT - 安装及简单使用

LLM、AIGC、RAG 开发交流裙&#xff1a;377891973 文章目录 一、关于 PEFT二、安装1、使用 PyPI 安装2、使用源码安装 三、快速开始1、训练2、保存模型3、推理4、后续步骤 本文翻译整理自&#xff1a;https://huggingface.co/docs/peft/index 一、关于 PEFT &#x1f917;PEFT…

关于如何做好淘汰 IT 资产数据安全销毁工作的思考 文件销毁 硬盘销毁 数据销毁 物料销毁 文件粉碎

在当今数字化时代&#xff0c;企业的 IT 资产不断更新换代&#xff0c;淘汰的 IT 资产中往往存储着大量的敏感数据。如何确保这些数据在资产淘汰过程中被安全销毁&#xff0c;成为了企业面临的重要挑战。以下是对如何做好淘汰 IT 资产数据安全销毁工作的一些思考。 一、明确数…

51单片机STC89C52RC——14.1 直流电机调速

目录 目的/效果 1&#xff1a;电机转速同步LED呼吸灯 2 通过独立按键 控制直流电机转速。 一&#xff0c;STC单片机模块 二&#xff0c;直流电机 2.1 简介 2.2 驱动电路 2.2.1 大功率器件直接驱动 2.2.2 H桥驱动 正转 反转 2.2.3 ULN2003D 引脚、电路 2.3 PWM&…

【C++】 解决 C++ 语言报错:Segmentation Fault

文章目录 引言 段错误&#xff08;Segmentation Fault&#xff09;是 C 编程中常见且令人头疼的错误之一。段错误通常发生在程序试图访问未被允许的内存区域时&#xff0c;导致程序崩溃。本文将深入探讨段错误的产生原因、检测方法及其预防和解决方案&#xff0c;帮助开发者在…

智能插座搭配BIOS唤醒功能实现远程定时开关机

智能插座 智能插座凭借其强大的联网能力&#xff0c;不仅能够实现远程操控开关电源&#xff0c;部分高端型号更是集成了电量统计与自动化操作功能&#xff0c;为用户带来了前所未有的便捷体验。以下是我对几款体验过的智能插座的简要评价&#xff0c;因版本差异可能有所不同。…

tongweb+ths6011测试websocket(by lqw)

本次使用的tongweb版本7049m4&#xff0c;测试包ws_example.war&#xff08;在tongweb安装目录的samples/websocket下&#xff09;&#xff0c;ths版本6011 首先在tongweb控制台部署一下ws_example.war,部署后测试是否能访问&#xff1a; 然後ths上的httpserver.conf的參考配…

如何用SRM管理供应商,轻松又高效?

在企业运营的日常里&#xff0c;你是否常常为那些繁杂的供应商信息而头疼&#xff1f;每当项目紧急需要某个物料时&#xff0c;你是否会为了寻找可靠的供应商而焦头烂额&#xff1f;更别提那些层出不穷的交货延期、质量问题&#xff0c;以及难以追踪的合同条款了。这些问题&…

无人机有哪些关键技术?

一、控制技术 无人机的核心还是在控制上&#xff0c;飞控系统的可靠性、稳定性及可扩展性是其中重要的指标。可靠性上&#xff0c;除了器件选型之外&#xff0c;目前主要靠多余度来增加&#xff1b;稳定性主要体现在多场景下仍能保持良好的工作状态&#xff0c;主要靠算法来进…

一对一服务,定制化小程序:NetFarmer助力企业精准触达用户

在当今这个日新月异的数字化时代&#xff0c;小程序以其独特的魅力和广泛的应用场景&#xff0c;正逐步成为企业出海战略中的璀璨明星。NetFarmer&#xff0c;作为业界领先的数字化出海服务商&#xff0c;不仅深谙HubSpot营销自动化的精髓&#xff0c;更在小程序领域展现了卓越…