当前位置: 首页 > news >正文

MySQL索引事务

1.索引

1.1概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结果实现。(这里只用通俗的语言和图片进行介绍)

1.2作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。

  • 索引所引起的作用类似书架目录,可用于快速定位、检索数据。

  • 索引对于提高数据库的性能有很大的帮助。

1.3使用场景

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

  • 数据量较大,且经常对这些列进行条件查询。

  • 该数据库表的插入操作,以及对这些列的修改频率比较低。

  • 索引会占用额外的磁盘空间。

满足以上条件时,考虑对表中的这些字段创建索引,以及提高效率。

反之,如果非条件查询列,或经常做插入、修改操作,或者磁盘空间不足时,不考虑创建索引。

1.4使用

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

  • 查看索引

show index from table_name;

【案例】

查看学生表已有的索引

  • 创建索引

对于一些非主键、非唯一约束、外键的字段,可以创建普通索引

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

【案例】

创建班级表中,name字段的索引

  • 删除索引

drop index 索引名 on 表名;

【案例】

删除班级表中name字段的索引

【注意】我们目前使用on的情况,只用jion ... on, drop index ... on,create index ... on

1.5案例

准备测试表:

创建、展示、删除索引:

1.6索引背后的数据结构(常见面试题)

索引时通过B+树的数据结构来实现数据的查找的。

1.6.1 B树(B-树)

我们先了解B-树,也叫做B树。

【注意】“-"读作杠,不是减。

【解析】

  1. B树是一个度为N的树

  1. 在关键值key左边的节点都比key小,在关键字key右边的节点都比key大

  1. 树的高度越高,进行查询比较的时候,访问磁盘的次数越多,速度越慢。

  1. 无法进行模糊匹配和范围查询(很复杂,需要来回找)

B+树就是在此基础上,进行改进的!

1.6.2 B+树

B+树也叫N叉搜索树。

解析】

  1. 每个节点的最右边即为这颗子树的最大值

  1. 每个节点中,最大值都会重复出现;

  1. 叶子节点会首尾相连;

【优势】

  1. 能进行范围查询和模糊匹配(每个key都会在叶子节点出现,不用来回查找);

  1. 占用内存小:只有叶子节点才会储存完整的信息,非叶子节点只会存储key值,我们可以将索引直接放到内存中也不会占用很大的空间。这样做大大减少了访问硬盘的次数,提高了查找的效率。

所占内存大小估计:假设每个key值占4个字节,总共有10亿条数据,所占内存3.73G,是非常小的。

3.查找次数稳定:每个数据的完整信息都是在叶子节点,查找的次数都是相同的。不会出现个别数据查找的特别慢。

2.事务(常见面试题)

2.1为什么使用事务

-- 使用事物的原因
update account set money = money - 2000 
where name = '顾客';
update account set money = money + 2000
where name = '商家';

比如上述是一个转账过程。在执行完第一条命令的时候,如果服务器突然宕机,就会出现钱扣了,但是商家没有收到钱的情况。

【解决方案】使用事物来控制,保证两条语句是完全执行的,要么完全失败。

2.2事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么成功,要么失败

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

2.3使用

-- 使用事务
start transaction;
update account set money = money - 2000 
where name = '顾客';
update account set money = money + 2000
where name = '商家';
commit;
  1. 开始事务:start transaction;

  1. 执行多条SQL语句;

  1. 回滚或者提交:rollback/commit

2.4事务的四大特性(重点)

  1. 原子性[核心的特征]

事务具有原子性,即不可分割性。要么完全执行,要么不执行,不会出现只执行一般宕机的情况。如果服务器在执行事务过程中突然停电,那么在来电的时候,会进行回滚,恢复到原来的数据状态。

  1. 一致性

执行事务前后数据是可靠的。例如上述转账的事务,如果事务成功,商家会收到钱,顾客会减少余额。不会出现其他的情况。如果事务失败,顾客的钱不会减少,商家的钱不会增多。同样不会出现其他情况。

  1. 持久性

事务修改的内容是写到了硬盘上的,持久存在的。宕机、重启、断电等都不会影响到数据的安全。

  1. 隔离性(重点)

隔离性是为了解决“并发”执行事务,而引起的问题。

2.4.1隔离性

并发:多个事务同时读取了一个数据

【形象的例子】

一个饭馆在同一时间同时进来多个顾客,我们应当先服务谁?

  1. 脏读问题

形象的例子】比如老师正在写笔记(网上),同学可能会看老师的笔记,看来一会就离开了。然后老师继续写笔记,并修改了它。最后上课的时候发现,老师的笔记和昨天看到的不一样了。这就产生了脏读问题。

对应的实例】我们在某个游戏中充钱,当我们执行完充钱操作(业务没有结束),用户进行查看,发现钱已经有了,但是后来业务回滚,导致钱又消失了。这会让用户产生疑惑。

解决方法】为了解决脏读问题,mySQL引入了“写操作加锁”的机制。只有数据被写完,并解锁后,才能被其他事务使用。这个写操作加锁,可以降低并发程度,提高了隔离性。但是加锁,开锁需要时间,减低了效率。

实质】在写的时候读,导致用到了无效的数据。

  1. 不可重复读

形象的例子】当老师写完笔记后(记作版本1),同学也在阅读笔记。此时老师认为有些地方写的不好,需要修改,当老师再次提交到网上的时候,同学发现读着读着,笔记变了。就会造成不可重复度的问题。

对应的实例】我们给游戏中2023.03.03 12:00:00中此时用户点卷达到1000的用户送10点卷,达到2000点卷的用户送20点卷。有个玩家在此时点卷数是1000,我们送给他10点卷(送10点卷的语句结束,送20点卷语句没执行,且处于同一业务)。此时此玩家充值了1000点卷,达到2000点卷,导致又送了20点卷给他。前后送了30点卷。我们应当以同一时刻下的点卷数为准,不应让数量得到修改。

解决方法】对读加锁,在一个数据被读的时候,不能被写操作。这也会降低效率的,但是降低了并发程度。

实质】在读的时候写,导致两次读的结果不一样。

  1. 幻读

当前已经约定对读加锁、对写加锁,解决了不可重复度和脏读问题。

形象的例子】在事务A中我们在首先读取表A的所有数据时,得到了全部的数据。并删除了所有的数据。但是另一个事务突然向表中插入数据。然后事务A有读取整张表的数据,本应为空的表,有了数据,最后的到了不可预期的结果。

本质】在操作一张表时,数据又进行了增删,导致数据量改变。

相关文章:

MySQL索引事务

1.索引1.1概念索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结果实现。(这里只用通俗的语言和图片进行介绍)1.2作用数据库中的表…...

ISO27001信息安全管理体系认证

​ISO信息安全管理体系认证 一、什么是ISO信息安全管理体系认证? ISO是信息安全管理体系认证,是由国际标准化组织(ISO)采纳英国标准协会BS-2标准后实施的管理体系,成为了“信息安全管理”的国际通用语言,企…...

Linux应用GUI开发C++ 之gtkmm4(1)

目录概述GTKgtkmm安装gtkmm4hello,worldcodelite配置代码解释概述 GTK GTK是一个小部件工具包。GTK创建的每个用户界面都由小部件组成。这是在C语言中使用GObject实现的,GObject是一个面向对象的C语言框架。窗口小部件是主容器。然后通过向窗口中添加按钮、下拉菜…...

选课系统的设计与实现

技术:Java等摘要:目前国内各高校的规模越来越大,进而造成教师教学管理等工作量日趋加大。然而,现代教育的信息化、网络化已经成为教育发展的一个重要方向,同时也为解决高校教学管理效率低下的现状,使管理突…...

关于安卓的一些残缺笔记

安卓笔记Android应用项目的开发过程Android的调试Android项目文档结构Intent的显式/隐式调用Activity的生命周期1个Activity界面涉及到生命周期的情况2个Activity界面涉及到生命周期的情况Android布局的理论讲解Activity界面布局ContentProvider是如何实现数据共享Android整体架…...

MySQL 中的锁有哪些类型,MySQL 中加锁的原则

锁的类型MySQL 找那个根据加锁的范围,大致可以分成全局锁,表级锁和行级锁。全局锁全局锁,就是对整个数据库加锁。加锁flush tables with read lock解锁unlock tables全局锁会让整个库处于只读状态,之后所有的更新操作都会被阻塞&a…...

Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作

场景 Sqlite数据库 SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不…...

2023最新版本RabbitMQ下载安装教程

一、RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。主要用于在进程、应用程序和服务器之间交换数据,可以通过插件支持进行扩展,支持许多协议,并提供高性能、可靠性、集群和高可用队列。 AMQP :Advanced Me…...

如何使用码匠连接 Elasticsearch

目录 在码匠中集成 Elasticsearch 在码匠中使用 Elasticsearch 关于码匠 Elasticsearch 是一个开源的分布式搜索和分析引擎,常用于处理大规模数据集的搜索、实时数据分析和数据挖掘任务。它支持多种数据源,包括关系型数据库(如 MySQL、Pos…...

jmeter学习笔记二(jmeter函数与后置处理器)

Jmeter重要的函数 ${__counter(,)} 计数器 ​ ${__counter(TRUE,)} 默认加1; TRUE,每个用户有自己的计数器;FALSE,使用全局计数器 ​ 计数器元件,可以设置起始值,间隔值,最大值。运行结果超过最大值时&a…...

【独家】华为OD机试提供C语言题解 - 子序列长度

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明子序…...

Java之注解

注解1.1 注解的概念1.2 内置注解1.3 元注解1.4 自定义注解1.1 注解的概念 Annotation 是从JDK5.0 开始引入的新技术 Annotation的作用: 不是程序本身,可以对程序做出解释(这一点和注释comment没什么区别)可以被其他程序&#xff…...

【C++】string

【C修炼秘籍】string 目录 【C修炼秘籍】string 文章目录 前言 一、标准库里的string 二、string常用接口功能简介(具体使用和底层转到模拟实现) 1、string类的常见构造函数 2、string类对象的容量操作 3、string类对象的访问及遍历操作 4、 string类对象…...

JVM详解——执行引擎

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:耶瞳空间 一:执行引擎介绍 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和…...

python学习——【第二弹】

前言 上一篇文章 python学习——【第一弹】给大家介绍了python中的基本数据类型等,这篇文章接着学习python中的运算符的相关内容。 运算符 python中的运算符主要有:算术运算符,赋值运算符,比较运算符,布尔运算符以及…...

242. 有效的字母异位词 349. 两个数组的交集

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意: 若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat…...

web网页设计——JavaScript一些语法

1、事件监听 语法&#xff1a; <1> 元素对象.addEventListener(‘事件类型’,要执行的函数&#xff09; 三要素&#xff1a;&#xff08;1&#xff09;、事件源 &#xff08;2&#xff09;事件类型 &#xff08;3&#xff09;执行的函数 <2>元素对象.on事件类型 …...

php宝塔搭建部署实战CSM会议室预约系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套基于fastadmin开发的CSM会议室预约系统的源码。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#xff0…...

嵌入式知识点-SPI通讯

该文原自 &#xff1a; 正点原子 01 SPI概述 SPI (Serial Peripheralinterface),顾名思义就是串行外围设备接口。SPI是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同…...

C#教程--01 简介

简介 C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 C#的特性 现代的、通用的编程语言。 面向对象。 面向组件。 容易学习。 结构化语言。 它产生高效率的程序。 它可以在多种计算机平台上编译。 .Net 框架的一部分。 C#强大的编程…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...