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.hqwc.cn/news/212236.html

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

相关文章

java--static的应用知识:代码块

1.代码块概述 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类) 2.代码块分为两种: 2.1.静态代码块: ①格式:static{ } ②特点:类加载时自动执行,由于类只会加载一次,所以静态代码块…

数据结构与算法【B树】的Java实现+图解

目录 B树 特性 实现 节点准备 大体框架 实现分裂 实现新增 实现删除 完整代码 B树 也是一种自平衡的树形数据结构,主要用于管理磁盘上的数据管理(减少磁盘IO次数)。而之前说的AVL树与红黑树适合用于内存数据管理。存储一个100w的数…

多数据库使用django-apscheduler时,migrate后并不能生成django_apscheduler_djangojob表的问题

先说一下django-apscheduler定时器的使用过程: django-apscheduler基本使用 1.安装django-apscheduler代码如下(示例): pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代码如下(示例&#xff09…

聚类算法模型的概念、评估及应用

聚类是一种无监督学习方法,其目标是将数据集中的样本分成不同的组别,使得同一组内的样本相似度较高,而不同组之间的样本相似度较低。聚类算法模型通常通过计算样本之间的相似度或距离来实现这一目标。以下是聚类算法模型的概念、评估及应用的…

【HarmonyOS】API6上JS实现视频播放全屏播放时,会回到之前界面

【关键字】 API6 / 视频播放 / 全屏播放异常 【问题现象】 开发者在API6上用JS实现视频播放器点全屏播放后,不是全屏效果,实际效果是变成了横屏并返回到首页。 具体代码实现是参考video媒体组件指南。 【问题分析】 JS实现视频播放器有Codelab代码示…

新品推荐|Si24R03 一款集成2.4G+RISC-V核MCU低功耗SOC芯片

Si24R03是-款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围,集成了13/14/15/16 位精度的ADC、LVD、UART、SPI. I2C、TIMER、 WUP、IWDG、RTC等…

【华为数通HCIP | 网络工程师】821-IGP高频题、易错题之OSPF(2)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

文件名称管理文件:抓关键字归类文件,让文件管理变得简单明了

在当今数字时代,每天都要处理大量的文件,无论是文本、图片、视频还是其他类型的文件。如何有效地管理这些文件,能够迅速找到所需的信息,已经成为了一个重要的问题。文件名称是文件内容的第一反映,也是识别和检索文件的…

Using PeopleCode in Application Engine Programs在应用引擎程序中使用PeopleCode

This section provides an overview of PeopleCode and Application Engine programs and discusses how to: 本节概述了PeopleCode和应用程序引擎程序,并讨论了如何: Decide when to use PeopleCode.决定何时使用PeopleCode。Consider the program environment.考…

【Python】基于非侵入式负荷检测与分解的电力数据挖掘

文章目录 前言一、案例背景二、分析目标三、分析过程四、数据准备4.1 数据探索4.2 缺失值处理 五、属性构造5.1 设备数据5.2 周波数据 六、模型训练七、性能度量文末送书:《Python数据挖掘:入门、进阶与实用案例分析》 前言 本案例将根据已收集到的电力…

Kafka 控制器(controller)

Kafka 控制器(controller) 在kafka集群中 会存在一个或者多个broker(一个服务器就是一个broker),其中有一个broker会被选举为控制器 kafka controller ,负责管理整个集群中所有副本、分区的状态&#xff0…

软件流程设计之事件风暴EventStorming

最近新开了一个公众号,有兴趣可以关注一下。时不时就复活去更新一下。 最近在带几个新员工,新员工是学校刚毕业的,习惯于做一些导师或者师兄师姐们拆解好的任务,有很明确的功能描述,甚至喂饭喂到什么地步呢&#xff0…