MYSQL(索引、事务)

news2025/1/16 0:45:42

文章目录

  • 一、索引
  • 二、事务

一、索引

数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系

1. 概述

  • 概念:相当于是一本书的目录,是以‘列’为维度进行建立的
  • 使用场景:如果我们要查询一个表中的某个数据,可以通过遍历来实现,但那样,速度太慢,可以通过给这个表建立索引,来提高查找的速度
  • 使用讲解
    • 按照id这列,建立索引,效果是在数据库上额外搞了一个空间,用来维护一些和id相关的信息,即id为1在哪个位置,id为2在哪个位置,参考目录。后续按照id查找的时候,就不必直接遍历了,而是从索引中进行查询,根据索引就能初步锁定数据所在的位置
    • 注意,这个索引中只能按照id来查询,按照name来查询,不能提高效率,需要给name也建立一个索引才行
  • 作用
    • 优点:提高查询效率
    • 缺点:
      (1)消耗额外的磁盘空间
      (2)可能会拖慢增删改的速度,因为新增不光要往表里写数据,还要增加索引。如果是删和改,如果删或改的条件正好是和索引匹配的,速度能快点,但是如果涉及到了索引列的删除/修改,就需要同时维护索引,就会很慢

2. 使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。因为主键不允许重复,进行插入或修改就需要先查询看是否重复

  • 查看索引:show index from 表名;

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

    • 对于非主键、非唯一约束、非外键的字段,可以创建普通索引
    • 注意这个操作,可能会很危险
      • 如果表是空的,或者表里包含的数据本身就不多,那可以创建。但是如果表非空,并且里面包含了非常多的数据,创建索引,就会引起非常大规模的硬盘IO操作,进一步就会导致数据库被卡死。这就相当于要整理全部的数据。
      • 所以需要提前考虑好,在设计表的阶段,哪些列要索引
  • 删除索引:drop index 索引名 on 表名;

    • 删除索引,只能针对手动创建的索引,自动生成的索引,是不能被删除的
    • 这个操作也十分危险,原因参考创建
  • 如果就是要给一个有着非常多数据的表删除/创建索引

    • 准备一个新的mysql服务器,把表和索引都创建好,然后把数据都导入过来,再把要替换的mysql服务器关闭,最后把新的mysql服务器替换上去就行了
    • (上述操作的原因)数据库服务器往往也不是单台服务器,为了整个系统的可靠性,通常会搞多个mysql服务器节点,这些节点的数据都是一样的,能够提供相同的服务,彼此之间相互独立,其中一个挂了,也不影响整体
  • 关于if、while等语法

    • sql中不建议使用一些其他支持的语法,如条件、循环等,因为该语法较老,且sql写得复杂,不方便调试和优化,实际开发中,去表示这样的更复杂的逻辑往往是使用其他语言+增删改查的方式

3. 底层的数据结构

其实在物理层面上,不需要‘表格’这样的数据结构,直接使用B+树来存储这个表的数据,“表格”只是让用户看起来这像个表格而已

1.概念

mysql的索引的数据结构是什么样的,取决于mysql使用哪个存储引擎

  • 位置

    • 数据库的数据结构是在硬盘上的
    • 内存上的数据结构,对于访问操作来说,是不敏感的(找数据的过程花费时间多,真正访问的操作时间则不多)
    • 硬盘上的数据结构,对于访问操作来说,是比较敏感的,读写一次硬盘,开销远远大于内存
    • 读写一次硬盘,相当于读写1w次内存(大约的约束,内存和内存,硬盘和硬盘之间彼此差异很大)
  • 存储引擎

    • mysql这个程序中,包含很多模块,有负责解析sql的,有负责网络通信的,有负责存储数据的……
    • 负责存储数据的就是存储引擎,本质上就是代码中的一个模块(包含了若干个代码文件、一群具体代码……)
  • mysql支持多种存储方案,Innodb是当下最主流的一种方式

2.分析

索引主要是为了快速查找,这方面红黑树和哈希表效率高。

  • 哈希表:不适合数据库的查询场景(哈希表是通过hash函数来得到一个确定的下标),而且只能做精确查询,没法做模糊查询和范围查询
  • 红黑树:不适合数据库的查询场景,元素有序时,可以处理范围查询,但是在元素个数比较多的时候,红黑树的高度会高,对应的比较次数会多,14个数据就有4层了,而每次比较都在内存上,都要进行硬盘IO操作

B+树

为了解决上述问题,出现了为数据库量身定做的数据结构 ------ B+树

(1)B树
在了解B+树之前,需要先了解下B树(有时写作B-,'-'是连接符,不是减号)

B树本质上,是一个N叉搜索树,一个节点上,可以保存多个key,N个key就能延伸出 N+1 个分叉来,N个key就划分出 N+1 个区间

在这里插入图片描述

  1. 此时每个节点上,都可以保存多个元素了,对于数据库来说,每个节点都需要把数据从硬盘上读取出来,才能进行比较,一个节点有多个key,和一个节点上有一个key,硬盘IO的开销是差不多的,就像下楼倒一个垃圾和倒四个垃圾时间上没太多区别,所以B树的高度是远远小于二叉搜索树的,所以进行查询的时候,硬盘IO的次数会减少
  2. B树查询元素的流程:
    (1)从根节点出发判定要查找的元素是否在根节点上存在
    (2)如果不存在,看这个元素在哪个区间,然后根据这个区间的路线,往下一个节点找,最终找到叶子结点,如果到叶子结点还不存在,那就是真的不存在
  3. 对于B树来说,在进行插入元素和删除元素的时候,会涉及到拆分和合并的操作。
    (1)一个节点,可以存多个key,但是不能无限地存,当存储的key数量达到一定程度的时候,就需要把这个节点给拆分,把这个节点中的一部分以树的子节点的方式重新组织
    (2)这样可以保持当前这个节点中key的数量始终不会太多,能延伸出新的叶子结点
    在这里插入图片描述
    (2)B+树

在这里插入图片描述

【1】B+树也是N叉搜索树,但是N个key分出了N个区间,其中节点上最后一个key就是最大值(也可以取最小值)

【2】父节点的key会在子节点中重复值出现(以最大值的身份),虽然有很多重复元素,看起来浪费了空间,实际上能够达成 **叶子结点这一层,包含了整个数据的全集 **的效果

【3】把叶子结点按照链表这样首尾相连,就可以通过叶子结点之间的连接,快速找到“上一个”,“下一个”元素,这也方便进行范围查询

优势

  • 擅长范围查询
  • 所有的查询操作,最终都会落在叶子节点上,比较次数是均衡的,查询时间是稳定的(有时 ‘稳’ 比 ‘快’ 更重要)
  • 由于叶子节点上是完整的数据全集,因此表的每一行数据的其他列,都可以保存到叶子节点上,而非叶子节点,只存储构建索引的key即可。此时,非叶子节点的存储空间,消耗是非常小的,我们甚至可以在内存中缓存一份。这样,在进行数据查询的时候,就可以通过内存来直接进行比较,从而更快速地找到叶子节点上的记录,也进一步减少硬盘IO的次数

二、事务

  • 使用场景:为了完成某个工作,需要多组sql操作。如A转账给B,那么需要先给A的账户余额减钱,再给B账户加钱
  • 概念:事务的本质,就是为了把多个操作,打包成一个操作来完成(让这多个操作,要么全都能执行成功,要么就一个都不执行,不然就像给A扣钱了,但是没给B加钱)--------- 事务的原子性(这些操作是一个整体,不能再分割了)
    • 这个“一个都不执行”不是真的没执行,执行成不成功得执行了才知道,真正执行时是不知道哪一步操作会失败的,如果执行到中间出错了,就需要自动地把前面已经成功执行的操作还原回最初没有执行的模样
    • 所以本质上,这个“一个都不执行”不是真的没执行,而是看起来就像没执行一样
    • 还原回最初是【回滚】,回滚要把事务中执行的每个操作,都记录下来,如果需要回滚,就直接按照之前操作的“逆操作”来执行就行了
      • 操作的记录是通过特定的日志,来记录的。日志的数据是始终在硬盘上存在的,即使是数据库服务器重启,也能在重启后根据之前没有回滚完的情况继续进行处理
  • 使用
    • 开启事务:start transaction;
    • 执行多条SQL语句
    • 手动触发回滚或提交事务:rollback/commit
      • rollback即是全部失败,commit即是全部成功
      • 一个事务务必要以这两个操作结尾,如果没有这两个操作,接下来的各种sql操作都会被认为是事务的一部分
  • 事务的基本特性
    • 原子性:保证多个操作被打包成一个整体,要么能够全部执行正确,要么就一个都不执行
    • 一致性:事务执行之前,和事物执行之后,数据能对上。这依靠约束和回滚机制来实现
    • 持久性:事务这里执行的各种操作,一旦事务执行成功了,这里的所有操作产生的修改都会写到硬盘中,即持久生效的
    • 隔离性:并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出权衡,“隔离”描述的是同时执行的事务之间相互的影响,隔离性越高,并发性就越低,数据越可靠,性能就越低
      • 并发意思是“同时执行”,数据库是一个客户端服务器结构的程序,既然是服务器,服务器就可以同一时刻给多个客户端提供服务(多个客户端都能给服务器提交事务),如果提交的这两个事务,是修改不同的数据库/表,相互独立那没什么影响。但是如果修改的是一个库/表,顺序的先后会影响最终的执行结果,就会出现问题(脏读、不可重复读、幻读)

1. 脏读

问题描述:读到的数据是一个临时的数据,不是最终的数据,“脏”表示临时的,并非是最终准确结果

解决方法:给写操作加锁,一个事务A写的时候,其他事务B不能读了,直到A事务写完数据,提交事务,其他的事务B才能来读取数据。

效果:引入了写加锁,降低了两个事务之间的并发性,提高了隔离性,降低了效率,使数据更加准确了

2. 不可重复读
问题描述:一个事务中,两次读到的数据不一致(在读的过程中,另一个事务修改了数据)

解决方法:给读操作加锁,别人读的时候,我不能写(除非是写完提交后,别人才能读),此时,别人读的时候,可以再开启一个事务来写,第二个事务提交之前,其他读事务读到的都是旧版本数据,第二个事务提交之后,别人再读读到的就是新版数据了

效果:并发程度又进一步降低了,隔离性提高,执行效率降低,数据更加可靠

3. 幻读
问题描述:一个事务在多次读的过程中,虽然读到的数据的值是一样的,但是结果集是不同的(多出或少出一些记录),可以视为是不可重复读的特殊情况

解决方法:串行化,彻底放弃并发执行事务,所有的事务都是一个挨着一个地串行执行(执行完一个事务,再执行下一个事务)

效果:并发性最低,隔离性最高,效率最低,数据最可靠

4. mysql的四种事务的隔离级别
在这里插入图片描述

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

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

相关文章

管理类联考——逻辑——汇总篇——知识点突破——形式逻辑——性质模态——负命题

角度 角度——汇总 角度——汇总 矛盾关系 性质 (1) 所有的 S 是 P 所有的S是P 所有的S是

Linux中创建文件夹,删除文件夹

Linux中创建目录:mkdir 文件夹, 比如:mkdir test 删除文件夹:rm -rf 文件夹, 比如:rm -rf soft vi强制不保存退出命令:q!

2023开学礼《乡村振兴战略下传统村落文化旅游设计》北农馆藏许少辉八一新书

2023开学礼《乡村振兴战略下传统村落文化旅游设计》北京农学院图书馆许少辉八一新书

HTTP协议详解:互联网通信背后的规则与秘密

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、HTTP协议的基本概念 二、HTTP协议的主要特…

npm报错sass

1.删除node模块 2.删除node-sass: npm uninstall node-sass 3.重新下载对应版本node-sass: npm i node-sass7.0.3(指定版本 控制台报错什么版本就写什么版本) 4.再运行项目 或者

Linux学习之lvm删除

umount /mnt/logicvolumntest卸载挂载。 lvremove /dev/vgname/my_lv可以删除逻辑卷,其中vgname是指定逻辑卷所在的卷组名称,my_lv是逻辑卷的名称。 注意:使用lvremove命令会永久删除逻辑卷和其中的数据,因此请在使用之前进行适当…

【人工智能】—_深度优先搜索、代价一致搜索、深度有限搜索、迭代深度优先搜索、图搜索

【人工智能】无信息搜索—BFS 、代价一致、DFS、深度受限、迭代深入深度优先、图搜索 什么是搜索 搜索问题是指既不能通过数学建模解决,又没有其他算法可以套用或者非遍历所有情况才能得出正确结果。这时就需要采用搜索算法来解决问题。搜索就是一种通过穷举所有解…

【分布式搜索引擎es】

文章目录 数据搜索DSL实现查询文档搜索结果处理 RestClient实现 elasticsearch最擅长的是 搜索和 数据分析。 数据搜索 DSL实现 查询文档 常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all全文检索…

Power BI 连接 MySQL 数据库

Power Query 或 Power BI 只提供了对 SQL Server 的直接连接,而不支持其它数据库的直连。所以第一次连接 MySQL 数据库时,就出现下面的错误信。 这就需要我们自己去安装一个连接器组件。https://downloads.mysql.com/archives/c-net/ 错误解决方案 我一…

【已解决+吐槽】pip install cn2an报错 Cannot uninstall ‘ruamel_yaml‘

我需要用cn2an模块将中文的数字转化为阿拉伯数字,但在安装cn2an的过程中出现了以下报错: 于是乎,我跟着CSDN上诸如此类的教程开始跟nodejs死磕,折腾了大半天,以下是各种尝试。这不是重点,我主要是吐槽&…

Spring MVC 五 - Spring MVC的配置和DispatcherServlet初始化过程

今天的内容是SpringMVC的初始化过程,其实也就是DispatcherServilet的初始化过程。 Special Bean Types DispatcherServlet委托如下一些特殊的bean来处理请求、并渲染正确的返回。这些特殊的bean是Spring MVC框架管理的bean、按照Spring框架的约定处理相关请求&…

传送带下料口堵塞识别检测算法 yolov5

传送带下料口堵塞识别检测算法通过python基于yolov5网络深度学习框架模型,下料口堵塞识别检测算法能够准确判断下料口是否出现堵塞现象,一旦发现下料口堵塞,算法会立即抓拍发出告警信号。Python是一种由Guido van Rossum开发的通用编程语言&a…

《信息系统项目管理师教程(第4版)》第17章 采购管理、合同管理 知识点整理,xmind思维导图

已上传采购管理xmind思维导图,需要的同学可以直接下载哦。 一、规划采购管理 二、实施采购 三、控制采购 四、合同管理 4.1 合同类型 4.2 合同管理过程 签订履行变更档案,合同档案管理是整个合同管理的基础,要求采用电脑打印文本&#xff…

在k8s中用label控制Pod部署到指定的node上

案例-标注k8s-node1是配置了SSD的节点 kubectl label node k8s-node1 disktypessd 查看标记 测试 将pod部署到disktypessd的节点上(这里设置了k8s-node1为ssd) 部署后查看结果-副本全都运行在了k8s-node1上—符合预期 删除标记 kubectl label node k8…

yolov8机器视觉-工业质检

使用训练好的模型进行预测 yolo predict taskdetect model训练好的模型路径 source测试图片文件夹路径 showTrue效果展示 切换模型进行训练(yolov8s) 修改main.py训练参数文件 使用云gpu进行训练,很方便:点击链接转至在线云gpu…

2020年下半年系统架构设计师上午真题及答案解析

1.按照我国著作权法的权利保护期,( )受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 2.假设某计算机的字长为32位,该计算机文件管理系统磁盘空间管理采用位示图记录磁盘的使用情况,若磁盘的容量为3…

python节假日库holidays——查询国家节假日

节假日—计算某天是否为节假日 参考学习: ​ Python holidays模块 ​ Python实现节假日查询 ​ Python怎么获取节假日信息 pip install holidaysimport holidayscn_holidays holidays.CountryHoliday(CN) print(cn_holidays)from datetime import dateif date(…

攻防世界-php_rce

原题 解题思路 thinkPHP.0有漏洞,ThinkPHP5.x rec 漏洞分析与复现。本题就是利用漏洞查找。格式是: ?sindex/\think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]命令。 ls查看文件没什么东西,r…

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下,代码很简单,有几点要注意, 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时,如果需要插入空格,要使用双引号 cmd_ay(1) 0x33; …

【Linux】fork函数的基础知识

文章目录 前言一、fork的返回值二、常见问题 1.为什么fork要给子进程返回0,给父进程返回子进程pid?2.一个函数返回两次值怎么理解? 3.一个变量怎么会有不同的内容? 4.fork函数干了什么? 前言 fork初识: …