SQL索引事务

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.mfbz.cn/a/776061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EVM-MLIR:以MLIR编写的EVM

1. 引言 EVM_MLIR: 以MLIR编写的EVM。 开源代码实现见: https://github.com/lambdaclass/evm_mlir(Rust) 为使用MLIR和LLVM,将EVM-bytecode,转换为,machine-bytecode。LambdaClass团队在2周…

无人机水运应用场景

航行运输 通航管理(海事通航管理处) 配员核查流程 海事员通过VHF(甚高频)系统与船长沟通核查时间。 无人机根据AIS(船舶自动识别系统)报告的船舶位置,利用打点定位 功能飞抵船舶上方。 使用…

大型能源电力集团需要什么样的总部数据下发系统?

能源电力集团的组织结构是一个复杂的系统,包括多个职能部门和子分公司。这些子分公司负责具体的电力生产、销售、运维等业务。这些部门和公司协同工作,确保电力生产的顺利进行,同时关注公司的长期发展、市场拓展、人力资源管理、财务管理和公…

SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断

SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断 目录 SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现BO-Transformer-LSTM特征分类预测/故障诊断&…

winform2

12.TabControl 导航控制条 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace zhiyou_…

发现CPU占用过高,该如何排查解决?

1.使用top命令 查看cpu占用最多的进程 2.使用 top -H -p pid 发现有两个线程占用比较大 3.将线程id转换为16进制 使用命令 printf 0x%x\n pid 4.使用 jstack pid | grep 线程id(16进制) -A 20 (显示20行) 根据代码显示进行错误排查

2024年7月5日 (周五) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《乐高地平线大冒险》为何不登陆…

娱乐圈惊爆已婚男星刘端端深夜幽会

【娱乐圈惊爆!已婚男星刘端端深夜幽会,竟是《庆余年》二皇子“戏外风云”】在这个信息爆炸的时代,娱乐圈的每一次风吹草动都能瞬间点燃公众的热情。今日,知名娱乐博主刘大锤的一则预告如同投入湖中的巨石,激起了层层涟…

关于下载obsidian SimpRead Sync中报错的问题

参考Kenshin的配置方法,我却在输入简悦的配置文件目录时多次报错。 bug如下: 我发现导出来的配置文件格式如下: 然后根据报错的bug对此文件名进行修改,如下: 解决。

Java数据结构-树的面试题

目录 一.谈谈树的种类 二.红黑树如何实现 三.二叉树的题目 1.求一个二叉树的高度,有两种方法。 2.寻找二叉搜索树当中第K大的值 3、查找与根节点距离K的节点 4.二叉树两个结点的公共最近公共祖先 本专栏全是博主自己收集的面试题,仅可参考&#xf…

暑假前端知识速成【CSS】系列一

坚持就是希望! 什么是CSS? CSS 指的是层叠样式表* (Cascading Style Sheets)CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素CSS 节省了大量工作。它可以同时控制多张网页的布局外部样式表存储在 CSS 文件中 *:也称级联样式表。 CSS语法 在此例…

微信小程序的智慧物流平台-计算机毕业设计源码49796

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方法 1.4开发技术 1.4.1 微信开发者工具 1.4.2 Node.JS框架 1.4.3 MySQL数据库 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分…

Windows 上帝模式是什么?开启之后有什么用处?

Windows 上帝模式是什么 什么是上帝模式?Windows 上帝模式(God Mode)是一个隐藏的文件夹,通过启用它,用户可以在一个界面中访问操作系统的所有管理工具和设置选项。这个功能最早出现在 Windows Vista 中,并…

【K8s】专题六(4):Kubernetes 稳定性之初始化容器

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号! 目录 一、基本介绍 二、主要特点 三、资源清单(示例) 一、基本介绍 初…

小学英语语法

目录 a和an的用法名词的单复数be动词和人称代词(主格)指示代词形容词物主代词名词所有格双重所有格方位介词some,any和no的用法How many和How much的用法情态动词can的用法祈使句人称代词(宾格)常见实义动词的用法一般…

【MySQL备份】Percona XtraBackup总结篇

目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…

深入理解 Webhook 与 API 的区别

作为人类,我们希望技术能帮助我们更快捷、更便捷地与更多人交流。但要实现这一目标,我们首先需要找到一种方法让技术能够彼此对话。 这就是 API 和 Webhook 的用武之地。 API 和 Webhook 都能够促进两个应用之间的数据同步和传递。然而,它们…

MySQL视图教程(03):列出视图

文章目录 MySQL 列出视图语法使用场景示例结论 MySQL 列出视图 MySQL 是一种流行的关系型数据库管理系统,用于创建和管理数据库中的表、视图等对象。在 MySQL 中,视图是一种虚拟表,可以从一个或多个实际表中检索数据,并根据特定的…

springboot整合Camunda实现业务

1.bean实现 业务 1.画流程图 系统任务,实现方式 2.定义bean package com.jmj.camunda7test.process.config;import lombok.extern.slf4j.Slf4j; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.delegate.JavaDelegate; import org.…

【一】m2芯片的mac中安装ubuntu24虚拟机集群

文章目录 1. 虚拟机配置2. 复制虚拟机2.1 修改主机名2.2 修改网络 1. 虚拟机配置 在官方网站下载好ubuntu24-arm版镜像开始安装,安装使用VMWare Fusion的社区免费授权版,使用一台m2芯片的mac电脑作为物理机平台。 为什么选择ubuntu24?因为centOS7目前已…