存储引擎 / 事务 / 索引

news2025/4/9 0:25:40
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 当中索引列使用函数

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

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

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

相关文章

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对内容进…

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

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

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

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

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

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

7.4 SVD 的几何背景

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

C++的多态-上

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

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

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

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

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

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

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

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

🌟 Java 数组与 ArrayList 核心区别解析:从源码到实战 💡 Java 开发者必读! 数组(Array)和 ArrayList 是 Java 中最常用的数据存储结构,但它们的底层设计、性能表现和适用场景差异显著。本文通…

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

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

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

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

iproute2 工具集使用详解

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

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 形成对镀锌性的影响,对汽车用高强度钢镀锌工艺优化意义重大。通过多组对比实验,结合多种分析手段,明确了相关因素…

React学习-css

W3Schools Tryit Editor CSS 教程 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: p { /* 这是个注释 */ color:red; text-align:center; }选择器 CSS Id: #para1{ text-align:center; color:red; } Class: .center {text-align:center;} p…

数据分析-Excel-学习笔记Day1

Day1 复现报表聚合函数:日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格,首先要看这个表格的构成(包含了哪些数据),几行几列,每一列的名称…

树莓派PICO 设备烧录成cmsis dap

文章目录 1. 实际操作2. IO连接 1. 实际操作 2. IO连接

【数据结构】图的存储

目录 邻接矩阵 表示方法 代码定义 结构特点与度的信息 邻接表 表示方法 代码定义 结构特点与度的信息 十字链表 表示方法 第二步,将顶点x的firstIn域与所有headvex域为x的弧连起来。 结构特点与度的信息 邻接多重表 表示方法 结构特点与度的信息 图…