【MySQL】mysql索引和事务(面试经典问题)

news2024/11/14 16:23:29

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

mysql索引

代价

查看索引

创建索引

 删除索引

索引背后的数据结构

B树

B+树

B+树与B树的区别

B+树的优势

mysql事务

 事务 涉及的四个核心特性:

隔离性详细解释

脏读

不可重复读

幻读

隔离性的四个级别

read uncommitted 读未提交

read committed  读已提交

repeatable read 可重复读

serializable 串行化


mysql索引

索引 类似于书的 目录,引入 索引 是为了 提高查询的速度

select这样的操作,默认是按照"遍历"的方式来查询,即时间复杂度为O(n),但这里的 读的是硬盘,而在数据结构里的O(n) ,遍历的是内存

代价

  • 引入索引 需要消耗额外的 存储空间
  • 引入索引后,确实能提高 查询的效率 ,但可能会影响 增删改的 效率(有时会 更快,有时会更慢,也或者 没变化)

比如: 通过条件判断 的方式来 删除 delete from student where id = 5; 其中where id=5 背后就有查询操作

索引有利有弊,实际开发中 还是推荐使用 索引

  • 硬盘往往不是主要矛盾
  • 对于增删改查 也不一定都是 负面影响,也可能会 触发一些正面效果
  • 很多业务场景 查询的 频率 要比 增删改 要高很多

查看索引

show index from 表名;

主键自带索引

unique 和 foreign key 也自带索引

创建索引

create index 索引名 on 表名(列名);

创建索引 其实是一个危险操作,针对 空表 或者 表中只有 较少数据(几千,几万...)创建索引 谈不上危险 但是一旦数据量 比较大( 千万级别),此时创建索引操作 可能会触发 大量的硬盘IO,直接把机器卡死了,  所以在 最初建表时 要哪些索引要提前规划好,创建好

 删除索引

drop index 索引名 on 表名;

只能删除 自己创建的索引,不能删除自动生成的  ,删索引也是 危险操作.

索引背后的数据结构

 所谓"构建索引" 其实是 引入一些数据结构 对数据进行存储,从而 提高查找速度~

二叉搜索树 和 哈希表 的查找效率都很高,但是都不适合 给数据库做索引

原因:

  • 二叉搜索树 最大的问题在于 "二叉",当要保存的 元素多的时候,会使整个树的 高度变高(高度变高,比较的次数就会变多,伤硬盘~)
  • 哈希表 最大的问题在于 只能进行"相等" 查询,无法进行 < >这样的'范围查询',也无法进行 like 模糊查询(哈希表 是通过哈希函数 把查询的key 映射成 数组下标)

B树

也写做 B-树(这里的 - 是连接符)

B树 是N叉搜索树(每个节点 ,可以有 多个子树,树的度是 N, 这样降低了树的高度)

每个节点不是 存储一个key值,而是会存多个  ,某个节点保存了 N个key,就能延伸出 N+1个子树,

和某个节点比较的时候,先一次硬盘IO,把所有的这个节点的内容都读出来,再在内存中比较,这里最主要的目的: 不是为了减少 比较的次数 而是要减少 硬盘IO的次数

B+树

B+树 ,为数据库 量身定做的数据结构  ,针对B树做的进一步改进的数据结构,B+树也是N叉搜索树

上图中的15是该B+树的最大值

若要进行 范围查询id>4 and id<10 ,从4开始,沿着链表往后遍历到10即可完成查询~

B+树与B树的区别

  • B树 是有N个key,划分成N+1个区间  ,B+树 是有N 个key,划分出N个区间
  • 父节点中的key值 会在下面的子节点中再次出现 (成为子节点最大值)
  • B+树把叶子节点 像一个链表一样 连在一起了(此时进行 '范围查询' 就非常方便了)

B+树的优势

  • N叉搜索树,树的高度比较低,此时硬盘IO次数就比较少
  • 叶子节点是全集, 并且用链表结构连接,非常便于范围查询
  • B+树 所有查询都要落在叶子节点上完成的  ,任何一次查询,经历的IO次数和比较次数 都是差不多的,查询的开销稳定(稳定意味着 成本容易被预估出来)
  • B+树的叶子节点是全集,所以 非叶子节点上不必存储 "数据行"(比如:数据行: "1 ,张三,  男,  100分),只需要存储索引列的 key即可(非叶子节点占据的空间小,可以直接加载到内存中,进一步减少了硬盘IO的访问次数)

mysql事务

事务 是用来解决一类 特殊场景的问题(有些场景,完成某个操作,需要多个sql 配合完成,例如 转账)

事务 是把多个执行的SQL 打包成一个'整体',这个整体 在执行的过程中要做到 要么整个执行完,要么一个都不执行  (这里的"一个都不执行"实际上是"回滚"机制),避免出现 类似于" 转账转一半" 的情况.

回滚 :当sql执行到一半发现出错了 ,数据库会自动进行"还原操作"(相当于把前面执行过的sql给 '撤销'了,最终效果就像 一个sql都没有执行的效果). 回滚操作 只是针对 事务 来说,不能将想 "drop database "这样的操作 回滚回来

 事务 涉及的四个核心特性:

  • 原子性(最重要的特性),上面提到的 '整体'即原子性.
  • 一致性 ,事务执行的前后数据库中的数据都是'合法状态',不会出现 非法的临时结果的状态
  • 持久性.事务执行完毕后,就会修改 硬盘上的数据,事务都是会持久生效的.
  • 隔离性, 描述了 多个事务 并发执行的时候 相互之间产生的影响是怎样的

隔离性详细解释

并发执行:  mysql是一个 '客户端- 服务器'结构的程序,  一个服务器通常会给多个客户端 同时提供服务,因此  很可能,多个客户端会同时向 这个服务器提交事务来执行,服务器就要同时执行这些多个事务,此时就是 并发执行.

若此时 同时执行的事务 恰好是针对同一个表 进行 增删改查 ,此时就可能会引入 一些问题:
脏读 ,不可重复读 , 幻读.

脏读

指一个事务读取的数据是 "脏数据"(过时的数据)

举例: 有两个事务A和B 并发执行,

其中 事务A 是针对某个表的数据 进行修改 .A执行过程中,B也去读取这个表的数据, 当B读完后,A把表中的数据又改成了别的,

这样就会导致B读到的数据 不是最终的"正确数据" ,而是临时性的 "脏数据"

解决方法: 给写操作加锁(即在修改的时候,不能读) 

不可重复读

 指的是 一个事务里 多次读取的结果不一样

举例: 有三个事务ABC ,

事务A执行完一个修改操作,提交数据,事务B再执行,读取刚才A提交的数据,

在B读取的过程中,事务C又对刚才A修改的数据 再次做出了修改

对B来说,后续读到的这个数据 和第一次读到的是不一样的.

 解决方法: 给读操作加锁(一个事务在读取数据的过程中,其他事务不能修改它正在读的数据)

幻读

幻读 是不可重复读的特殊情况

举例"事务A在读取数据时 ,事务B 新增 或 删除了一些数据

A多次读取的数据虽然 一样,但是 '结果集'不同

解决方法:'串行化'(只要是 读的时候,就不要有任何操作.)

隔离性的四个级别

针对上面3个问题, mysql 提供了四个隔离级别,可以通过 配置文件来设置当前服务器的隔离级别

设置不同的隔离级别 会使事务间的并发执行产生的影响有差别

read uncommitted 读未提交

一个事务可以读取 另一个事务未提交的数据,此时就可能会产生 脏读.不可重复读,幻读 三个问题

但是此时,多个事务并发执行的程度是 最高的,执行速度也最快.

read committed  读已提交

一个事务只能读取另一个事务提交之后的数据(给写操作加锁),此时会产生 不可重复读 和 幻读 两个问题(脏读问题解决了),此时并发程度会降低,执行速度会变慢,但是事务之间的隔离性提高了(事物之间影响变小了,得到的数据更准确了)

repeatable read 可重复读

相当于给读操作和写操作都加锁了.此时可能会产生 幻读问题(解决了脏读和不可重复读问题),

并发程度进一步降低,执行速度进一步变慢, 事务的隔离性进一步提高了.

serializable 串行化

所有事务都是在服务器上一个接一个的执行的,此时解决了脏读,不可重复读,幻读问题

并发程度最低,执行速度最慢,隔离性最高,数据最准确

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

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

相关文章

阿里巴巴1688 阿里228滑块 网站分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

前端接口请求与后端交互详解 联调后端取不到值 自己的一点记录写的比较随意 会比较乱但都是干货

响应头&#xff1a; cache-control: 缓存控制 联调后端取不到值&#xff1f;&#xff1f; 无论何种形式传递&#xff0c;后端解析表单信息的时候&#xff0c;会考虑Content-Type。 如果是JSON字符串的话&#xff0c;后端解析payload的内容时候要去解析JSON。 如果是key1val…

国科大 矩阵论2023秋季 叶世伟老师 考试试卷

叶老师的考试很难&#xff0c;图源一位胆大的勇者~ 希望能帮助大家&#xff01;

如何使用poutine检测代码库构建管道中的安全缺陷

关于poutine poutine是一款功能强大的缺陷检测工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员快速扫描和检测代码存储库构建管道中的错误配置和安全漏洞。 该工具支持解析来自 GitHub Actions 和 Gitlab CI/CD 的 CI 工作流。当获得具有读取级别访问权…

MySQL:简述事务的SQL操作

1、查询数据库的隔离级别 选择数据库,查看当前事务隔离界别。 &#xff08;1&#xff09;读未提交&#xff1a;READ-UNCOMMITTED &#xff08;2&#xff09;读已提交&#xff1a;READ-COMMITTED &#xff08;3&#xff09;可重复读&#xff1a;REPEATABLE-READ &#xff08;4&…

qt报错 error: undefined reference to `vtable for RelayDevice 解决方法

在 Qt 编程中&#xff0c;当出现错误 undefined reference to ‘vtable for RelayDevice’ 时&#xff0c;通常是因为类的虚函数没有实现&#xff0c;或者未正确实现虚析构函数。以下是一些可能的解决方法&#xff1a; 确保实现所有虚函数&#xff1a; 检查 RelayDevice 类中声…

大白话-【2.1】WindowsServer2016配置DHCP

1.DHCP服务功能介绍 2.DHCP服务安装 3.DHCP服务配置 3.VMWare实操 3.1VMWare用的是vmnet8网段DHCP服务 3.2关闭VMWare提供的DHCP服务 扩展&#xff1a;清除DNS缓存命令 ipconfig/flushdns END 提升 给客户机固定IP 1.查询网卡MAC

漏洞披露-金慧-综合管理信息系统-SQL

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://wwlib.cn/index.php/artread/artid/6607.html 本文仅用于技术研究学习&#xff0c;请遵守相关法律&#xff0c;禁止使用本文所提及的相关技术开展非法攻击行为&#xff0c;由于传播、利用本文所提供的信息而造成任何…

10天速通Tkinter库——Day8:《植物杂交实验室》杂交实验及历史记录界面

本篇博客我将介绍Tkinter实践项目《植物杂交实验室》中的杂交实验、实验结果和历史记录两个页面的制作。 它们作为主窗口的子页面实例&#xff0c;除了继承主窗口的基础设置&#xff08;如图标、标题、尺寸等等&#xff09;、还可以使用主窗口的属性和方法&#xff08;如数据变…

IoTDB 如何有效实现磁盘 I/O 监控和优化?

IoTDB 监控工具&#xff1a;有效保障读写数据量与系统效率&#xff01; 磁盘 I/O 负载过高的原因是什么&#xff1f;如何排查&#xff1f; 如何判断磁盘 I/O 是否成为系统瓶颈&#xff1f; 如何优化磁盘 I/O 读写性能&#xff1f; 在现代计算机系统和应用程序中&#xff0c;磁盘…

[000-002-01].第26节:MySQL对隔离级别的实现

1.MySQL支持的四种隔离级别&#xff1a; 2.如何设置事务的隔离级别 3.不同隔离级别举例 3.1.演示1. 读未提交之脏读 3.2.演示2&#xff1a;读已提交 3.3.演示3&#xff1a;设置隔离级别为可重复读&#xff0c;事务的执行流程如下&#xff1a; 3.4.演示4&#xff1a;幻读:

3 Python开发工具:VSCode+插件

本文是 Python 系列教程第 3 篇&#xff0c;完整系列请查看 Python 专栏。 Visual Studio Code的安装非常简单&#xff0c;就不放这里增加文章篇幅了。 相比PyCharm&#xff0c;VSCode更加轻量&#xff0c;启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高…

在手机在线预览3D模型,是如何实现的?

在手机在线预览3D模型&#xff0c;主要依赖于几个关键技术和步骤来实现。以下是一个概括性的流程&#xff1a; 一、模型上传 选择平台&#xff1a;首先&#xff0c;用户需要选择一个支持3D模型在线预览的平台&#xff0c;如51建模网、Sketchfab等。这些平台通常提供用户友好的…

iPhone不停重启怎么办?全面解析与解决方案

iPhone作为当今最受欢迎的智能手机之一&#xff0c;其稳定性和流畅性一直备受用户赞誉。然而&#xff0c;有时我们可能会遇到iPhone不停重启的问题&#xff0c;这不仅影响了正常使用&#xff0c;还可能让我们感到焦虑和困扰。本文将为大家详细解析iPhone不停重启的原因&#xf…

常用的编写VBA的软件 (L*00K)

一、Microsoft Office套件 Microsoft Excel&#xff1a; Excel是VBA编程最为广泛使用的环境之一。用户可以通过编写宏来自动化重复性的任务&#xff0c;如数据整理、自动填充、复杂的计算等。Excel中的VBA功能让用户能够创建复杂的函数、表单以及完整的应用程序&#xff0c;以…

html+css网页设计 个人网站模版 我的书屋5个页面

htmlcss网页设计 个人网站模版 我的书屋5个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 …

华为大动作:三折折叠屏手机9月亮相,价格破万引猜疑

在科技迅猛发展的今天&#xff0c;智能手机的形态和功能不断突破传统边界&#xff0c;为用户带来前所未有的体验。华为&#xff0c;作为全球通信领域的领军企业&#xff0c;一直在折叠屏技术上推陈出新。 近日&#xff0c;华为即将发布的首款三折折叠屏手机成为了市场的焦点&a…

ICD-Face:用于人脸识别的类内紧致蒸馏算法

ICD-Face: Intra-class Compactness Distillation for Face Recognition 摘要 在ICD-Face中&#xff0c;首先提出计算教师和学生模型的相似度分布&#xff0c;然后引入特征库来构造足够多的高质量的正对。然后&#xff0c;估计教师和学生模型的概率分布&#xff0c;并引入相似…

全钢无边防静电地板结构特点你了解多少

机房装修常常会用到防静电地板&#xff0c;全钢无边防静电地板作为其中一种&#xff0c;常用于对地板外观要求较高&#xff0c;且不需要频繁更换设备的场所&#xff0c;那么全钢无边防静电地板有哪些特点呢&#xff1f; 先来说一下全钢无边防静电地板的结构&#xff1a;全钢无…

大模型的那些道道

1 AI大模型介绍 chat-gpt、sora、sd、文心一言&#xff08;GAI&#xff0c;生成式AI&#xff09;等等&#xff0c;这些是大模型嘛&#xff0c;准确来说这些只是大模型落地的产品&#xff1b;“大模型”通常指的是拥有大量参数的深度学习模型&#xff1b;因此对计算资源要求很高…