MySQL索引、事务、与存储引擎

news2024/11/27 1:23:51

MySQL索引、事务、与存储引擎

一、索引

1.概念

索引是一个排序的列表,包含索引字段的值和其相对应的行数据所在的物理地址

2.作用

优点

加快表的查询速度
可以对字段排序

缺点

额外占用磁盘空间
更新包含索引的表效率会更慢

3.索引工作模式

没有索引的情况下,要查询某行数据,需要先扫描全表来定位某行数据
有索引后会通过查找条件的字段值找到其索引对应的行数据的物理地址,然后根据物理地址访问相应的数据

4.索引创建条件

1)表中的记录行数较多时,一般超过300行的表建议要有索引
2)建议在 表中的主键字段、外键字段、多表连接使用的字段、唯一性较好的字段,不经常更新的字段、经常出现在where、group by、order by 子语句的字段、小字段 创建索引
3)不建议在 唯一性较差的字段、更新太频繁的字段、大文本字段 上创建索引

5.索引类型

①普通索引

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

在这里插入图片描述

②主键索引

alter table 表名 add primary key (字段);

在这里插入图片描述

③唯一索引

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

alter table 表名 add unique 索引名 (字段);

在这里插入图片描述

④组合索引

create unique index 索引名 on 表名 (字段1, 字段2, 字段3);    alter table 表名 add index 索引名 (字段1, 字段2, 字段3);
select ... from 表名 where 字段1=XX and 字段2=xx and 字段3=XX     用 and 做条件逻辑运算符时,要创建组合索引且要满足最左原则
                                                                用 or 做条件逻辑运算符时,所有字段都要创建索引 

在这里插入图片描述

⑤全文索引

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

alter table 表名 add fulltext 索引名 (字段);
 模糊查询: select ... from 表名 where match(字段) against('查询内容');

在这里插入图片描述

⑥查看索引

show create table 表名;
show index from 表名;
show keys from 表名;

在这里插入图片描述

⑦删除索引

drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
alter table 表名 drop primary key;

在这里插入图片描述

⑧索引检测

explain select * from 表名 where 字段=值;  
可以用于分析select查询语句,看key字段,确定是否使用了索引或索引使用是否正确

二、事务

1.什么是事务

是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
事务就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

2.事务的ACID特点

2.1原子性(Atomicity

指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生

•事务是一个完整的操作,事务的各元素是不可分割的;
•事务中的所有元素必须作为一个整体提交或回滚;
•如果事务中的任何元素失败,则整个事务将失败。

2.2一致性(Consistency

指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

•在事务开始前,数据库中存储的数据处于一致状态;
•当事务完成后,数据也必须处于一致状态。

2.3隔离性(lsolation

指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

•对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务;
•修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据,即并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。

2.4持久性(Durability)

在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。指不管系统是否发生故障,事务处理的结果都是永久的。一旦事务被提交,事务的效果会被永久地保留在数据库中。

3.并发访问表的一致性问题

①脏读

​ 当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。(即一个事务能看到另一个事务未提交的数据)

②不可重复读

​ 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即由于一个事务中途修改使另一个事务多次读取不能读到相同的数据内容)

③幻读

​ 一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好像发生了幻觉一样。(即一个事务明明修改了多行数据记录,但由于另一个数据的影响,却导致发现有数据记录未被修改)

丢失更新

​ 两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

4.事务的隔离级别

(1)未提交读(Read Uncommitted (RU))

​ 允许脏读,即允许一个事务可以看到其他事务未提交的修改。

(2)提交读(Read Committed (RC))

​ 允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。(防止脏读)

(3)可重复读(Repeatable Read (RR))

​ 确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。(可以防止脏读和不可重复读)

(4)串行读(serializable)

相当于锁表

​ 完全串行化的读,将一个事务与其他事务完全地隔离。每次读都需要获得表级共享锁,读写相互都会阻塞。(可以防止脏读,不可重复读取和幻读;但事务串行化会降低数据库的效率)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHjic7x5-1687219432228)(C:\Users\xujixiang\Desktop\云计算学习资料\云计算二阶\MySQL\mysql索引、事务、存储引擎\隔离级别.png)]

  Mysql 默认的隔离级别是 Repeatable Read (RR)

  Oracle 和 SQL Server 的默认隔离级别是 Read Committed (RC)。

5.隔离级别操作

①查看隔离级别

show global variables like '%isolation%';   //查看全局隔离级别
show session variables like '%isolation%';  //查看会话隔离级别

②设置隔离级别

set global transaction isolation level read committed;    //设置全局隔离级别
set session transaction isolation level read committed;   //设置会话隔离级别

在这里插入图片描述

6.事务操作

begin;                      //开始事务
....  insert into   update XX set   delete from    //插入数据,更新数据。删除数据
savepoint XX;              //设置回滚点
rollback to XX;            //回滚到回滚点
commit;   rollback;        //提交事务;回滚操作

7.设置自动提交事务

set autocommit=0|1;               //0为关闭自动提交事务;1为开启自动提交事务
show variables like 'autocommit'; //查看自动提交事务的状态

三、存储引擎

1.概念

存储引擎 是MySQL数据库中的组件,负责执行实际的数据I/O操作,工作在文件系统之上,数据库的数据会先传输到存储引擎,会按照存储引擎的格式保存到文件系统中

2.常用存储引擎

MyISAM InnoDB

3.MyIsam与InnoDB比较

MyIsamInnoDB
不支持事务,外键约束支持事务操作、外键约束
表级锁定行级锁定
适合单独的读、写插入操作,并发读写能力弱读写并发能力好
支持全文索引,资源占用较小,数据文件(.MYD)和索引文件(.MYI)是分开存储支持全文索引(5.5版本以后的),缓存能力较好可以减少磁盘IO的压力,数据文件也是索引文件
适用于不需要事务处理,单独的查询或者插入数据的业务场景适用于需要事务的支持,一致性要求较高,数据会频繁更新,高并发读写的业务场景

4.存储引擎管理

①针对于已经存在的表

alter table 表名 engine=MyISAM|InnoDB

②设置新建表的默认存储引擎

vim /etc/my.cnf                          修改mysql配置文件设置新建表的默认存储引擎
[mysqld]
default-storage-engine=MyISAM|InnoDB     

③新建表时指定存储引擎

create table 表名 (....)  engine=MyISAM|InnoDB

④查看存储引擎

show create table 表名;
show table status from 库名 where name='表名';

show engines;

四、死锁

1.概念

是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。

2.死锁原因

(1)系统资源不足。

(2) 进程运行推进的顺序不合适。

(3)资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

3.死锁的必要条件

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

4.如何避免死锁?

1)以固定的顺序访问表和行。
2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
4)降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。
5)为表添加合理的索引。如果不使用索引将会为表的每一行记录添加上锁,死锁的概率大大增大。

### 4.如何避免死锁?

1)以固定的顺序访问表和行。
2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
4)降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。
5)为表添加合理的索引。如果不使用索引将会为表的每一行记录添加上锁,死锁的概率大大增大。

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

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

相关文章

利用C语言创建图书管理系统

不仅仅是图书信息管理系统 基于双链表,采用面向对象编程方法制作的图书管理系统 ❞ 效果演示 root用户:账号:0,密码:0 普通用户:账号:1001,密码:666666 图书信息 没有完全…

Spring MVC各种参数进行封装

目录 一、简单数据类型 1.1 控制器方法 1.2 测试结果 二、对象类型 2.1 单个对象 2.1.1 控制器方法 2.1.2 测试结果 2.2 关联对象 2.2.1 控制器方法 2.2.2 测试结果 三、集合类型 3.1 简单数据类型集合 3.1.1 控制方法 3.1.2 测试结果 3.2 对象数据类型集合 3.…

KMP算法实现strStr(c++代码实现)

1 KMP算法简介 KMP算法是一个解决字符串匹配问题的算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出。当给你一个主串str和一个子串substr,如何确定substr在主串中出现的位置?如果没有学习KMP算法,我们可能会写出这样的代…

测试(三)——黑盒测试

一、测试用例的基本要素 测试环境、操作步骤、测试数据、预期结果 测试用例的好处: 1.能提高测试效率、节省测试时间 2.测试用例是自动化测试用例的前提 二、测试用例的设计方法 2.1基于需求进行测试用例设计 2.2具体的设计方法 2.2.1等价类 有效等价类&#x…

c++学生信息管理系统

前言 c课程作业–学生信息管理系统 在 原博客C通讯录管理系统 https://www.csdn.net/tags/OtDagg2sODU2Ni1ibG9n.html 的基础上进行了一点修改。 学生信息管理系统 基本功能要求: 能使用文件的打开,关闭,读写等操作,实现 1.连…

STM32单片机(六)TIM定时器 -> 第八节:TIM编码器练习(编码器接口测速)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

Linux学习入门笔记

计算机硬件 计算机五大基本部件 控制器 -----> 协调各个部件运算器 -----> 算术、逻辑运算存储单元 ----->内存、外存输入单元输出单元 cup 由控制器、运算器组成 计算机操作系统 操作系统 OS 管理和控制计算机系统中的硬件和软件资源,用于在用户与系统…

gitLens插件简单使用

1.安装 在vscode中的插件管理输入如下后下载 GitLens — Git supercharged 2.配置 点击文件--首选项--设置 点击右上角设置小图标 3.github使用 首先仓库文件一定是要git init是git所管理的 1.在代码文件夹下使用git init创建仓库 2.打开vscode的git管理 3.点击添加暂存区…

Triton教程 --- 优化

Triton教程 — 优化 文章目录 Triton教程 --- 优化优化设置动态批处理程序模型实例 特定于框架的优化带有 TensorRT 优化的 ONNX (ORT-TRT)具有 OpenVINO 优化的 ONNXTensorFlow 与 TensorRT 优化 (TF-TRT)TensorFlow JIT 图优化TensorFlow 自动 FP16 优化 NUMA优化主机策略 Tr…

python找出所有重复数字的三位数(如110)注意重复数字(如111除外) ​要求打印所有满足条件的三位数及个数,每行打印五个

一、编程题目 python找出所有重复数字的三位数(如110)注意重复数字(如111除外) ​要求打印所有满足条件的三位数及个数,每行打印五个。 二、实现思路 要实现判断数字是否重复,脑袋里的第一反应就是使用循环…

在办公套件 ONLYOFFICE 中使用 AI 插件:自动生成文本/图片、单词释义、翻译等

想必大家多少都体验过各种人工智能应用,它们跟办公套件结合简直就是打工人和学生们的王炸。除了在Office全家桶中可以使用AI插件,在开源办公套件 ONLYOFFICE 中也能使用它。 什么是 ONLYOFFICE ONLYOFFICE 是一个开源办公套件,由总部位于总部…

OpenMMLab-AI实战营第二期-课程笔记-Class 4:深度学习预训练与MMPretrain

Class4:深度学习预训练与MMPretrain 课程链接:深度学习预训练与MMPretrain_哔哩哔哩_bilibili 相关repo:open-mmlab/mmpretrain: OpenMMLab Pre-training Toolbox and Benchmark (github.com) 文章目录 Class4:深度学习预训练与MM…

系统工程 - 记录一次调试USB设备低功耗应用的过程

系统工程 - 记录一次调试USB设备低功耗应用的过程 文章目录 系统工程 - 记录一次调试USB设备低功耗应用的过程需求功耗测量方法分析功耗来源LED功耗MCU功耗板子漏电 软件改善功耗调整tinyusb协议栈源码降低主频电脑唤醒usb设备退出低功耗进入STOP模式 总结 需求 最近在同客户做…

【Python 随练】寻找完数

题目: 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如 61+2+3.编程找出 1000 以内的所有完数。 简介: 在本篇博客中,我们将解决一个数学问题:如何找出 1000 以内的所有…

Stable diffusion WebUI txt2img使用教学

本篇文章将深入探讨如何在Stable Diffusion WebUI上进行各项参数的调整。将以txt2img为主要讨论对象,探讨诸如基本设定Sampling method以及CFG scale等参数的调整,以及这些参数之间的相互影响。 对于还未安装Stable Diffusion WebUI的小伙伴&#xff0c…

httpd的安装和mysql数据库的安装方法

目录 一 安装httpd 1.下载httpd包模块apr和apr-u到opt目录 2. 解包 3. 把apr和apr-u包放在http的第三方模块scrilb目录中 4.进入httpd包的安装目录并安装依赖环境和进行编译安装 5. make -j 2 && make install 编译并安装 6.优化配置文件 7. 把httpd服务放在sy…

智能文档图像处理技术:解决大数据时代文档图像处理难题

智能文档图像处理技术:解决大数据时代文档图像处理难题 0. 前言1. 智能文档处理1.1 智能文档处理简介1.2 智能文档处理应用 2. VALSE 视觉与学习青年学者研讨会2.1 VALSE 20232.2 合合信息亮相 VALSE 2023 3. 版面分析技术3.1 版面分析3.2 文档还原 4. 其他相关智能…

Gamma:强大的AI制作PPT神器,用完再也回不去了!

看过许多 AI 制作 PPT 软件,最终还是被 Gamma 惊艳到。 Gamma 是一款基于人工智能技术的 PPT 制作工具,可以帮助用户轻松制作高质量的 PPT 演示文稿。 痛点解决 相比传统制作 PPT 方式,Gamma 可以解决哪些如下 7 个痛点: 一句话…

2016年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2016年1月真题: 四、写作:第56~57小题,共65 分。其中论证有效性分析30 分,论说文35分。 56、论证有效性分析: 分析下述论证中存在的缺陷和漏洞,选择若干要点,写一篇600字左右的文章&#xff0…

2013年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2013年1月真题: 四、写作:第 56~57小题,共65分。其中论证有效性分析30 分,论说文35 分。 56、论证有效性分析: 分析下述论证中存在的缺陷和漏洞,选择若干要点,写一篇600 字左右的文章,对该论证的有效性进行分析和评论…