MySQL:索引与事物

news2024/10/7 8:21:24

目录

简单了解索引的底层数据结构

索引的概念:

索引存在的意义:

索引的使用:

索引实现的数据结构

B树

B+ 树

B+ 树的特点

B+ 树的优势

事物

事物的概念

事物的使用

事物的四大特性

并发可能引起的问题

脏读问题

不可重复读

幻读

事物的隔离级别


简单了解索引的底层数据结构

索引的概念:

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

 索引就是为了加快查询速度;在之前学习数组的时候,我们就是通过下标直接去查找到该位置的数据,同时我们也可以称之为索引。

索引存在的意义:

索引就是通过特殊的数据结构将数据组织在一起,这样查询时就不需要通过一行行遍历去找目标数据,此时的时间复杂度仍是 O(n) ,数据量少的时候没问题,但是一旦数据量太大,就会造成开销太大;我们这里的 O(n) 每一次都要读取硬盘,它的速率会比读取内存中的数据更慢;所以我们迫切的需要索引来减低访问磁盘的次数。

虽然索引增加了查询的速率,但是减低了 增上改 的效率,并且增加了更多的内存消耗。

索引的使用:

在 MySQL 代码中语法很简单:

创建索引:
create index 索引名 on 表名(字段名);
查看索引:

show index from 表名;

删除索引:

drop index 索引名 on 表名;

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间。

当面对数据量大时去创建一个索引,系统为了创建这个索引而消耗过多的资源,导致机器无法正常工作;所以,索引在实际开发中并不会频繁使用。

对于索引的使用不是我们想要讨论的课题,我们学习索引更主要的是想了解索引底层的数据结构。

索引实现的数据结构

我们知道索引主要是增加查询效率的,我们之前学过两个主要用于查询的数据结构。

一个是二叉搜索树,一个是哈希表

那么索引是什么呢?

先来知道为什么二叉搜索数和哈希表不能用来创建索引:

  1. 二叉搜索树:二叉搜索树在极端情况(单分支)下树的高度非常的高,那么此时的查询速率就非常低效
  2. 哈希表:哈希表的实现原理是计算哈希值用来存放数据,而对于相邻的数据之前是无法比较的

那么我们在二叉搜索树的基础上就提出了B树;

而B+ 树又是建立在B树的基础上,B树又叫 B - 树(不是B减树,是B 杠 树),是为索引量身定制的数据结构。

我们来简单认识一下B树和B+树。

B树

B树是棵N叉搜索树,每个节点具有多个key值,如图:

 有 n 个 key 就将其分为 n + 1 个子节点,每个分组如下图:

 当节点中的子树多,节点上保存的key就多,意味着同样key的个数的前提下B树的高度要远低于二叉搜索树;

树的高度越高,进行查询的时候,磁盘访问次数就越多!!!

B+ 树

B+ 又在B树的基础上作出改进( 树也是个N叉搜索树):

画图演示:

这样同样一棵树我们却只分为了 3 个域:

  我们划分出的三个域不仅存了规定的值,并且还保留了关键的 key 。

这里的 50 是整个树中最大的值,该树中不可能出现大于50 的值。

我们再划分一次:

 划分结束后类似于链表一样将其链接起来,这样整棵树的叶子节点包含了所有的数据,所有非叶子节点的 key 都出现在了叶子节点中。

这种‘链表’就是mysql组织数据的形式,当你看到一张表的时候,
实际上这个表不一定就是按照‘表格’这样的数据结构在硬盘上组织的,也有可以是按照这种书的结构组织的;(具体是那种哪种结构,取决于你表中的索引,以及数据库使用了哪种存储引擎)

B+ 树的特点

  1. 每个节点可以存在 n 个 key ,n 个 key 划分出 n 个子节点(B树的特点是划分出 n + 1 个子节点)。
  2. 每个 key 都会出现在叶子节点中,同时也是叶子节点中的最大值。
  3. B+ 树的叶子节点是首尾相连的,类似于一个链表
  4. 由于叶子节点是个完整的数据集合,只在叶子节点中存储数据表中每一行的数据,而非叶子节点只存 key 本身即可。

具体解释以下 第四点:

我们设 id 为索引,那我们存储的值就是 id,在存数据时,不会将整个集合中的数据都存入,只存入一个id,其余的仍然保存在硬盘中,有需要的时候在去硬盘中取;为什么要怎么设计呢?因为内存空间是有序的:

  

B+ 树的优势

  1.  每个节点存储多个 key ,最终会使树相对较矮,这样在查询的时候就减少了IO(输入输出)访问次数(这里IO特指的是硬盘的访问)
  2. 最后所有的查询都会落到叶子节点上,这样无论查询多少次都可以保证查询效率是同样的,保证了稳定性;(稳定性对于程序员对这个树的评估更加准确)
  3. B+ 树的所有叶子节点构成链表,因此方便了进行范围查询(比如查询学生 id 在27 ~ 36之前的就非常快 )
  4. 由于数据都存在叶子节点上,非叶子节点只存在key,导致非叶子节点所占的内存是非常小的,这些非叶子节点就可以在内存缓存或者是内存换中的一部分,这样就进一步减少了IO访问!

 至于B 树和B+ 树的代码就放在数据结构进阶的部分再继续!!!

事物

事物的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

为什么要有事物这个概念

在很多年前,那个时候还没有微信转账,主要是靠银行卡之间进行转账,有时候会发生很多问题,比如:转账以后,另一方没有收到!!!

又比如,现在网传,台湾那边充话费需要半个小时才能到账!

有了事物,我们这一组操作,要么一起成功,要么一起失败。大大的提高了效率;

事物存在的意义就是将多个sql语句打成一个包,要么包内全部执行成功,要么包内全部执行不成功,不存在中间状态!

事物的使用

sql执行过程:

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

说明:rollback即是全部失败,commit即是全部成功。

举例 :

jerry 的账户原来有10000元,而tom 只有5000元,jerry 给 tom 转账 1000后的结果: 

如果执行失败,并非是没有执行,而是执行以后将数据恢复未执行之前的状态,这个恢复的过程称之为 " 回滚 " (rollback)

例如上面这个例子,再jerry 转账过后系统崩了,但是钱却扣了;在下次重新启动系统后,就会把钱加回来!

进行回滚的时候咋知道恢复成什么样子呢?数据库中有个专门来记录事物的日志。

因此,使用事物的时候,执行sql语句开销是非常大的。

事物使用起来非常简单,但是理解起来有些难!

事物的四大特性

数据库的事物有四大关键特性(这也是面试中经常问的【八股文】)

  1. 原子性(事务中的每个sql语句都是最小的,不可再分的)
  2. 一致性(事物执行前后都是靠谱的)
  3. 持久性(事物执行的内容是存在硬盘上的,即使机器重启也不会丢失,因此数据是可持久的)
  4. 隔离性(为了解决“并发”执行事物,引起的问题)

隔离性这里重点讲解以下:

先来讲讲啥叫并发:

并发就是一个服务器为多个客户端提供服务;

如果并发是操作不同的数据,那么并发并不会造成影响,但是它并非都是操作不同数据,存在操作同一数据的情况。

例如上面的案例,假设多个用户对一个账号进行转账操作,那就会把数据搞乱。

事物的隔离性就体现在即使是并发事物操作也不会引发问题!

既然聊到并发,那就来聊聊并发可能引起的问题

并发可能引起的问题

脏读问题

什么叫脏读?

举个贴切的例子:

有一场考试中,隔壁的想抄我的答案,我故意给他看,但是后面我又将答案给改了,那么他看到的数据就是一个 “脏数据”。脏也就是无效的意思。

那么这么解决脏读的问题呢?

很简单,我们在写数据的时候给它进行加锁,mysql引入一个 “写操作加锁” 机制。加锁是会提高耗能的,同时降低了效率,也增加了隔离性。

也就是说我考试的时候不给隔壁的人看。

不可重复读

举例:

还是那一场考试,我们约定好,我写完了给他抄,不故意坑他;在我第一次写完以后(version 1)给他抄了,在抄的过程中我发现自己写错了已一道题,我就又改了(version 2)这个时候他读着读着发现数据不一样了。

这个问题就是不可重复读。

事物1 提交了数据,事物2 开始读取,事物3 又去更新了数据,此时意味着事物在多次读取数据的结果是不一样的(预期应该是一样的)这就是不可重复读。

解决方法呢也是和上面一样加锁,此时给事物 “ 读 ” 加锁   此时又进一步增加了耗能的,同时降低了效率,也进一步增加了隔离性。

幻读

说明:事物A 读取了一次   事物B  对数据进行新增或者删除并提交事物  导致读取数据列表数据多了;此时就叫做幻读。

数据库使用  “ 串行化 ”  的方式来解决此类问题,并且彻底放弃并发处理事务,改用串行的方式一行行处理事物;此时的并发程度是最低的,效率也就最低,但是隔离性确是最高的。

针对上述问题又提出了事物的隔离级别

事物的隔离级别

选用哪种级别,这时mysql内置的机制,可以通过修改mysql配置文件,来设置mysql工作环境。

具体如何使用 以及其代码在后面会写道。

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

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

相关文章

未系安全带识别系统 yolo

未系安全带识别系统通过pythonyolo智能视频分析技术,未系安全带识别算法对画面中高空作业人员未系安全带行为进行监测,未系安全带识别算法监测到人员未穿戴安全带时,立即通知后台人员及时处理触发告警。Yolo算法采用一个单独的CNN模型实现end…

算法24:LeetCode_并查集相关算法

目录 题目一:力扣547题,求省份数量 题目二:岛屿数量 题目三:岛屿数量拓展 什么是并查集,举个简单的例子。学生考试通常会以60分为及格分数,我们将60分及以上的人归类为及格学生,而60分以下归…

mysql学习之数据系统概述

☀️马上要成为打工人,这几天把前面的知识都捡了捡,发现自己对关系数据库这块的学习还有所缺失,于是本章开始学习mysql 这里写目录标题1. 数据库系统的发展1.1 人工管理阶段1.2 文件系统阶段1.3 数据库阶段1.4 大数据阶段2 数据库系统的组成2…

扬帆优配|2600亿汽车巨头闪崩近9%,汽车股惊现“冰火两重天”!

今日早盘,A股全体低开震荡调整,首要股指跌逾1%,科创板体现略强,盘中一度直线拉升翻红,两市一度近4200股下跌。 盘面上,轿车服务、信创、半导体等板块相对强势,轿车整车、超导概念、一体压铸、建…

【MySQL】MySQL的索引

目录 介绍 索引的分类 索引的操作-创建索引-单列索引-普通索引 格式 操作 索引的操作-创建索引-单列索引-唯一索引 索引的操作-创建索引-单列索引-主键索引 索引的操作-创建索引-组合索引 索引的操作-全文索引 索引的操作-空间索引 索引的验证 索引的特点 介绍…

Lazada、Allegro、速卖通测评自养号技术(方法解析)

无论是亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、煤炉、敦煌、雅虎、eBay、TikTok、Newegg、乐天、美客多、阿里国际、沃尔玛、OZON、Joom、Facebook、Coupang、独立站、Cdiscount、Kaufland、DARTY、Allegro、MANO等平台测评自养号对于卖家来说算是一种低成本、高回…

什么?你不知道 ConcurrentHashMap 的 kv 不能为 null?

一、背景 最近设计某个类库时使用了 ConcurrentHashMap 最后遇到了 value 为 null 时报了空指针异常的坑。 本文想探讨下以下几个问题: (1) Map接口的常见子类的 kv 对 null 的支持情况。 (2)为什么 ConcurrentHashM…

Ethercat学习-电机调试问题总结

文章目录问题1:初始化不进入OP状态问题2:PDO通讯数据不对主站硬件:STM32F405LAN8720A主站软件:SOEM 问题1:初始化不进入OP状态 现象描述:主站初始化过程中,打印信息显示状态一直在safe-op&…

多态且原理

多态 文章目录多态多态的定义和条件协变(父类和子类的返回值类型不同)函数隐藏和虚函数重写的比较析构函数的重写关键字final和override抽象类多态的原理单继承和多继承的虚函数表单继承下的虚函数表多继承下的虚函数表多态的定义和条件 定义&#xff1…

Python批量爬取游戏卡牌信息

文章目录前言一、需求二、分析三、处理四、运行结果前言 本系列文章来源于真实的需求本系列文章你来提我来做本系列文章仅供学习参考阅读人群:有Python基础、Scrapy框架基础 一、需求 全站爬取游戏卡牌信息 二、分析 查看网页源代码,图片资源是否存在…

Node.js + MongoDB 搭建博客 -- 登录页面

准备工作 安装Node.js安装express等相关库MongoDB数据库电脑系统:win11 功能分析 搭建一个简单的具有多人注册、登录、发表文章以及登出功能的博客。 设计目标 未登录:主页左侧导航栏显示home、login、register,右侧显示已发表的文章、发…

视觉SLAM14讲第三章习题作业

这是本人的解答,并非官方解答 验证旋转矩阵是正交矩阵 在第44页中,旋转矩阵的引入是这样的: 所以,我们需要验证矩阵 R[e1Te1′e1Te2′e1Te3′e2Te1′e2Te2′e2Te3′e3Te1′e3Te2′e3Te3′]R \begin{bmatrix} e_1^{T}e_1^{}&am…

【Java开发】设计模式 02:工厂模式

1 工厂模式介绍工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使…

Weblogic管理控制台未授权远程命令执行漏洞复现(cve-2020-14882/cve-2020-14883)

目录漏洞描述影响版本漏洞复现权限绕过漏洞远程命令执行声明:本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,本人不承担任何法律及连带责任。 漏洞描述 Weblogic…

CorelDRAW2023最新版新增功能200多个新模板

CorelDRAW是一款平面矢量绘图排版软件,CorelDRAW运用涵盖企业VI设计,广告设计,包装设计,画册设计,海报、招贴设计,UI界面设计,网页设计,书籍装帧设计,插画设计&#xff0…

韩信点兵问题,鸡兔同笼问题,闰年判断问题等,我用Python瞬间搞定(13)

小朋友们好,大朋友们好!我是猫妹,一名爱上Python编程的小学生。欢迎和猫妹一起,趣味学Python。今日主题最近猫妹一直在练习Python编程,有些习题真是经典啊!比如韩信点兵问题,比如鸡兔同笼问题等…

【Linux】线程实例 | 简单线程池

今天来写一个简单版本的线程池 1.啥是线程池 池塘,顾名思义,线程池就是一个有很多线程的容器。 我们只需要把任务交到这个线程的池子里面,其就能帮我们多线程执行任务,计算出结果。 与阻塞队列不同的是,线程池中内有…

代码随想录刷题-数组-螺旋矩阵II

文章目录螺旋矩阵 II习题我的解法别人的解法螺旋矩阵 II 本节对应代码随想录中:代码随想录,讲解视频:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili 习题 题目链接:59. 螺旋矩阵 II - 力扣&#xff0…

将spring boot项目打包成一个可执行的jar包

将spring boot项目打包成一个可执行的jar包&#xff0c;jar包自带了整个运行环境简化配置&#xff0c;可直接运行&#xff0c;本次使用HelloWorld项目演示。 创建Spring Boot项目在pom.xml中导入插件 <build><plugins><plugin><groupId>org.springfr…

计算机网络:移动IP

移动IP相关概念 移动IP技术是移动结点&#xff08;计算机/服务器&#xff09;以固体的网络IP地址&#xff0c;实现跨越不同网段的漫游功能&#xff0c;并保证了基于网络IP的网络权限在漫游中不发生任何改变。移动结点&#xff1a;具有永久IP地址的设备。归属代理&#xff08;本…