MySQL索引事务基础

目录

1. 索引

1.1索引的概念

1.2索引的特点

1.3 索引的使用场景

 1.4索引的使用

1.4.1查看索引

1.4.2创建索引

 1.4.3删除索引

 1.5索引保存的数据结构

2.事务

2.1经典例子

2.2事务的概念

2.3事务的使用

2.4事务的4个核心特性

2.5事务的并发问题

2.5.1脏读

2.5.2不可重复读

2.5.3幻读


1. 索引

1.1索引的概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。

1.2索引的特点

(1)加快查询的速度。

(2)索引自身也是数据结构,也需要存储空间。

(3)当我们需要进行新增,删除,修改时,索引也需要更新(额外的开销)。

1.3 索引的使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
1.数据量较大,且经常对这些列进行条件查询。
2.该数据库表的插入操作,及对这些列的修改操作频率较低。
3.有足够大的磁盘空间,因为索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

 1.4索引的使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。

使用博主已经建立好的student表。

1.4.1查看索引

语法:

show index from 表名;

查看某个表是否有索引,以及有几个索引。

展示:

显示指定表中所有索引的详细信息

包括索引名称(Key_name)、索引列(Column_name)、是否是唯一索引(Non_unique)、排序方式(Collation)、索引的基数(Cardinality)等。

1.4.2创建索引

对于非主键、非唯一约束、非外键的字段,可以创建普通索引,普通索引是最常见的索引类型,用于加速对表中数据的查询。

语法:

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

意思是:在那个表的那给字段上添加索引。

展示:

 1.4.3删除索引

语法:

drop index 索引名 on 表名;

展示:

 

 1.5索引保存的数据结构

索引保存的数据结构主要为B+树

B+树的特点:

(1)为N叉二叉树,每个节点有n个key,n个key划分出n个区间。

(2)每个节点的n个key中,会存在最大(小)值。

(3)每个节点的key,都会在子树中重复出现。

(4)叶子节点之间使用链式结构相连。

结构如下:

是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率高。

 为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?

hash:虽然可以快速定位,但是没有顺序,IO复杂度高。
二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代高。
红黑树:树的高度随着数据量增加而增加,IO代价高。

 使用B+树的好处:

(1)所有数据都包含在叶子节点这一层中(数据全集数)进行范围查询时,只要找到对应初始位置,之后沿链表遍历即可。

(2)查询时间稳定。查询任意一个元素,都要从根节点查询到子节点。(稳定比单纯的快更有用)

(3)叶子节点这一层是数据全集数,故只存叶子节点在数据行,其他节点可以在缓存区。


2.事务

2.1经典例子

准备测试表:
drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar ( 20 ) comment ' 账户名称 ' ,
money decimal ( 11 , 2 ) comment ' 金额 '
);
insert into accout(name, money) values
( ' 阿里巴巴 ' , 5000 ),
( ' 四十大盗 ' , 1000 );

比如说,四十大盗把从阿里巴巴的账户上偷盗了2000 

--阿里巴巴账户减少2000
update accout set money=money- 2000 where name = ' 阿里巴巴 ' ;
-- 四十大盗账户增加 2000
update accout set money=money+ 2000 where name = ' 四十大盗 ' ;  
假如在执行以上第一句 SQL 时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少 2000 ,但是 四十大盗的账户上就没有了增加的金额。
解决方案:使用事务来控制,保证以上两句 SQL 要么全部执行成功,要么全部执行失败。

 

2.2事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元, 要么全部成功,要么全部失败 。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
对“要么全部失败”的解释:其实语句都执行了,只不过是复原到最初。

2.3事务的使用

1 )开启事务: start transaction;
(2)执行多条 SQL 语句
3 )回滚或提交: rollback/commit;

commit会提交事务,并使已对数据库进行的所有修改成为永久性的; 

rollback会结束用户的事务,并撤销正在进行的所有未提交的修改;

只要没有commit,数据库就可以rollback复原到开始。 

 举例:

start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

2.4事务的4个核心特性

(1)原子性:通过事务把多个操作打包在一起。

(2)一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

(3)事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

(4)隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

2.5事务的并发问题

2.5.1脏读

概念:一个事务读到另一个事务还没有提交的数据

案例:

事务A修改了原来的数据但未提交,事务B读了事务A修改的数据提交了,但事务A进行了回滚,事务B就读了假数据。

解决:给操作加锁(在放锁之前不可访问),也就是写时不让读,写完才让读。

2.5.2不可重复读

概念:一个事务先后读取相同的数据,但两次读取的数据不同。

图示:

解决:给读操作也加锁,也就是读的时候也不让写。

2.5.3幻读

概念:一个事务按照条件查询时,此时无对应的数据行,但插入时又发现数据已经存在。

图示: 

解决:串行化,不再进行任何并发。

2.6事务隔离级别

事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

(1)未提交(Read uncommitted)

并发程度最高,隔离程度最低,效果最高,数据最不靠谱。可能出现脏读,不可重复读,幻读。

(2)读提交(read committed)

相当给写操作加锁,可能出现不可重复读,幻读。

(3)可重复读(repeatable read)

相当给写和读操作都加锁,可能出现幻读。

(4)串行化(Serializable)

并发程度最低,隔离程度最高,效果最低,数据最靠谱。 


都看到这了,不如关注一下,给个免费的赞 


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

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

相关文章

Python + Docker 还是 Rust + WebAssembly?

在不断发展的技术世界中,由大语言模型驱动的应用程序,通常被称为“LLM 应用”,已成为各种行业技术创新背后的驱动力。随着这些应用程序的普及,用户需求的大量涌入对底层基础设施的性能、安全性和可靠性提出了新的挑战。 Python 和…

Java项目如何打包成Jar(最简单)

最简单的办法,使用Maven插件(idea自带) 1.选择需要打包的mudule,点击idea右侧的maven插件 2.clean操作 3.选择需要的其他mudule,进行install操作(如果有) 4.再次选择需要打包的module&#…

Python----类对象和实例对象

目录 一.类和类的实例 二.类属性和实例属性 三.私有属性和公有属性 四.静态方法和类方法 五.__init__方法,__new__方法和__del__方法: 六.私有方法和公有方法 七.方法的重载 八.方法的继承 九.方法的重写 十.对象的特殊方法 十一.对象的引用&a…

基于命令行模式设计退款请求处理

前言 这篇文章的业务背景是基于我的另一篇文章: 对接苹果支付退款退单接口-CSDN博客 然后就是说设计模式是很开放的东西,可能我觉得合适,你可能觉得不合适,这里只是做下讨论,没有一定要各位同意的意思.... 相关图文件 这里我先把相关的图文件放上来,可能看着会比较清晰点 代码逻…

Web服务器(go net/http) 处理Get、Post请求

大家好 我是寸铁👊 总结了一篇Go Web服务器(go net/http) 处理Get、Post请求的文章✨ 喜欢的小伙伴可以点点关注 💝 前言 go http请求如何编写简单的函数去拿到前端的请求(Get和Post) 服务器(后端)接收到请求后,又是怎么处理请求&#xff0c…

【网络奇缘】- 计算机网络|分层结构|ISO模型

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分层结构 OSI参考模型 OSI模型起源 失败原因: OSI模型组成 协议的作用 📝全文…

二十四、RestClient操作文档

目录 一、新增文档 1、编写测试代码 二、查询文档 1、编写测试代码 三、删除文档 1、编写测试代码 四、修改文档 1、编写测试代码 五、批量导入文档 批量查询 一、新增文档 1、编写测试代码 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…

【栈】不同字符的最小子序列

题目: /*** 思路:栈,使用数组记录每个字母出现的次数,再用一个数组标记字符是否在栈中* 遍历栈,存储字符时比较栈顶字符,若小于栈顶字符并且后面有重复的字符则* 栈顶元素出栈,否则入栈。** au…

PS 注释工具 基础使用方法讲解

好 上文PS 颜色取样器&标尺工具 基本使用讲解中 我们讲了 颜色取样器和标尺工具的基本用法 下面我们来看一下 注释工具 这个 主要是后面 比较大的作品 可能不是我们一个人取设计 团队作图 就需要用到它 选择 注释工具 后 我们随便点击图像任何一个位置 右侧就会出现一个输…

gitlab各版本安装注意点:

研发团队在安装gitlab各版本过程中可能遇到各种问题,为了后续容易查看特将我们在实践过程中遇到的各类问题要点总结如下: gitlab 10.8.3 (564c342)安装 centos Linux yum安装网址查找网址:gitlab/gitlab-ce - Results for gitla…

黑马点评12-实现好友关注/取关功能,查看好友共同关注列表

好友关注 数据模型 数据库中的tb_follow记录博主与粉丝的关系 tb_follow表对应的实体类 Data EqualsAndHashCode(callSuper false) Accessors(chain true) TableName("tb_follow") public class Follow implements Serializable {private static final long ser…

栈和队列的OJ题--12.括号匹配

12.括号匹配 20. 有效的括号 - 力扣(LeetCode) 解题思路:该题比较简单,是对栈特性很好的应用,具体操作如下:循环遍历String中的字符,逐个取到每个括号,如果该括号是:1. …

Git工作流和Commit规范

Git大家都非常熟悉了,就不做过多介绍,但是如何用好Git、如何进行合理的分支开发、Merge你是否有一个规范流程呢?💤 不论是一个团队一起开发一个项目,还是自己独立开发一个项目,都少不了要和Git打交道&…

紫光展锐V8821荣获“中国芯”重大创新突破产品奖

近日,“中国芯”优秀产品评选落下帷幕,紫光展锐首颗5G IoT-NTN卫星通信SoC芯片V8821凭借在卫星通信前沿领域的技术创新,从285家芯片企业、398款芯片产品中脱颖而出,荣获第十八届“中国芯”年度重大创新突破产品奖。 “中国芯”优…

ReentrantLock源码解析

ReentrantLock源码解析 文章目录 ReentrantLock源码解析一、ReentrantLock二、ReentrantLock 的 Sync、FairSync、NonfairSync2.1 Sync、FairSync、NonfairSync2.2 NonfairSync 下的 tryAcquire2.3 FairSync下的 tryAcquire2.4 tryRelease 三、lock.lock()3.1 NonfairSync.lock…

4.常见面试题--操作系统

特点:并发性、共享性、虚拟性、异步性。 Windows 和 Linux 内核差异 对于内核的架构⼀般有这三种类型: ● 宏内核,包含多个模块,整个内核像⼀个完整的程序; ● 微内核,有⼀个最⼩版本的内核&#xff0…

名字大却不中用的AI大模型,名不副实

这两天 OpenAI 团队( ChatGPT 公司)的戏比较多,两三天的功夫,剧情发展都超出了 OpenAI 首席科学家的预期,目前来看,微软还是最大的赢家。这是个引子,这个话题,网络上早已传烂了&…

云安全之盾:ZStack 云主机安全防护解决方案全方位保护云环境

随着云计算的蓬勃发展,网络威胁愈发复杂,涵盖了从勒索病毒到APT攻击的各种威胁类型。在这一风云变幻的网络安全环境下,云主机安全不再仅仅是一个选项,它是信息系统安全的核心要素。云轴科技ZStack 云主机安全防护解决方案是为了满…

6.3.WebRTC中的SDP类的结构

在上节课中呢,我向你介绍了sdp协议, 那这节课呢,我们再来看看web rtc中。是如何存储sdp的?也就是sdp的类结构,那在此之前呢?我们先对sdp的内容啊,做一下分类。因为在上节课中呢,虽然…

Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制

目录 序言:第三方库及所需材料函数模块介绍分词词频统计条形图绘制词云绘制主函数 效果预览全部代码 序言:第三方库及所需材料 编程语言:Python3.9。 编程环境:Anaconda3,Spyder5。 使用到的主要第三方库:…