目录

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.pswp.cn/news/165089.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/165089.shtml
英文地址,请注明出处:http://en.pswp.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&#…

Vue.observable 是什么

Observable 翻译过来我们可以理解成可观察的 Vue.js2.6 新增 Vue.observable,让一个对象变成响应式数据。Vue 内部会用它来处理 data 函数返回的对象 。 返回的对象可以直接用于渲染函数和计算属性内,并且会在发生变更时触发相应的更新。也可以作为最小化…

Git的指令

Git 各平台安装包下载地址为:http://git-scm.com/downloads Ubuntu Git 安装命令为: $ apt-get install git用户信息 配置个人的用户名称和电子邮件地址: $ git config --global user.name "runoob" $ git config --global user.…

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

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

软件开发模式开源和闭源的优劣之争

开源和闭源,两种截然不同的开发模式,对于大模型的发展有着重要影响。开源让技术共享,吸引了众多人才加入,推动了大模的创新。而闭源则保护了商业利益和技术优势,为大模型的商业应用提供了更好的保障。 开源与闭源软件的…

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

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

sql之left join、right join、inner join的区别

sql之left join、right join、inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下&#xff1…

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

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

【限时免费】20天拿下华为OD笔试之【前缀和】2023B-寻找连续区间【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给定一个含有N个正整数的数组,求出有多少个连续区间(包…

【网络奇缘】- 计算机网络|分层结构|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…

执行shell脚本提示syntax error: unexpected end of file

具体报错如下: ./test.sh: line 36: syntax error: unexpected end of file执行命令时需将test.sh替换为实际的脚本文件名称。 情形一: shell脚本在Windows下编写,上传到Linux上执行,由于 fileformat 类型不同,所以报…

黑马点评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…

代码随想录算法训练营第三十二天| 122 买卖股票的最佳时机 || 55 跳跃游戏 45 跳跃游戏 ||

目录 122 买卖股票的最佳时机 || 55 跳跃游戏 45 跳跃游戏 || 122 买卖股票的最佳时机 || 设置变量now代表此时买入的股票,为赋值为Integer.MAX_VALUE,遍历prices数组,有如下两种情况: 如果比now小说明不能售出,可以…

关于unicloud云对象或云函数获取时间不对的问题

话不多说,直接上代码: function timeWeekFormat() { //定义一个日期对象; var dateTime getOffsetDate(8); //获得系统年份; var year dateTime.getFullYear(); //获得系统月份; var month dateTime.getMonth() 1; //获…

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

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