【MySQL】事务和索引

news2025/1/23 6:09:45

文章目录

  • 事务(Transaction)
    • 1. 定义
    • 2. 如何操作事务
      • 2.1 SQL 语句操作事务的几个关键字
      • 2.2 使用 SQL 语句操作事务
      • 2.3 JDBC 操作事务
    • 3. 事务的四个特性:ACID
    • 3.1 Atomic(原子性)
      • 3.1.1 理解原子性
    • 3.2 Consistency(一致性)
      • 3.2.1 以银行转账的例子理解一致性
    • 3.3 Isolation(隔离性)
    • 3.4 Durability(持久性)
    • 4. 隔离级别
      • 4.1 读未提交
      • 4.2 读已提交
      • 4.3 可重复读
      • 4.4 快照读
      • 4.5 可串行化
  • 索引
    • 1. 索引的分类
    • 2. 索引的作用
    • 3. 创建索引
    • 4. 索引的基本原理
      • 4.1 添加索引之后的查询过程
    • 5. 索引的 hit 和 miss
    • 6. 索引的优缺点
    • 7. 索引的使用场景
    • 8. 了解 explain 命令

事务(Transaction)

1. 定义

  • 事务这个词的含义很广泛,并不一定特指数据库中的事务
  • 在开发者看来,一个不可再分的业务动作就是一个事务,这个动作最终表达为一条或者多条 SQL 语句

2. 如何操作事务

2.1 SQL 语句操作事务的几个关键字

==start transaction:==开启事务

==rollback:==回滚,主动让事务失败

==commit:==提交事务,代表事务完成,对事物的所有操作在 commit 之后才会生效

2.2 使用 SQL 语句操作事务

在 start transaction 和 commit(或 rollback)之间写出此事务的 SQL 语句

start transaction;
-- SQL1
-- SQL2
commit;		-- 事务正常提交
-- rollback;	-- 我们主动让事务失败

2.3 JDBC 操作事务

在使用 JDBC 时,Connection 下有一个 autocommit 属性,会使事务自动提交,默认情况下,此属性值是 true。

开启状态下,意味着每一条 SQL 都被视为一个独立的事务。我们要想让多条 SQL 在同一个事务中,只需使用 setAutoCommit 方法修改此属性为 false即可。

修改之后不会自动提交,就需要用到 Connection 下的两个方法 —— commitrollback 来手动提交和主动失败。

String sql1 = "";
String sql2 = "";

// 要使用事务,在同一个事务中,操作 sql1 和 sql2,意味着必须在一条 Connection 完成
try (Connection c = DBUtil.connection()) {
    c.setAutoCommit(false);
    
    try (PreparedStatement ps = c.prepareStatement(sql1)) {
        ps.executeUpdate();
    }

    try (PreparedStatement ps = c.prepareStatement(sql2)) {
        ps.executeUpdate();
    }

    c.commit();

3. 事务的四个特性:ACID

事务的四大特性中,一致性是最基本的,其他三个特性都是为了维护一致性而生的

3.1 Atomic(原子性)

业务动作对应的 SQL 应该是看作一个整体,不可再分的。

3.1.1 理解原子性

简单来说,就是一个事务中的所有 SQL 要么全部成功,要么全部失败,所有的事务处于一种同生共死的状态。

体现在代码中就是,事务中有两条 SQL ,SQL1 执行通过,但是在执行 SQL2 时出现异常,此时事务就会回滚,两条 SQL 执行结果都被判定为失败。只有两条 SQL 都执行通过,事务才会提交

3.2 Consistency(一致性)

一致性由开发者来保证,针对数据整体做的不可变的承诺。

3.2.1 以银行转账的例子理解一致性

我们去银行从 ATM 中转账的时候一般分为两个步骤:

  • 我的银行卡余额减少
  • 转账接收方余额增加

如果在第一步完成之后,银行的服务器突然宕机,我的余额减少了,但是转账接收方的余额没有增加,我就会白白损失一笔巨款。在数据库中,这就是所谓的 不一致性

当一致性被维护时,银行的服务器突然宕机,转账这个业务应立即被判断为失败,我的余额也不会减少

3.3 Isolation(隔离性)

当有多个事务同时操作一段数据时,互相之间不会彼此干扰。

以上这句对隔离性的定义其实是比较理想的。事实上,如果要追求真正的隔离性,就要以牺牲并发性为代价的,所以 SQL 标准制定了隔离级别

3.4 Durability(持久性)

持续性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变是永久性的。

4. 隔离级别

SQL 中的隔离级别分为以下几种:

  • serializable(可串行性)
  • snapshot read(快照读)
  • repeatable read(可重复读)
  • read committed(读已提交)
  • read uncommited(读未提交)

如下图所示,越往左隔离性越好,越往右并发性越好(性能更高)

请添加图片描述

4.1 读未提交

多个同时执行的事务,可以读取到其他事务处于未提交时的数据修改,可以认为完全没有隔离性,在此隔离级别下会产生副作用——脏读不可重复读幻读

脏读:读取到了脏数据,读到了其他事务没有提交的数据修改,而这段数据随时很有可能会被回滚,这样就会破坏一致性

请添加图片描述

4.2 读已提交

读已提交就是可以读取到其他事务已经提交的数据修改。

“ 读已提交 ” 隔离级别中避免了脏读,但是不可避免 不可重复读幻读

不可重复读:同一个事务中,可能出现多次读取同一份数据,但结果不同。

请添加图片描述

4.3 可重复读

保证了在一次事务中(没有提交或者回滚),读取到的同一块数据无论何时的值都一样,即使有别的事务对这块数据进行了修改,也不会有影响

传统意义上的可重复读避免了脏读和不可重复读,但是仍然避免不了幻读

请添加图片描述

幻读:本事务修改了表中的数据,但是在本事务提交之前表中被另一个事务插入了一条数据并且提交了,这样就会导致本数据会看到一条突然出现的 “ 幽灵般的 ” 数据

出现幻读的原因是:可重复读只针对表中已有的数据做保护,对新添加的数据不做保护

请添加图片描述

4.4 快照读

快照读其实不是标准中存在的隔离级别,快照读连幻读的副作用都没有,目前来说基本没有副作用

MySQL 中的 “ 可重复读 ” 可以看作实际上的 “ 快照读 ”,MySQL 默认情况下的隔离级别就是可重复读

4.5 可串行化

微观视角下,每个事务必须排好队,一次只执行一条事务,每条事务之间完全隔离;宏观视角下,让然看作 “ 同时进行 ”,但是并发性(性能)差

索引

1. 索引的分类

index:普通索引

unique:唯一索引

fulltext:全文索引

spatial:时空索引

primary:主键

以下全文只针对普通索引

2. 索引的作用

索引的作用是用来提高查询速度

一般来说,在表中查询某条数据时,会把所有的元素遍历一遍,找到符合条件的元素,对表中的某个字段添加索引之后,就像是对这个字段创建了目录,可以大大提高查询速度

3. 创建索引

-- 使用 ALTER  TABLE 语句添加索引
ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY (  `column`  ) 
-- 使用 create 语句添加索引
CREATE INDEX `index_name` on `table_name` (`column_name`)

4. 索引的基本原理

索引的背后可以看作是一颗搜索树,搜索树的 key 是添加过索引的字段,value 可以看作是对应数据在硬盘上的位置(一种可能)

4.1 添加索引之后的查询过程

  • 第一步,从搜索树(索引)中,根据添加索引的字段名找到匹配数据的位置
  • 第二步,直接根据位置读取数据

相比未添加索引的遍历全表查询,速度会大幅提升

5. 索引的 hit 和 miss

注意,索引只会应用在被添加的字段,其他字段不受影响

一张表中,命中索引被称为 hit,有索引但未命中被称为 miss

6. 索引的优缺点

优点:

  • 提升查询速度

缺点:

  • 造成空间的使用增加
  • 造成修改的性能下降(删、改、增)

添加完索引之后,还得保存索引数据,所以空间的使用就会增加;没有索引时修改数据只需要修改原始数据即可,有了索引之后,除了修改原始数据之外,还得修改索引结构,所以性能会下降

7. 索引的使用场景

  1. 数据量达到一定规模
  2. 针对查询很多、修改较少的表考虑索引
  3. 只针对频繁被查询的字段建立索引

8. 了解 explain 命令

通过 explain 命令可以判断是否命中索引,将 explain 命令加载 select 命令前即可

使用 explain 命令之后会出现如下图字段,比较 rows 字段即可判断是否添加索引,rows 字段是此 select 扫描的行数,一般来说,添加过索引后扫描的行数会非常少(前提数据庞大)

请添加图片描述

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

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

相关文章

H3C WX2510H无线控制器开局如何简单配置

环境: H3C-WX2510H version 7.1.064, Release 5435P02 AP H3CWA6320-C 问题描述: H3C WX2510h无线控制器开局如何简单配置 解决方案: 1.PC网卡设置ip192.168.0.111,连接随便一个LAN口 2.浏览器访问https://192.168.0.100…

面试处处碰壁?不慌,Java 核心面试文档.PDF 助你披荆斩棘

前言 首先强调几点: 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 2. 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地…

如何采集需要验证码登录的网站数据

如何抓取网页上的数据,需要登录?随着互联网的发展,移动支付技术的普及,以及人们对内容进行消费的观念逐渐养成。有很多网站,需要付费后才能查看,或者是开通会员之类的才能查看。针对这类网站,我们如何快速的…

性能测试环境部署

一、安装JDK 【步骤一】安装JDK (安装Jmeter之前需要配置JAVA环境) 下载jdk,到官网下载jdk,地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 【JDK版本要和JMeter版本对应,如果JDK版本过高&#x…

深度学习入门(8)激活函数ReLU和 Sigmoid的计算图表示方式及代码实现

《深度学习入门》系列文章目录 深度学习入门 (1)感知机 深度学习入门(2)神经网络 深度学习入门(3)神经网络参数梯度的计算方式 深度学习入门(4)【深度学习实战】无框架实现两层神经网络的搭建与训练过程…

黑盒测试用例设计 - 等价类划分法

说明:在所有测试数据中,具有某种共同特征的数据集合进行划分。 分类: 有效等价类:满足需求的数据集合无效等价类:不满足需求的数据集合 步骤: 明确需求设计一个新的测试用例,使其尽可能多的覆…

如何申请软件著作权

申请软件著作权的好处: 1、软件著作权登记证书是在软件著作权发生争议时,证明软件权利的最有力证。这不仅是在进行诉讼或者是发生一般纠纷时都能起到很好的证明作用,但是如果没有进行登记,著作权人的权利就很难获得全面的保护。 …

Linux-scheduler之负载均衡(一)

一、如何衡量CPU的负载 衡量CPU负载 简单衡量 CPU负载就绪队列的总权重CPU负载 就绪队列的总权重 CPU负载就绪队列的总权重 量化负载 CPU负载(采样期间累计运行时间/采样总时间)∗就绪队列总权重CPU负载 (采样期间累计运行时间/采样总时间)*就绪队列总权重 CPU负载(采样期…

Flutter 创建自己的对话框,不使用任何包!

创建自己的对话框,不使用任何包! 原文 https://itnext.io/create-your-own-dialog-without-using-any-packages-7bb303f62471 前言 在本文中,我们将学习如何创建我们自己的 showDialog() 函数,并了解到底发生了什么。 正文 先看效…

Matplotlib 可视化50图:散点图(1)

导读 本系列将持续更新50个matplotlib可视化示例,主要参考Selva Prabhakaran 在MachineLearning Plus上发布的博文:Python可视化50图。 定义 关联图是查看两个事物之间关系的图像,它能够展示出一个事物随着另一个事物是如何变化的。关联图的类…

ctfshow(菜狗杯)

目录 web签到 一言既出 驷马难追 web2 c0me_t0_s1gn 我的眼里只有$ TAPTAPTAP Webshell 化零为整 无一幸免 遍地飘零 传说之下&#xff08;雾&#xff09; Is_Not_Obfuscate web签到 <?phperror_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[…

springboot大学生课堂考勤管理系统的设计与实现

根据一般学生课堂考勤管理系统的功能需求分析&#xff0c;本系统的功能模块如下&#xff1a; &#xff08;1&#xff09;在个人中心&#xff0c;管理员可以修改自己的用户名和登录密码。 &#xff08;2&#xff09;在学生管理模块中&#xff0c;可以查看学生的信息&#xff0c;…

DiffusionDet:Diffusion Model for Object Detection

Diffusion Model for Object Detection 一种用于目标检测的扩散模型 Motivation 1、如何使用一种更简单的方法代替可查询的object queries 2、Bounding box的生成方式过去是三种&#xff0c;第一种为sliding windows、第二种anchor box、第三种object queries&#xff0c;这里其…

AlphaFold2源码解析(3)--数据预处理

AlphaFold2源码解析(3)–数据预处理 数据预处理整体流程 数据处理入口&#xff1a; feature_dict data_pipeline.process( input_fasta_pathfasta_path,# 输入序列目录 msa_output_dirmsa_output_dir) # MSA序列目录 可能是单体也可能是多聚体 主要调动的API是&#xff1a; …

如何让Java项目兼容更多的客户端设备(二)

如何让Java项目兼容更多的客户端设备&#xff08;二&#xff09; ​ ​ 一、Token认证的原理 传统的单体JavaWeb项目通常采用HttpSession保存登陆成功的凭证&#xff0c;但是HttpSession需要浏览器的Cookie机制配合。也就是说Web项目的客户端只能是浏览器&#xff0c;不可以…

torch.nn.functional.grid_sample(F.grid_sample)函数的说明 3D空间中的点向图像投影的易错点

由于二者有一定共通之处&#xff0c;因此放在一篇文章内介绍。 1. 关于torch.nn.functional.grid_sample函数的说明&#xff08;F.grid_sample&#xff09; 该函数的作用是在图像/体素空间中采样特征。 1.1 输入和输出&#xff1a; 变量名数据类型默认值含义备注inputTensor-…

训练神经网络的各种优化算法【文末赠书】

正确的优化算法可以成倍地减少训练时间 许多人在训练神经网络时可能会使用优化器&#xff0c;而不知道该方法称为优化。优化器是用于更改神经网络属性&#xff08;例如权重和学习率&#xff09;以减少损失的算法或方法。 文章目录梯度下降随机梯度下降小批量梯度下降其它优化算…

C/C++指针之提高篇详解(二)

一、引言 C/C语言中引入了指针&#xff0c;使得程序能够直接访问内存地址&#xff0c;使得很多复杂的操作变得简单&#xff0c;同时也提高了程序的运行效率。指针即是地址&#xff0c;但是地址却是通过指针变量来存储的。这就好比我们的教室&#xff0c;每个教室都有一个房间号…

第3章 Tomcatservlet

1.BS与CS *CS&#xff1a;客户端服务器架构模式 优点&#xff1a;充分利用客户端机器的资源&#xff0c;减轻服务器的负荷 缺点&#xff1a;需要安装&#xff1b;升级维护成本较高 *BS&#xff1a;浏览器服务器架构模式 优点&#xff1a;客户端不需要安装&#xff0c;维护成本…

Zlibrary已死,找了一个替代品,找了一个替代品免费的电子书下载平台...

大家好&#xff0c;我是鸟哥。一个半路出家的程序员。 提到Zlibrary&#xff0c;想必大家都不陌生吧。全球最大的数字图书馆&#xff0c;截止被封前共收录了591万本书&#xff0c;7751万篇文章&#xff0c;并且还在不断的增加中&#xff0c;关键是可以免费下载。 反正我是很熟悉…