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

存储引擎 / 事务 / 索引

1. 存储引擎

MySQL 中特有的术语。

(Oracle 有,但不叫这个名字)

是一种表存储 / 组织数据的方式

不同的存储引擎,表存储数据的方式不同

1.1 查看存储引擎

命令: show engines \g(或大写:G)

support 为 yes 即支持存储引擎

default  即不指定情况下默认为存储引擎

 不同版本支持的存储引擎不同。

 

1.2 常用存储引擎
1.2.1 MyISAM

管理的表具有以下特征:
        使用三个文件表示每个表:
                格式文件:存储表结构的定义(mytable.frm)

                数据文件:存储表行的内容(mytable.MYD)

                索引文件:存储表上的索引(mytable.MYI)

(索引:类似于书的目录,可缩小扫描范围,提高检索效率。

只要是主键,或带有 unique 约束的字段,会自动创建索引)

特点:可被转换为压缩,只读表来节省空间

不支持事务机制,安全性低;

1.2.2 InnoDB

MySQL 的默认存储引擎,同样是一个重量级的存储引擎

支持事务,支持数据库崩溃后自动恢复机制

支持多版本(MCVV)和 行级锁定

特点:支持事务,以保证数据的安全

效率不高,不能压缩或转换为只读,不能很好的节省存储空间

1.2.3 MEMORY

数据存储在内存中,且行的长度固定

表的数据及索引被存储在内存

(内存是直接取得,硬盘是机械行为)

特点:查询效率最高,不需要和硬盘交互

不安全,关机之后数据消失。数据和索引都在内存当中

2. 事务(transaction)
2.1 概述

一个事务就是一个完整的业务逻辑,是一个最小的工作单元,不能再分

要么同时成功,要么同时失败;

只有 DML(增删改:insert,delete,update) 语句才会有事务一说,其他语句和事务无关

因此,只要操作一旦涉及数据的增,删,改,那么一定要考虑安全问题

一个事务本质上就是多条 DML 语句同时成功或同时失败

2.2 原理

事务开启:

insert        insert        delete        delete        update        update

事务结束!

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

事物的执行过程中,每一条 DML 的操作都会记录到 “ 事务性活动的日志文件 ” 中

且事物的执行过程中,可以提交事务,也可以回滚事务;

提交事务:清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。

标志着事务全部成功的结束,

回滚事务:将之前所有的 DML 操作全部撤销,并清空事务性活动的日志文件。

标志着事务全部失败的结束。

2.3 提交/回滚

提交:commit

回滚:rollback(回滚永远只能回滚到上一次的提交点!)

MySQL 默认支持自动提交事务:每执行一条 DML 语句,就提交一次

自动提交不符合开发习惯。一个业务通常需要多个 DML 语句 共同执行才能完成。为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条就提交一条。

关闭自动提交:start transaction

2.4 ACID 特性

A:原子性

        事务是最小的工作单元,不可再分。

C:一致性

        同一个事务中,所有的操作必须同时成功,或者同时失败,以保证数据的一致性。

I:隔离性

        A 事务与 B 事务之间有一定的隔离

D:持久性

        事务提交,相当于将没有保存到硬盘的数据保存到硬盘上

2.4.1 隔离性

好比学生时代,教室与教室之间通过一堵墙隔离开;

事务与事务之间的“墙”有厚薄之分;

读未提交(read uncommitted):最低隔离级别。【没有提交就读到了

       事务 A 可以读取到事务 B 未提交的数据。即脏读(Dirty Read)现象

        这种隔离级别一般都是理论上的,大多数数据库隔离级别二档起步

读已提交(read committed):【提交之后才能读到

        事务 A 只能读取到事务 B 提交之后的数据

        优点:解决了脏读的现象

        缺点:不可重复读取数据:事务A开启之后,读到了3条数据,同时事务B在不断提交数据。当前事务还没有结束,第二次读取的时候,读到的数据是4条。

可重复读(repeatable read):【MySQL 默认事务隔离级别】【提交之后也读不到,永远读取的都是刚开启事务时的数据

        事务 A 开启之后,不管多久,每一次在事务 A 中读取到的数据都是一致的。

        即使事务 B 已经将数据修改并提交,事务 A  读取到的数据还是没有发生改变。 

        优点:解决了不可重复读取数据

        缺点:会出现幻影读,每一次读取到的数据都是幻想,不够真实。

序列化 / 串行化(serializable):最高隔离级别

        效率最低,解决了所有的问题

        这种隔离级别表示事务排队,不能并发

2.4.2 隔离级别演示

查看隔离级别: select @@transaction_isolation;

修改事务隔离级别:set global transaction isolation level xxxxxx;

(1)验证 :read uncommitted

设置 MySQL 隔离级别: set global transaction isolation level read uncommitted;

退出并重新进入,验证隔离级别是否设置正确;

 右侧窗口开启事务,插入数据,左侧窗口 MySQL 的隔离级别已经被修改为 读未提交。

所以右侧窗口的事务还没有提交,左侧就可以读取到;

即没有提交就读到了,这就是 读未提交; 

(2)验证:read committed

设置左侧窗口 事务隔离级别: set global transaction isolation level read uncommitted;

开启一个事务,插入一条数据,不提交,在左侧窗口设置的 读已提交的数据库中,没有查询到新插入的数据;

右侧窗口中的事务提交后,左侧窗口才能查询到。

这就是提交之后才能读取到的 读已提交事务隔离机制;

 

 (3)验证:repeatable read

设置左侧窗口 事务隔离级别: set global transaction isolation level repeatable read;

右侧窗口开启事务并插入数据,最后提交。

左侧窗口在本事务开启期间,没有”刷新“数据

这就是提交之后也读不到,永远读取的都是刚开启事务时的数据 的可重复读事务机制

 

(4)验证:serializable

设置左侧窗口 事务隔离级别: set global transaction isolation level serializable;

 右侧与左侧窗口都开启一个事务,操作同一张表

光标会卡住

这就是事务排队,不能并发 的序列化事务机制

3. 索引(index)
3.1 概述

索引是一种提高查询效率的机制,相当于一本书的目录,为了缩小扫描范围而存在;

索引添加在数据库表的字段上,多个字段联合起来也可以添加索引;

3.2 查询

MySQL 在查询方面主要有两种方式:全表扫描根据索引检索

例如:select * from test where name = 'zhangsan'

如果没有给 name 字段添加/创建索引,MySQL 会进行全扫描,将 name 字段的每一个值都比对一遍,效率比较低。

3.3 排序

汉语字典的目录按照 ” a-b-c...  “ 排序,MySQL 的目录 / 索引 也需要排序

索引的排序与 TreeSet(TreeMap) 相同,底层是一个自平衡的二叉树。

MySQL 当中,索引是一个 B-Tree 数据结构;

遵循左小右大原则存放,采用中序遍历获取数据;

3.4 原理

任何数据库当中主键都会自动添加索引对象,若字段被 unique 约束,也会自动创建索引对象

任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号

MySQL 当中,索引是一个单独的对象

不同的存储引擎中索引以不同的形式存在,:

        MyISAM 存储引擎中,索引存储在一个 .MYI 文件中

        InnoDB 存储引擎中,索引存储在一个逻辑名称叫做 tablespace 当中

        MEMORY 存储引擎中,索引存储在内存当中

3.5 条件

不要随意添加索引,索引需要不断维护,太多反而会降低系统性能

以下是添加索引的条件:

        1. 数据量庞大(每个硬件环境不同,庞大的标准也不同)

        2. 该字段经常出现在 where 的后面,以条件的形式存在

        3. 该字段很少的 DML 操作(DML 后,索引需要重新排序)

数据库优化后,对于速度的提升不是一星半点,可能是成千上万倍;

建议通过主键或者通过 unique 约束的字段进行查询,效率较高;

3.6 创建/删除索引

创建索引:create  index  索引名称  on  表名(字段名)

删除索引:drop index 索引名称  on  表名

查询是否使用索引:explain  select  *  from  表名  where  条件(与索引相关字段) 

创建索引:

查询是否使用索引: 

删除索引:

3.7 索引失效

(1)模糊查询中以 ”  % “ 开始

        select  *  from Student where name  =  ' % L '

        原因:在比对的时候,数据的开头是 ” % “,不知道是什么东西,当然无法进行比对;

(2)使用 or  会索引失效

        使用 or,要求 or 两边的条件字段都要有索引

        所以,尽量使用 ‘ union ’ 替换 ‘ or ’ ;

(3)使用复合索引 

        复合索引:两个字段或者更多的字段联合起来添加一个索引,叫做复合索引;

        使用复合索引的时候,没有使用左侧的列查找,索引失效

        即遵循最左原则

(4)where 当中索引列参加运算

         where 当中索引列参加运算,索引失效

(5)索引列使用函数

        where 当中索引列使用函数

 除此之外,还有其他索引失效的情况,这里不一一详举;

相关文章:

存储引擎 / 事务 / 索引

1. 存储引擎 MySQL 中特有的术语。 (Oracle 有,但不叫这个名字) 是一种表存储 / 组织数据的方式 不同的存储引擎,表存储数据的方式不同 1.1 查看存储引擎 命令: show engines \g(或大写:G…...

Go语言-初学者日记(八):构建、部署与 Docker 化

🧱 一、go build:最基础的构建方式 Go 的构建工具链是出了名的轻量、简洁,直接用 go build 就能把项目编译成二进制文件。 ✅ 构建当前项目 go build -o myapp-o myapp 指定输出文件名默认会构建当前目录下的 main.go 或 package main &a…...

【ESP32】ESP32物联网应用:MQTT控制与状态监测

ESP32物联网应用:MQTT控制与状态监测 引言 在物联网时代,远程监测和控制设备已经成为现实生活中常见的需求。本文将介绍如何使用ESP32微控制器配合MQTT协议,实现一个简单而强大的物联网应用:远程状态监测和设备控制。我们将以巴…...

RabbitMQ运维

RabbitMQ运维 一.集群1.简单介绍2.集群的作用 二.搭建集群1.多机多节点搭建步骤 2.单机单节点搭建步骤 3.宕机演示 三.仲裁队列1.简单介绍2.Raft协议Raft基本概念主节点选举选举过程 3.仲裁队列的使用 四.HAProxy负载均衡1.安装HAProxy2.HAProxy的使用 一.集群 1.简单介绍 Ra…...

Ansible 实战:Roles,运维的 “魔法函数”

一、介绍 你现在已经学过tasks和handlers,那么,最好的playbook组织方式是什么呢?答案很简单:使用roles!roles基于一种已知的文件结构,能够自动加载特定的vars_files、tasks以及handlers。通过roles对内容进…...

CVAT安装和使用(Windows)

必要组件安装 WSL2 Docker Git Chrome Install WSL2 (Windows subsystem for Linux) refer to this official guide. WSL2 requires Windows 10, version 2004 or higher. After installing WSL2, install a Linux Distribution of your choice. 安装 WSL2(适用…...

Spring 中的 bean 生命周期

🌱 一、什么是 Bean 生命周期? 在 Spring 容器中,一个 Bean 从“创建 → 初始化 → 使用 → 销毁”,经历了完整的生命周期。 Spring 提供了 多个扩展点 让你可以在这些阶段做事情,比如注入资源、日志记录、连接资源、清…...

关于JVM和OS中的指令重排以及JIT优化

关于JVM和OS中的指令重排以及JIT优化 前言: 这东西应该很重要才对,可是大多数博客都是以讹传讹,全是错误,尤其是JVM会对字节码进行重排都出来了,明明自己测一测就出来的东西,写出来误人子弟… 研究了两天&…...

微软推出首款量子计算芯片Majorana 1

全球首款拓扑架构量子芯片问世,2025年2月20日,经过近20年研究,微软推出了首款量子计算芯片Majorana 1,其宣传视频如本文末尾所示。 微软表示,开发Majorana 1需要创造一种全新的物质状态,即所谓的“拓扑体”…...

数组练习题总结

一、求出数组中的最大值let arr [1, 2, 5, 7];let max 0;for (i 0; i < arr.length; i) {// console.log(max);if (max < arr[i]) {max arr[i];}}console.log(max); 首先生成一个数组&#xff0c;设一个变量为保存最大值&#xff0c;写一个循环&#xff0c;在循环里写…...

Kotlin 中的 `reified` 关键字全解析:保留类型信息 + 优化高阶函数的双重魔法

在使用 Kotlin 编写泛型函数时&#xff0c;你是否遇到过这样的尴尬&#xff1a;你想判断某个对象是不是泛型类型 T&#xff0c;结果却发现代码根本编译不过&#xff1f;这是因为 Kotlin 和 Java 一样&#xff0c;泛型在运行时会被类型擦除。 为了解决这个问题&#xff0c;Kotl…...

在CPU服务器上部署Ollama和Dify的过程记录

在本指南中&#xff0c;我将详细介绍如何在CPU服务器上安装和配置Ollama模型服务和Dify平台&#xff0c;以及如何利用Docker实现这些服务的高效部署和迁移。本文分为三大部分&#xff1a;Ollama部署、Dify环境配置和Docker环境管理&#xff0c;适合需要在本地或私有环境中运行A…...

【计网】TCP 协议详解 与 常见面试题

三次握手、四次挥手的常见面试题 不用死记&#xff0c;只需要清楚三次握手&#xff0c;四次挥手的流程&#xff0c;回答的时候心里要记住&#xff0c;假设网络是不可靠的 问题(1)&#xff1a;为什么关闭连接时需要四次挥手&#xff0c;而建立连接却只要三次握手&#xff1f; 关…...

Java 基础-31-枚举-认识枚举

在Java编程语言中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的类&#xff0c;它允许一组固定的常量。它们非常适合用来表示一组固定的值&#xff0c;比如星期几、季节、颜色等。枚举自Java 5开始引入&#xff0c;为定义常量提供了一种更强大和方便的方式。本文将…...

7.4 SVD 的几何背景

一、SVD 的几何解释 SVD 将矩阵分解成三个矩阵的乘积&#xff1a; ( 正交矩阵 ) ( 对角矩阵 ) ( 正交矩阵 ) (\pmb{正交矩阵})\times(\pmb{对角矩阵})(\pmb{正交矩阵}) (正交矩阵)(对角矩阵)(正交矩阵)&#xff0c;用几何语言表述其几何背景&#xff1a; ( 旋转 ) ( 伸缩 )…...

低延迟云网络的核心技术

低延迟云网络通过架构优化、协议创新、硬件加速等多维度技术手段,将数据传输延迟降低至毫秒级甚至微秒级。 1. 网络架构优化 1.1 扁平化网络Leaf-Spine 架构 减少网络层级,缩短数据转发路径(如数据中心内部一跳可达)。 扁平化网络Leaf-Spine(叶子-脊椎)架构是一种现代…...

C++的多态-上

目录 多态的概念 多态的定义及实现 1.虚函数 2. 多态的实现 2.1.多态构成条件 2.2.虚函数重写的两个例外 (1)协变(基类与派生类虚函数返回值类型不同) (2)析构函数的重写(基类与派生类析构函数的名字不同) 2.3.多态的实现 2.4.多态在析构函数中的应用 2.5.多态构成条…...

内存与显存:从同根生到殊途异路的科技演进

在现代计算机的世界里&#xff0c;内存和显存是两个不可或缺的硬件组件。它们看似功能相近&#xff0c;却在发展历程中逐渐分道扬镳&#xff0c;各自服务于不同的计算需求。今天&#xff0c;我们将从一根内存条和一块显卡入手&#xff0c;深入探讨内存与显存的异同&#xff0c;…...

手搓多模态-04 归一化介绍

在机器学习中&#xff0c;归一化是一个非常重要的工具&#xff0c;它能帮助我们加速训练的速度。在我们前面的SiglipVisionTransformer 中&#xff0c;也有用到归一化层&#xff0c;如下代码所示&#xff1a; class SiglipVisionTransformer(nn.Module): ##视觉模型的第二层&am…...

【C++】第八节—string类(上)——详解+代码示例

hello&#xff0c;又见面了&#xff01; 云边有个稻草人-CSDN博客 C_云边有个稻草人的博客-CSDN博客——C专栏&#xff08;质量分高达97&#xff01;&#xff09; 菜鸟进化中。。。 目录 一、为什么要学习string类&#xff1f; 1.1 C语言中的字符串 1.2 面试题(暂不做讲解) …...

Java 数组与 ArrayList 核心区别解析:从源码到实战!!!

&#x1f31f; Java 数组与 ArrayList 核心区别解析&#xff1a;从源码到实战 &#x1f4a1; Java 开发者必读&#xff01; 数组&#xff08;Array&#xff09;和 ArrayList 是 Java 中最常用的数据存储结构&#xff0c;但它们的底层设计、性能表现和适用场景差异显著。本文通…...

【易飞】易飞批量选择品号处理方法,工作效率提升300%

开窗选择品号方式要么手动输入,要么以什么开头、包含、从A物料到B物料查询后返回的有规律的品号。对于没有规律且大量品号的处理方式是否有便捷的方法呢? 尤其在通常在查询多阶材料清单,查询库存明细表,整批变更元件等如品号无规律情况下,只能一个个选择,无法通过EXCEL方…...

【最新版】啦啦外卖v64系统独立版源码+全部小程序APP端+安装教程

一.系统介绍 啦啦外卖跑腿平台独立版&#xff0c;使用的都知道该系统功能非常强大&#xff0c;应该说是目前外卖平台功能最全的一套系统。主要是功能非常多&#xff0c;拿来即用&#xff0c;包括客户端小程序、配送端小程序、商户端小程序&#xff0c;还有对应四个端的APP源码…...

iproute2 工具集使用详解

目录 一、iproute2 核心命令&#xff1a;ip二、常用功能详解1. 管理网络接口&#xff08;link 对象&#xff09;2. 管理 IP 地址&#xff08;address 对象&#xff09;3. 管理路由表&#xff08;route 对象&#xff09;4. 管理 ARP 和邻居缓存&#xff08;neigh 对象&#xff0…...

项目总结之常问的一些问题

1.项目功能介绍&#xff0c;重难点 重难点&#xff1a; mock工具使用&#xff08;涉及到的三方接口过多&#xff0c;由于网络等原因无法调通&#xff0c;所以测试的时候&#xff0c;采用mock工具来模拟返回接口真正调用后响应数据&#xff09; 2.项目负责哪部分&#xff1f;…...

C语言查漏补缺:占位符篇

占位符篇 1. 整数类型2. 字符类型3. 浮点数类型4. 指针类型5. 字符串6. 修饰符 1. 整数类型 %d / %i&#xff1a;用于 int&#xff08;有符号十进制整数&#xff09;。int num -42; printf("%d", num); // 输出: -42%u&#xff1a;用于 unsigned int&#xff08;无…...

cut命令用法

cut 是 Linux/Unix 系统中一个用于按列提取文本内容的命令&#xff0c;常用于处理结构化文本&#xff08;如 CSV、日志、配置文件等&#xff09;。它通过分隔符、字符位置或字节位置来切割文本&#xff0c;提取指定部分。 核心功能 按字段&#xff08;列&#xff09;提取&#…...

java 正则表达式优化

1&#xff0c;什么是正则表达式 正则表达式使用一些特定的元字符来检索、匹配以及替换符合规则的字符串。 构造正则表达式语法的元字符&#xff0c;由普通字符、标准字符、限定字符&#xff08;量词&#xff09;、定位字符&#xff08;边界字符&#xff09;组成 普通字符 字母[…...

AD(Altium Designer)更换PCB文件的器件封装

一、确定是否拥有想换的器件PCB封装 1.1 打开现有的原理图 1.2 确定是否拥有想换的器件PCB文件 1.2.1 如果有 按照1.3进行切换器件PCB封装 1.2.2 如果没有 按照如下链接进行添加 AD(Altium Designer)已有封装库的基础上添加器件封装-CSDN博客https://blog.csdn.net/XU15…...

【文献研究】含硼钢中BN表面偏析对可镀性的影响

《B 添加钢的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰写。研究聚焦 B 添加钢在低露点退火时 BN 形成对镀锌性的影响&#xff0c;对汽车用高强度钢镀锌工艺优化意义重大。通过多组对比实验&#xff0c;结合多种分析手段&#xff0c;明确了相关因素…...