数据库基础之——索引事务

news2024/11/26 10:51:49

索引(index|key) 
 

1 概念

是数据库内部维护的一套数据结构,专门用于搜索的数据结构。目标就是提升搜索速度(性能)!
数据存储的数据主要保存在硬盘上,维护的索引数据结构同样也保存在硬盘上。(硬盘上的数据,能够持久性的保存,断电后数据依旧存在)

2 索引分类

索引的分类,由于存在不同的分类标准,因此索引分类比较乱。以下介绍几种常用的索引:

(1)使用场景(建索引的时候)

  • 主键索引(primary):一个表中,用来区分记录,永远不重复,不为null
  • 唯一键(unique):唯一不重复,可以为null
  • 普通索引(index/key):提供索引,没有其他约束作用,单纯为了提高查询效率
  • 全文索引(full text):搜索场景,提供几个关键词,查找哪些记录中包含这些关键词。目前多被搜索引擎替代
  • 空间索引(spacial):高德地图、百度地图等附近空间中搜索

(2)实现原理角度

首先回顾一下搜索专用的数据结构/算法。

1. 数组上遍历搜索。 O(n),只适用于n比较小的时候(n<1w)

2. 有序树上的二分搜索 。适用于n相对比较大,同时数据集基本不变的情况。

3. 搜索树(平衡搜索树)。二叉平衡搜索树(AVL树、红黑树)、B-树系列(多叉平衡搜索树)B+树、R-树系列

4. 哈希表

5. 跳表

接下来整理适用于索引的结构:

  • B+树索引:一般提供索引,没有特别声明,都是B+树索引
  • 哈希索引:只有少数搜索引擎支持
  • R-树索引:只有少数搜索引擎支持

我们接下来主要进行讨论的是InnoDB引擎下的B+树/普通索引/二级索引,其主要目的为提升查询效率!

2.1 什么情况下考虑添加索引?

1. 数据量大到一定程度!O(n)远大于O(log(n))

2. 数据查询的次数远多于数据的修改次数(包含插入/删除/更新)

2.2 索引的hit(命中)和miss的问题。

即如何使用,可以让数据库更容易去使用索引?(属于数据库优化范畴)

一张表中,命中索引被称为 hit,有索引但未命中被称为 miss

(1)在使用索引的时候,只有针对指定的字段作为条件,才能用上索引。

(2)好的索引能带来数据的区分度。

(3)order by也会影响MySQL是否决定使用索引。

(4)聚簇索引(clustered index)和二级索引(secondary index)

MySQL存储引擎:不同存储引擎,具体保存数据的方式不同,带来的特性也不同。

聚簇和二级索引是只针对于MySQL InnoDB引擎下专有的概念。 InnoDB引擎是MySQL自5.5之后的默认存储引擎。

通过一个B+树来保存数据记录本身。key是主键,value是整条记录。可以看做索引,被称为聚簇索引。   在InnoDB引擎下,主键索引就是聚簇索引。

  

 idx_name也是B+树,key是姓名(在姓名上建的索引),value是主键的列表。

2.3 explain命令

通过 explain 命令可以判断是否命中索引,将 explain 命令加载 select 命令前即可

只会将执行计划列出来,不会真正去执行了搜索。

事务(Transaction)

1. 概念

  • 事务这个词的含义很广泛,并不一定特指数据库中的事务
  • 在开发者看来,一个不可再分的业务动作就是一个事务,这个动作最终表达为一条或者多条 SQL 语句

2. RDBMS事务的4大特性ACID

2.1 原子性(Atomic)

业务动作对应的 SQL 应该是看作一个整体,不可再分的。即:一个事务的执行结果,要么SQL全部成功;要么SQL全部失败。

2.2 持久性(Durability)

持续性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变是永久性的。

2.3 隔离性(Isolation)

最理想的隔离性是,业务方之间感受不到相互的存在,每个业务方都隔离在一个密闭空间中,相互不受影响。

实际上,如果要追求真正的隔离性,就要以牺牲并发性为代价的,所以 SQL 标准制定了隔离级别。

2.4 一致性(Consistency)

一致性是核心,是最终目的!!!属于开发人员+RDBMS(关系数据库管理系统)共同的职责,其余三个特性都为其服务。

针对不同的业务,对数据都有一套约束,这个约束不能被破坏,否则就得认为数据损坏了。

数据库场景下,事务可以分为隐式事务(一条SQL组成)和显式事务(多条SQL组成)。

3. 如何操作事务

3.1 SQL 操作事务

  • begin/start transaction:标志开启一个新的事务
  • rollback:回滚当前事务,如果事务中的任何一条语句失败,那么这个事务中的所有更改都会撤销
  • commit:提交事务,代表事务提交,对事务的操作只有commit才会生效

举例:

begin;
update books set current=current-1 where bid=4;
insert into records(uid,bid,borrowed_at) values(2,4,'2022-12-27 11:34:18';
commit;-- 提交,修改会生效
rollback;-- 回滚,修改不会生效

3.2 JDBC操作事务

在使用 JDBC 时,Connection 下有一个 autocommit 属性,会使事务自动提交,默认情况下,此属性值是 true。开启状态下,每个SQL各自是一个整体,每条SQL都可以看做是一个独立的事务(隐式事务)。

因此,需要调整connection对象的autoCommit属性从true-->false,将多条SQL在同一个事务中。

修改之后,不会自动提交,需要用到Connection下的方法:commit和rollback来手动提交和失败。

Connection 创建-->c.setAutoCommit(false)-->N多条SQL-->c.commit()/c.rollback();

4. 隔离级别

理想情况下,应该同时使用RDBMS的用户之间互相不影响,但是基本上做不到,或者说如果真的这样执行,性能非常差,只能串行去执行。

串行执行期间会因为顺序发生诸多问题,因此,现实生活中,做了一些妥协,把SQL92标准把隔离性做了隔离级别的区分,供RDBMS根据自己的实际情况进行选择。

读未提交(read uncommitted)

读已提交(read committed)

可重复读(repeated read)

快照读(snapshot read)

串行化(serializable)

4.1 读未提交

多个同时执行的事务,可以读取到其他事务处于未提交时所做的数据修改,可以认为完全没有隔离性,在此隔离级别下会产生副作用——脏读、不可重复读、幻读

脏读:读取到了脏数据,读到了其他事物没有提交的数据修改,其这段数据随时都可能回滚,从而破坏一致性。(看到了CSDN别人草稿箱的东西)

不可重复读发生在读未提交这种前提下,在同一个事务中,可能出现多次读取同一份数据,但是最终得到的结果不同(有可能读到别的事务已经提交的修改数据)。

 4.2 读已提交

一个事务可以看到同时间其他事务提交之后的修改数据。

“读已提交”隔离级别中避免了脏读,但是不可避免 不可重复读和幻读

4.3 可重复读

保证了在一次事务中(无提交和回滚),读取到的同一块数据无论何时的值都保持一致,即使别的任务对这块数据做了修改,也不会产生影响。

传统意义上的可重复读避免了脏读和不可重复读,但是仍然避免不幻读

幻读:本事务修改了表中的数据,但是在本事务提交之前表中被另一个事务插入了一条数据并且提交了,这样就会导致本数据会看到一条突然出现的 “ 幽灵般的 ” 数据。

出现幻读的原因是:可重复读只针对表中已有的数据做保护,对新添加的数据不做保护

 4.4 快照读

快照读其实不是标准中存在的隔离级别,快照读连幻读的副作用都没有,目前来说基本没有副作用MySQL 中的 “ 可重复读 ” 可以看作实际上的 “ 快照读 ”,MySQL 默认情况下的隔离级别就是可重复读

4.5 可串行化

微观视角下,每个事务必须排好队,一次只执行一条事务,每条事务之间完全隔离;宏观视角下,仍然看作 “ 同时进行 ”,但是并发性(性能)差。

MyISAM和InnoDB的区别

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

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

相关文章

动手学DL——深度学习预备知识随笔【深度学习】【PyTorch】

文章目录 2、预备知识2.1、数据操作2.2、线性代数&矩阵计算2.3、导数2.4、基础优化方法 2、预备知识 2.1、数据操作 batch&#xff1a;以图片数据为例&#xff0c;一次读入的图片数量。 小批量样本可以充分利用GPU进行并行计算提高计算效率。 数据访问 数组&#xff1a;np…

mfc100u.dll丢失的4种解决方法分享,快速修复mfc100u.dll文件

在现代数字化时代&#xff0c;计算机已经成为了我们生活和工作的不可或缺的一部分。然而&#xff0c;随着软件的不断发展和更新&#xff0c;有时我们可能会遇到一些令人头疼的问题&#xff0c;例如MFC100U.DLL文件的丢失。当你第一次看到这个错误提示时&#xff0c;估计是一脸懵…

学好Elasticsearch系列-核心概念

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 节点角色master&#xff1a;候选节点data&#xff1a;数据节点Ingest&#xff1a;预处理节点ml&#xff1a;机器学习节点remote_ cluster_ client&#xff1a;候选客户端节点transform&#xff1a;…

2022 China Open Source Report

| 翻译&#xff1a;黄绍雅、岳扬、刘文涛、李思颖 | 编辑&#xff1a;胡欣元 | 设计&#xff1a;胡欣元 As 2022 finally came to an end, we also emerged from the challenging years of the three-year-long COVID pandemic. The new edition of the "China Open Sourc…

【多选框、表格全选】element el-checkbox、el-table

话不多说 先看效果&#xff1a; 多选框&#xff1a; 表格全选&#xff1a; <template><div><div class"titleLabel"><div class"lineStyle"></div>统计部门</div><div style"display: flex"><e…

服务网格简介:探索现代微服务架构中的服务网格概念和价值

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Tiktok最全客户开发以及运营攻略,建议收藏

Tiktok最近很多粉丝朋友问我要怎么做&#xff0c;今天就来分享一下如何利用Tiktok开发客户以及运营思路&#xff0c;文章略长&#xff0c;需要安装包看文末&#xff0c;喜欢的点赞加关注。 一、外贸企业为什么要做Tiktok‍ TikTok作为一个全球范围内流行的短视频平台&#xf…

Django3 模糊查询/filters.SearchFilter的使用,基于viewsets.ModelViewSet

背景描述 模型 from django.db import modelsfrom interfaces.validate import validate_include from testcases.models import Testcases from utils.base_models import BaseModel from utils.pure_validator import JSONValidatorclass Interfaces(BaseModel):id models…

嵌入式Linux驱动开发——常见框架梳理

前言 本文主要介绍了Linux驱动开发中一些常用的驱动框架&#xff0c;platform、input、iic、spi等&#xff0c;硬件平台使用的是正点原子的imx6ull开发板。 一&#xff1a;Pinctrl子系统、Gpio子系统 不管什么框架最后都是要追溯到配置IO的电气属性和复用功能 如果要使用外部…

一起学数据结构(1)——复杂度

目录 1. 时间复杂度&#xff1a; 1.1 时间复杂度的概念&#xff1a; 1.2 时间复杂度的表示及计算&#xff1a; 1.3 较为复杂的时间复杂度的计算&#xff1a; 2. 空间复杂度&#xff1a; 2.1 空间复杂度的概念&#xff1a; 2.2 空间复杂度的计算&#xff1a; 1. 时间复杂度…

Kubernetes 简介:容器编排与集群管理的进化

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Mybatis-plus从入门到精通

1、什么是MyBatis-Plus MyBatis-Plus&#xff08;简称MP&#xff09;是一个基于MyBatis的增强工具&#xff0c;在MyBatis的基础上对其进行扩展&#xff0c;用于简化MyBatis操作&#xff0c;提高开发效率。它继承了MyBatis原生的所有特性&#xff0c;并且添加了一些额外的功能&…

《TCP IP网络编程》第十章

第 10 章 多进程服务器端 10.1 进程概念及应用 并发服务端的实现方法&#xff1a; 通过改进服务端&#xff0c;使其同时向所有发起请求的客户端提供服务&#xff0c;以提高平均满意度。而且&#xff0c;网络程序中数据通信时间比 CPU 运算时间占比更大&#xff0c;因此&#…

探析国内数字孪生引擎技术现状

在数字孪生软件来发中&#xff0c;渲染引擎是一个关键点&#xff0c;国内大多数字孪生平台引擎通常使用的是自研的渲染引擎或者采用开源的渲染引擎。下面通过一些常见的渲染引擎在国内数字孪生引擎中的应用带大家了解数字孪生软件开发的方式。 自研渲染引擎&#xff1a;许多数…

CNN + Vision Transformer 结合学习

介绍三篇结合使用CNNTransformer进行学习的论文&#xff1a;CvT&#xff08;ICCV2021&#xff09;&#xff0c;Mobile-Former&#xff08;CVPR2022&#xff09;&#xff0c;SegNetr&#xff08;arXiv2307&#xff09;. CvT: Introducing Convolutions to Vision Transformers, …

利用 trait 实现多态

我在书上看到基于 std::io::Write 的示例&#xff0c;它是一个 trait 类型&#xff0c;内部声明了一些方法。和 go 语言不同&#xff0c;rust 中类型必须明确实现 trait 类型&#xff0c;而 go 语言属于 duck 模式。 std::io::Write下面的例子中调用 write_all 方式来演示&…

标签是系列色并且加粗帆软

标签是系列色并且加粗 function(){return <span style"color:this.color;">FR.contentFormat(this.value, #,##0)</span>;}

UI 自动化的 PageObject 设计模式

目录 前言&#xff1a; 什么是 PageObject 模型&#xff1f; 为什么使用 PageObject 模型&#xff1f; PO 模式优点 PageObject 实践 前言&#xff1a; UI 自动化是一种软件测试方法&#xff0c;它主要用于检查应用程序的用户界面是否符合预期。PageObject 是 UI 自动化中…

AI大模型时代下运维开发探索第一篇:ReAct工程初探

引子 人工智能大模型的出现&#xff0c;已渐渐地影响了我们的日常生活和工作方式。生活中无处不在的AI&#xff0c;使我们的生活变得更加智能和便捷。工作中&#xff0c;AI大模型的高效和精准&#xff0c;极大地提升了我们解决问题的效率。 是的&#xff0c;我们不能忽视AI大…

Delphi 开发者,显示图片请忘掉VCL中的 TImage 吧

目录 序言 使用TImageCollection和TVirtualImageList组件支持高分辨率图像 一、总览 二、使用图像收集组件TImageCollection 2.1 图像收集组件编辑器 2.2 将现有 TImageList 载入 TImageCollection 三、使用Virtual ImageList 组件 3.1 Virtual ImageList Component 编辑…