mysql事务与索引

1.事务

(1)提出背景:

在日常开发环境中,有一些场景是需要“一气呵成”完成某一个操作。

eg:银行转账的场景:张三(手里有1000)现要给李四(手里有500)转500,本来最后期待的结果应该是张三(还有500),李四(有1500),但如果在这个过程中程序崩溃/停电/数据库崩溃就会导致张三已经扣了钱但是李四还没有收到钱,那在这个事就扯谈了!!!

所以引入事务就是为了避免上述类似的问题。事务会将多个sql语句打包成一个整体,这个整体要么执行成功,要么“一个都不执行”(这里的一个都不执行,不是指整体中的所有sql语句都不执行,而是可能执行到一半出问题了,就会回到最初的状态。这个过程也叫做回滚)

(2)特点:

原子性:将多个sql语句打包成一个整体,要么执行成功,要么“一个都不执行”。

一致性:事务执行前后数据不能太过离谱。

持久性:事务做出的修改都是在硬盘上持久化存储的。

隔离性:并发执行多个事务所产生的问题。

(3)隔离性:

问题1:脏读

一个事务A正在写数据的时候,事务B此时来进行读数据,然后事务A又对刚才的数据进行了修改,此时导致事务B读到的是一个无效的数据。

eg:我正在写代码的时候,别人就来读我的代码,然后就不管了,之后我又修改了代码,那读我代码的那个人读到的代码就有可能是错误的。

如何解决:给写操作加锁,必须要写数据这个操作完成之后才能进行读数据。

问题2:不可重复读

在并发执行多个事务的过程中,一个事务内部在多次读取某同一数据的时候,读到的结果可能不同。

eg:别人在读我代码的同时,我也在写,就导致读我代码的人,读的是同一份代码但是结果可能在变化。

如何解决:给读操作加锁,必须要读操作完成之后才能写。

问题3:幻读

一个事务在执行过程中,内部进行两次读取的操作时,读取的数据集不同,那么读到的结果集不同。

eg:就好比是两份不同代码,那么读到的结果肯定不同,这个问题对实际场景有无影响,具体场景具体分析。

如何解决:引入串行化方式,保持绝对串行执行,避免并发执行。

(4)隔离级别:

针对数据正确和并发程度之间做出权衡,就是所谓的隔离级别。有四种:

a.read uncommitted(读未提交)

也就是脏读。此时隔离性最低,数据正确率最低,并发程度最高,并发执行效率最高。

b.read committed(读已提交)

解决脏读。此时隔离性提高,数据正确率提高,并发程度降低,并发执行效率降低。

c.repeatable read(可重复读)

解决不可重复读。此时隔离性进一步提高,数据正确率进一步提高,并发程度进一步降低,并发执行效率进一步降低。

d.serializable(串行化)

解决幻读。此时隔离性最高,数据正确率最高,并发程度最低,并发执行效率最低。

2.索引(index)

(1)提出背景:

数据库使用select查询的时候:

a.先遍历表

b.跟据条件去表中筛选,如果满足条件就保留该条数据,不成立则跳过。

如果表中数据过多,那么通过这种方式查询所消耗的时间是很多的,而且数据库中的数据都是存储在硬盘上的,对于计算机来说,读取硬盘(读取IO)的时间开销是很大的。

所以针对上述的问题,就提出了索引,它的存在就是为了优化数据库的查询操作。当然引入索引也需考虑几个问题:

索引会占用一定的内存空间。

进行插入或修改操作的频率较低,经常进行查询操作,就可以进行索引的创建。

数据量较大,并且经常对某一列进行查询,索引就是针对某一列来创建的,只会提高查询这一列的速度,对于没有创建索引的列,还是需要去遍历表然后进行条件匹配。

(2)相关操作:

a.创建:

create index 索引名字 on 列名;

ps:

主键(primary key),外键(foreign key),unique修饰的列会自动创建索引。

b.查看:

show index from 表名;

c.删除:

drop index 索引名 on 表名;

ps:只有手动创建的索引可以进行删除,自动创建的索引不可以通过此操作进行删除。

创建和删除索引都是一个危险的操作,创建索引的时候,会对当前这一列数据进行整理,如果数据量过大,那么一旦这个操作执行下去,可能服务器就会被卡住。

非得创建也不是没有办法,另外重新弄一台服务器,部署mysql,创建表,然后把想要新增的索引创建好,再把之前的数据全部导入进行,这样不论这个过程会进行多久都不会影响生产环境。

(3)背后相关知识:

索引是通过一定的数据结构来实现。

a.分析:

顺序表:适合于通过下标查找某个值,尾插,尾删

链表:适合于任意位置的删除,插入

栈和队列更加不适合。

哈希表:可以进行“精确匹配”,不能进行范围查询,更不能进行“模糊匹配”。

二叉搜索树:可以进行“精确匹配”,也可以进行范围查询和“模糊匹配”。

初步确定是应该采用二叉搜索树的形式,采用二叉搜索树进行搜索的时间复杂度为O(\log_{2}N),如果每个树的度不为2,当节点的度逐渐增加的时候,那么对应的时间复杂度就会降低,所以这样分析的话索引背后采用的是N叉搜索树(B+树)。

b.B+树(N叉搜索树)

了解B+树之前,先要了解一下B树(B-树也是B树,“-”代表的是连接符)。

B树:

B树中的每个节点的度都不确定,一个节点中如果有N个key,就会划分出N+1个区间,然后每个区间都为衍生出一些子区间。

eg:

每个节点都不是无限衍生的,但插入达到一定规模的时候就会进行分裂,当删除数据达到一定规模是,节点之间会进行合并。由于每个节点都是存储在硬盘上的,每次只用去硬盘读取节点,然后对节点中的数据进行比较就好了。(读取一次硬盘相当读取很多次内存) 

B+树:

B+树是B树的改进,是为索引量身定做的数据结构。

特点:

1)树中每个节点的度都是不确定的,一个节点中有N个key只会划分出N个区间(子节点),然后子节点再进行衍生。

2)父亲节点中的最大key会存在在子节点中的最后位置,也就是每个节点上最后一个key是父节点中最大的值。

3)父亲节点中的每个key都会以最大值的身份存在于子节点中,这样就会导致整个树最后的结果集全部在叶子节点上。

4)B+树会使用链表将叶子节点给串起来。

eg:

 最后叶子节点使用一个双向链表给存储起来。

优点:

1)由于叶子节点是一个数据全集,所以所有的行数据(不只存了id,还有其他属性,是一条记录)都会存储在叶子节点上,而非叶子节点只是存储了一个用于比较的key,用来排序(比如存个id),所以叶子节点是比较占用内存的,而非叶子节点不怎么占用内存的。每次进行查询的时候,就把非叶子节点加载到内存中,就不用在去单独的读取非叶子节点了,这样整体查询比较的过程就可以在内存进行了,读取硬盘的次数就进一步降低。

2)非常擅长范围查询。如果使用B树的,那么进行范围查询的时候,会很麻烦,会进行回溯操作。

3)B+树由于所有的查询都是落在叶子节点上的,所以查询不同东西所产生的时间开销是稳定的,而B树可能是不稳定的。

4)是一个N叉搜索树,树的高度是有限的,可以降低读取硬盘的次数,进而加快查询的速率。

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

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

相关文章

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介: 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

Go开发后端和Vue3开发前端的前后端分离框架中自己手戳一个OA流程审批、工作流引擎给新时代一个漂亮便捷的工作流引擎

前言 在软件项目开发中,我们都会接触到流程审批的需要业务,我们以往用的最多就是如下图这种流程编辑引擎插件: 以上截图中的流程工具是不是大家常见的呀!感觉很丑拿不出手呀!在当前行业内卷及竞争激烈情况下&#xff…

Docker Compse单机编排

一.Docker Compse 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,你可以使用 YAML 文件来配置应用程序的服务、网络和卷,然后使用单个命令创建和启动所有服务。这使得在开发、测试和部署过程中管理多容器应用程…

鸿蒙(API 12 Beta3版)【AVCodec Kit简介】 音视频编码服务

AVCodec kit(Audio & Video Codec Kit,音视频编解码,封装解封装原子能力)是媒体系统中的音视频的编解码、媒体文件的解析、封装、媒体数据输入等原子能力。 能力范围 媒体数据输入:媒体应用可以传入文件fd、或者…

TM1652段码屏芯片全解析——概况,性能,MCU连接,样例代码

首先,作为四年前就有的LED段码控制芯片,相关的资料及样例程序少的可怜。硬件驱动 作为固定使用的 软件资源,其共享性远低于软件领域的驱动库。人的才智不应浪费在这种不具创造性的重复实验上。 要点总结: TM1652概述&#xff1a…

【网络层】IP报文解析和网段划分

文章目录 网络层的作用IP协议协议报头格式网段划分DHCPCIDR划分方案 IP地址的数量限制私有IP地址和公网IP地址LAN和WAN 路由 网络层的作用 前面学习了应用层和传输层,应用层的作用是为用户和应用程序提供网络服务,传输层的作用是提供端口到端口的通信服…

数据结构与算法--二叉树的遍历及应用

文章目录 回顾二叉树的五个重要性质 提要二叉树的遍历二叉树遍历流程图前序遍历流程图(根左右)中序遍历流程图(左根右)后序遍历流程图(左右根) 二叉树遍历的示例根据遍历序列确定二叉树的形态确定方法 二叉…

界面组件Kendo UI for Vue 2024 Q2亮点 - 发布一系列新组件

随着最新的2024年第二季度发布,Kendo UI for Vue为应用程序开发设定了标准,包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示,从设计到代码的生产力增强、可访问性改…

arXiv2024.8.6 | LLaVA-OneVision:Easy Visual Task Transfer

Comment: Project Homepage: https://llava-vl.github.io/blog/2024-08-05-llava-onevision/ 论文标题:LLaVA-OneVision:Easy Visual Task Transfer 论文地址:https://arxiv.org/abs/2408.03326 GitHub:https://llava-vl.githu…

MTK Android12 SystemUI 手势导航 隐藏导航栏底部布局

问题:android12 平台手势导航情况下,app页面未设置全屏情况下,底部导航栏会有一个高度的颜色,底部导航会有一个手势导航提示条 需求:去掉手势导航情况下底部的导航栏和手势提示条 文章目录 相关资源修改问题描述解决方案代码跟踪中间提醒小方块代码查找底部手势导航条跟踪…

【实战】MFC客户端Python后端之仿造QQ聊天

项目概述 这里介绍一个很多年以前做的一个小项目,新手小白可以参考学习。本项目旨在开发一个功能丰富的即时通讯及聊天室系统,类似于QQ,具备客户端与服务端通讯、多人聊天室、界面友好度、一对一聊天、通讯内容加密、服务端与数据库交互等功能…

【学习笔记】Matlab和python双语言的学习(非线性规划法)

文章目录 前言一、非线性规划法二、例题:选址问题1.确定决策变量2.确定约束条件3.确定目标函数4.建立模型5.求解 三、代码实现----Matlab1.Matlab 的 fmincon 函数(1)基本用法(2)简单示例 2.Matlab 代码第一问&#xf…

数字货币市场历史数据获取API(含源代码)

加密数字货币市场历史数据获取API(含源代码) 数字货币市场历史数据获取API(含源代码)1. Binance API运行结果BTCUSDT.csv 文件截图 2. CoinGecko API3. CryptoCompare API总结 数字货币市场历史数据获取API(含源代码&a…

关闭Windows安全中心

打开Windows安全中心的病毒和威胁防护。 打开该选项的管理设置。 关闭实时保护。

【Scene Transformer】scene transformer论文阅读笔记

文章目录 序言(Abstract)(Introduction)(Related Work)(Methods)(Scene-centric Representation for Agents and Road Graphs)(Encoding Transformer)(Predicting Probabilities for Each Futures)(Joint and Marginal Loss Formulation) (Results)(Discussion)(Questions) sce…

【网络基础一】几乎不讲任何网络协议细节,搭建网络基本结构

文章目录 问题认识“协议”计算机通信问题技术问题应用问题 协议分层那么网络分层应该怎么分层呢? 统编程帮助我们处理数据,网络编程帮助我们获取数据,网络配上我们写的线程池模块很快就搭建起来了。 问题 网卡是文件吗? 是的&am…

24暑假算法刷题 | Day30 | 贪心算法 IV | 452. 用最少数量的箭引爆气球,435. 无重叠区间,763. 划分字母区间

目录 452. 用最少数量的箭引爆气球题目描述题解 435. 无重叠区间题目描述题解 763. 划分字母区间题目描述题解 452. 用最少数量的箭引爆气球 点此跳转题目链接 题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中…

《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-04-数据访问层设计

文章目录 1. 五种数据访问模式1.1 在线访问1.2 DAO1.3 DTO1.4 离线数据模式1.5 对象/关系映射 (O/R Mapping) 2. 工厂方法模式在数据访问层应用3 ORM、Hibernate与CMP2.0设计思想3.1 ORM3.2 Hibernate1)概述2) Hibernate的架构(2023年的考题&…

【Web开发手礼】探索Web开发的秘密(十八)-Vue2(4)部门管理页面、路由、打包部署

主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 文章目录 前言 部门管理页面 Vue路由 打包部署 打包 部署 总结 前言 主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 部门管理页面 <template><div>&…

云手机在海外社交媒体运营中的作用

随着社交媒体的全球普及&#xff0c;海外社交媒体运营成为众多企业与个人提升品牌影响力和扩大市场份额的重要策略。在这一进程中&#xff0c;海外云手机以其独特的功能&#xff0c;为海外社交媒体运营提供了强大的支持。 那么&#xff0c;海外云手机在海外社交媒体运营中究竟扮…