Mysql----索引与事务

news2024/9/22 22:40:00

1.索引

1.1什么是MYSQL的索引

MySQL官方对于索引的定义:索引是帮助Mysql高效获取数据的数据结构

Mysql在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据,而这种数据结构就是索引。

简单理解为:排好序的可以快速查找数据的数据结构

1.2索引的数据结构

下图是一种可能的二叉树的索引方式

二叉树数据结构的弊端:当极端情况下,数据递增插入时,会一直向右插入,形成链表,查询效率会降低

Mysql中常用的索引数据结构有BTree索引(Myisam普通索引),B+Tree索引(Innodb普通索引),Hash索引(memory存储索引)等等

1.3索引的优势

提高数据检索的效率,降低数据库的IO成本

通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗

1.4索引的劣势

索引实际上也是一张表,保持了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用内存空间的。在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,Mysql不仅要更新数据,还需要保存一下索引文件。每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息

1.5索引使用场景

哪些情况需要创建索引:

1.主键自动建立唯一索引

2.频繁作为查询条件的字段应该创建索引(where后面的语句)

3.查询中与其他表关联的字段,外键关系建立索引

4.多字段查询下倾向创建组合索引

5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

6.查询中统计或者分组字段


哪些情况不推荐建立索引:

1.表记录太少

2.经常增删改的表

3.where条件里用不到的字段不建立索引

1.6索引分类

1.6.1主键索引

1.标准的列设定为主键后,数据库会自动建立主键索引。

2.单独创建和删除主键索引的语法:

创建主键索引的语法:alter table 表名 add primary key (字段);
删除主键索引语法:alter table 表名 drop primary key;

1.6.2唯一索引

1.表中的列创建了唯一约束时,数据库会自动建立唯一索引

2.单独创建和删除唯一索引语法:

创建唯一索引语法:
alter table 表名 add unique 索引名(字段);
或
create unique index 索引名 on 表名(字段);

删除唯一索引语法:
drop index 索引名 on 表名;

 1.6.3单值索引

即一个索引只包含单个列,一个表可以有多个单值索引

1.建表时可以随表一起建立单值索引

2.单独创建和删除单值索引:

创建单值索引:alter table 表名 add index 索引名(字段);
或  
create index 索引名 on 表明(字段);

删除单值索引: drop index 索引名 on 表名;

1.6.4符合索引

即一个索引包含多个列:

1.建表时可以随表一起建立复合索引

2.单独创建和删除复合索引:

创建复合索引:
create index 索引名 on 表名(字段1,字段2);
或
alter table 表名 add index 索引名(字段1,字段2);

删除复合索引:
drop index 索引名 on 表名;

1.6.5创建删除索引演示

代码演示:

1.6.5.1随创建表创建索引
create table customer(
id int(10) auto_increment,
customer_no VARCHAR(20),
customer_name varchar(20),
--主键索引
primary key(id),
--唯一索引
unique idx_customer_no(customer_no),
--单值索引
key idx_customer_name(customer_name),
--复合索引
key idex_customer_no_name(customer_no,customer_name)
)

创建完表后,右键表名,点击设计表,可以看见有一个钥匙,这个钥匙对应id这一列,就代表id这一列是我们的主键,是主键就代表他拥有主键索引

点击索引,名称代表索引的名字,字段表示拥有该索引的字段,索引类型有唯一索引单值索引,复合索引,索引方式是二叉树


1.6.5.2单独创建和删除索引

创建表时,没有索引

create table customer(
id int(10) ,
customer_no VARCHAR(20),
customer_name varchar(20)
)

即没有主键索引,也没有唯一索引,什么索引也没有

四种索引的单独创建和删除:

#创建主键索引
alter table customer add primary key(id);
#删除主键索引
alter table customer drop primary key;

#创建唯一索引
alter table customer add unique idx_customer_no(customer_no);
#删除唯一索引
drop index idx_customer_no on customer;

#创建单值索引
alter table customer add index idx_customer_name(customer_name);
#删除单值索引
drop index idx_customer_name on customer;


#创建复合索引
alter table customer add index idx_customer_no_name(customer_no,customer_name);
#删除复合索引
drop index idx_customer_no_name on customer;

在单独创建唯一索引时,要保证当前表中创建唯一索引的列中的数据是唯一且不为空的

在单独创建唯一索引时,要保证当前表中创建唯一索引的列中的数据是唯一的

2.事务

2.1事务简介

●数据库的事务是一种机制,一个操作序列,包含了一组数据库的操作命令

●事务把所有的命令作为一个整体一起想系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败

●事务是一个不可分割的工作逻辑单元

2.2事务的操作

2.2.1问题场景

场景:

李四向张三借了1000元,李四的钱增加1000,张三的钱减少1000

创建一张表:表中信息包括id,姓名和钱

CREATE table account(
id int primary KEY auto_increment,
name varchar(20) not null,
money decimal(7,2)
);

添加数据:

insert into account(name,money) values('张三',3000);
insert into account(name,money) values('李四',1000);

 此时查询,张三的金额是3000,李四的金额是1000

借钱操作:

张三的金额-1000,李四的金额+1000

UPDATE account set money=money-1000 where name='张三';
UPDATE account set money=money+1000 where name='李四';

此时不管是在当前查询还是新建查询,account表中张三和李四的金额均发生了变化 

当我们将张三的金额恢复到3000,李四的金额恢复到1000后,再执行下面这段代码,会发现只有 张三借给李四钱的操作执行l,其余语句执行失败,这时不管是在当前查询还是新建查询,只有张三的金额变为2000,李四的金额还是1000,这在生活中,钱不翼而飞是不允许的

UPDATE account set money=money-1000 where name='张三';
出错了
UPDATE account set money=money+1000 where name='李四';

2.2.2事务的操作 

 为了解决上述问题,我们就需要用到事务

事务的关键字:

●开启事务:begin;       或者      start  transaction;

●提交事务:commit;

●回滚事务:rollback;

将张三和李四的金额恢复成3000和1000时,当我们开启事务再次执行出错的借钱操作,在当前查询,只有张三的金额变了,而李四的金额没有改变,在新建查询发现张三和李四的金额均没有改变,这是因为开启事务这个操作在没有commit之前都是临时的,只有在当前查询能看到,在其他查询看不到

开启事务之后,执行中出现错误,当前查询中一部分修改了数据,这时我们需要回滚事务,也就是将事务回滚到开启事务之前,将当前查询的数据变为开启事务之前

 但是当我们重复开启多条事务时,再执行回滚事务(rollback)时,这时只会回滚到最近的一条开启事务之前,多运行几次回滚事务,也只会执行一次,也就是不管连续执行多少次回滚事务,他都只会回滚到最近的一条开启事务之前,且只回滚一次,这是因为在开启事务之后再次开启事务,就已经将上次的事务提交了,提交之后就将数据写入硬盘了

在开启事务之后,在第二次开启事务或者提交事务之前,数据都是临时的,没有写入硬盘的,但我们确认事务的数据没问题后,就可以使用commit关键字提交事务了

commit;

 使用commit;提交事务后,不管是当前查询还是新建查询,均可看见修改后的数据

2.3事务的四大特性

●原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败

●一致性(Consistency):事务完成时,必须使所有的数据保存一致状态

●隔离性(Isolation):多个事务之间,操作的可见性

●持久性(Durability):事务一旦提交或回滚,他对数据库中的数据的改变就是永久的

2.4事务补充

在mysql中,事务是默认提交的,当写一条sql语句,mysql会将这条语句当成一条事务,默认将其提交

查看提交方式:

select @@autocommit;

在查看提交方式时,1代表默认提交,0代表手动提交 

修改提交方式:

set @@autocommit=0;

 当提交方式修改为手动提交时,我们在写mysql语句时,就需要多执行一句commit语句

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

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

相关文章

萤石云平台接入SVMSPro平台

萤石云平台接入SVMSPro平台 步骤一:进入萤石云官网:https://open.ys7.com/ ,点右上角的登陆,填写自己的用户名密码; 步骤二:登陆进去后,开发者服务—>我的账号—>应用信息,在…

电气自动化入门07:开关电源、三相异步电动机多地与顺序控制电路

视频链接:3.5 电工知识:三相交流异步电动机多地与顺序控制及开关电源选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p9&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.开关电源功能与选型说明: 2.三相异步电动机…

数据结构与算法之间有何关系?

相信很多人都应该上个《数据结构与算法》这门课吧,而这两个概念也如孪生兄弟一样经常被拿出来一起讨论。那它们究竟是一个什么样子的关系呢? 听到数据结构与算法我第一反应是想到了Pascal 语言之父尼古拉斯沃斯在他的《Algorithms Data Structures Pro…

esp32s3分区表配置及读写

一、分区表介绍 每片 ESP32-S3 的 flash 可以包含多个应用程序,以及多种不同类型的数据(例如校准数据、文件系统数据、参数存储数据等)。因此,在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。 分区表中的每个条目都包括以下…

【d47】【Java】【力扣】997.找到小镇的法官

思路 记录入度和出度 一个人可以连接多个,一个人也可以被多个人连接,就是图的性质 一个人可以信任多人,一个人也可以被多个人信任 统计入度出度, 法官:入度n-1,出度0 其他人:因为被所有其他人信任的 只能…

JS执行机制(同步和异步)

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 异步:在做这件事的同时,你还可以去处理其他事 他们的本质区别:这条流水线上各个流程的执行顺序不同。 同步任务 同步任务都在主线程上执行,形成一个执行栈。 异步…

7、论等保的必要性

数据来源:7.论等保的必要性_哔哩哔哩_bilibili 等级保护必要性 降低信息安全风险 等级保护旨在降低信息安全风险,提高信息系统的安全防护能力。 风险发现与整改 开展等级保护的最重要原因是通过测评工作,发现单位系统内外部的安全风险和脆弱…

【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构

唯有梦想才配让你不安, 唯有行动才能解除你的不安。 --- 卢思浩 --- 从零开始掌握序列化 1 知识回顾2 序列化与编写协议2.1 使用Json进行序列化2.2 编写协议 3 封装IOService4 应用层 --- 网络计算器5 总结 1 知识回顾 上一篇文章我们讲解了协议的本质是双方能够…

【JavaEE】多线程编程引入——认识Thread类

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 引入: 一:Thread类 1:Thread类可以直接调用 2:run方法 &a…

SpringBoot+thymeleaf竞赛报名系统

一、介绍 > 这是一个基于Spring Boot的后台管理系统。 > 使用了Mybatis Plus作为持久层框架,EasyExcel用于Excel操作,Thymeleaf作为前端模板引擎。 > 界面简洁,功能丰富,完成度比较高,适用于JAVA初学者作…

安国U盘量产工具系列下载地址

来源地址(访问需要科学工具):AlcorMP (Последняя версия ALCOR U2 MP v23.08.07.00.H) – [USBDev.ru] 版本列表: AlcorMP(最新版本的 ALCOR U2 MP v23.08.07.00.H) AlcorMP是在Alcor Mic…

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】

SpringBoot项目License证书生成与验证(TrueLicense) 【记录】 在非开源产品、商业软件、收费软件等系统的使用上,需要考虑系统的使用版权问题,不能随便一个人拿去在任何环境都能用。应用部署一般分为两种情况: 应用部署在开发者自己的云服务…

数据集-目标检测系列-火车检测数据集 train >> DataBall

数据集-目标检测系列-火车检测数据集 train >> DataBall 数据集-目标检测系列-火车检测数据集 数据量:1W 想要进一步了解,请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,不断增加…

跟李沐学AI:注意力机制、注意力分数

目录 不随意线索 随意线索 注意力机制 非参注意力池化层 参数化的注意力机制 注意力机制总结 注意力分数 拓展到高维度 加性模型(Additive Attention) 点积注意力机制(Dot Product Attention) 注意力分数总结 不随意线…

vscode 顶部 Command Center,minimap

目录 vscode 顶部 Command Center 设置显示步骤: minimap设置 方法一:使用设置界面 方法二:使用命令面板 方法三:编辑 settings.json 文件 左侧目录树和编辑器字体不一致: vscode 顶部 Command Center Visual Studio Code (VSCode) 中的 Command Center 是一个集中…

240912-设置WSL中的Ollama可在局域网访问

A. 最终效果 B. 设置Ollama(前提) sudo vim /etc/systemd/system/ollama.service[Unit] DescriptionOllama Service Afternetwork-online.target[Service] ExecStart/usr/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 Environme…

Python redis 安装和使用介绍

python redis安装和使用 一、Redis 安装1.1、Windows安装 二、安装 redis 模块二、使用redis 实例1.1、简单使用1.2、连接池1.3、redis 基本命令 String1.3.1、ex - 过期时间(秒)1.3.2、nx - 如果设置为True,则只有name不存在时,当…

fiddler抓包08_抓Android手机请求

课程大纲 手机抓包,电脑端的设置和IOS端相同,设置一次即可,无需重复设置。 前提:电脑和手机连接同一个局域网 土小帽电脑和手机都连了自己的无线网“tuxiaomao”。 Step1. 电脑端设置 ① 打开Fiddler - 开启抓包(F12…

django项目——图片上传到阿里云OSS对象存储

文章目录 实现图片上传到阿里云OSS对象存储1. 创建阿里云OSS对象存储2. 查询获取接口访问key和秘钥3. 安装阿里云的SDK集成到项目中使用3.1 python直接操作oss23.2 django配置自定义文件存储上传文件到oss 实现图片上传到阿里云OSS对象存储 1. 创建阿里云OSS对象存储 开发文档…

重磅!人工智能等级考试来了,考试免费,上海落户可以加分

目录 简要介绍 一、关心的问题 1. 什么是上海市高等学校信息技术水平考试? 2. 考试分几个级别?有哪些科目? 3. 哪些人可以进行报名? 4. 每名学生可以报考几个科目? 5. 有没有考试大纲? 6. 考试是否有…