Mysql索引事务(面试高频)

文章目录

目录

文章目录

前言

一 . 索引

1.1 概念

1.2 作用

1.3 使用场景

1.4 存储引擎

二 . 事务

2.1 事务的概念

2.2 事务四大特性


前言

大家好,今天给大家绍一下mysql索引和事务


一 . 索引

1.1 概念

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

1.2 作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助。

1.3 使用场景

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

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

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。 反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

1.4 存储引擎

MySQL支持多种存储引擎,每种引擎都有其自己的特点和适用场景。以下是一些常见的MySQL存储引擎:

  1. InnoDB:InnoDB是MySQL的默认存储引擎,它支持事务、行级锁定、外键约束等特性,适合于需要强大事务支持和并发控制的应用。

  2. MyISAM:MyISAM是MySQL的另一种存储引擎,它不支持事务和行级锁定,但在读密集型应用中性能较好,适合用于数据仓库和日志等应用。

  3. MEMORY:MEMORY存储引擎将数据存储在内存中,适合用于临时表和缓存等场景,具有快速访问速度。

  4. NDB Cluster:NDB Cluster是MySQL的集群存储引擎,适合于高可用性和高性能的分布式数据库系统。

  5. ARCHIVE:ARCHIVE存储引擎适合于需要高压缩比和低写入频率的存档数据。


存储引擎是mysql内部的一个模块,存储引擎模块提供了很多版本的实现,Innodb是当前最常用的存储引擎。

为什么Innodb是默认的存储引擎? 这取决于其内部的数据结构 ==> B+树

B+树 http://t.csdnimg.cn/ewuDZ

 为什么B+树适合用作索引底层的数据结构来使用?


相比大家学过的数据结构也不少,在这么多的数据结构中适合进行查询并且性能相对较好的有

(哈希,红黑,B树) 其他的数据结构要么不适合进行查找或者就是效率上不是那么的好,像是平衡树

虽然查询的速度也是挺快的但是在插入数据的时候需要进行大量的旋转,效率自然而然的就下来了

1.为什么不使用红黑树?

内存占用: 红黑树每个节点包含的信息更多(包括颜色信息、指向父节点的指针等) 如果内存有限,需要存储的数据量又非常的大,这个是否只能将数据存入磁盘中,如果进行查询的话,需要进行大量的磁盘IO非常消耗时间

数据聚集性: 红黑树中数据直接没有关联性,不利于范围查询和顺序遍历

2.为什么不使用哈希表?

哈希表的效率不必多说O(1)的时间复杂度,基本上可以说吊打一切了,但是它有一个致命的缺陷,无法进行范围查询! 这限制了哈希表的应用场景

MEMORY存储引擎一般用于临时表和缓存等场景,这些场景下通常对于快速的数据访问更为重要,而不需要支持复杂的数据操作。因此,选择哈希数据结构可以更好地满足这些场景下的需求。

3.为什么不使用B树?

不稳定性: 对于B树来说,如果要查询的元素在根节点或者层次比较高的节点,可以做到很快的拿到元素, 但是如果要查询的节点在叶子节点,时间相对而言就会更多一些

稳定性对于数据库来说还是很重要的,在生活中也是很重要的,高考的摸底考试和正式高考,相差如果太大就直接g了

如果说没有B+树的话,B树也是算得上比较好的一种索引底层数据结构了,但是B+树是为索引而生的

4.为什么使用B+树?

1) 首先B+树起源于B树,是一颗N叉搜索树.树的高度是有限的,可以有效的降低磁盘IO的次数

2) 非常擅长范围查询,因为所有的值都存储在叶子结点

3) 稳定性好,所有的查询都是要落到叶子结点上的,查询和查询之间的时间开销是稳定的,不会出现B树的不稳定情况(三模600 高考500)

4) 由于叶子结点是全集,非叶子节点上只存储一个用来排序的key,数据库是按行组织数据的,创建索引的时候是针对一列进行创建,这就导致非叶子节点根本占不了多少空间,因为它存储的不过是一个用来排序的key(比如一个id) 这部分内容可以直接缓存到内存中

(硬盘上则是存储叶子结点和非叶子结点,在查询的时候可以把非叶子结点的内容加载到内存中,整个查询过程就是在内存中进行,进一步的减少了磁盘IO的次数)


二 . 事务

2.1 事务的概念

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

start transaction  rollback/commit 已经过时了,在现在的开发中事务被层层封装,这种最原始的在sql中穿插的命令已经用不到,不知道的也不必再了解.知道的也可以选择性遗忘

2.2 事务四大特性

开发中经常会遇到一些需要一气呵成的操作,即必须是同时成功或者是同时失败,这种操作业内称之为原子操作 ,为什么叫原子操作? 这是早期的一个错误观点被沿用至今(也没有修改的必要), 在人类的发展认知中曾经存在过 "原子是不可分割的最小单位" 这一说法,这一个错误观点就诞生了事务的四大特征之一 - 原子性中原子两字

举个例子:  张三给李四转账500元 首先张三的账户减去500 然后李四的账户加上500

这个时候如果张三的账户减少500,但是李四的账户并没有加上500,这个时候问题可就大了

所以事务的原子性是不可或缺的!

原子性: 事务要么同事成功,要么同时失败


再来思考一个问题,有没有一种可能,张三账户上减500元 李四账户上加50000000元,这个时候如果处理不好,那可就是"刑"了,有没有可能出现这么一个情况呢? 早期我不知道,但是有事务的一致性为我保驾护航,我想问题应该不大

一致性: 数据库操作前后,数据要能对得上


持久性(Durability):一旦事务提交,其所做的修改将会永久保存在数据库中,即使系统发生故障,这些修改也不会丢失。


隔离性: 多个事务并发执行时,各个事务的操作互不干扰。

并发执行时非常的常见的,mysql是一个客户端服务器结构的程序,一个服务器可以给多个客户端提供服务,如果多个客户端同时访问数据库,在客户端1提交的事务执行到一半时,客户端2提交的事务也过来了,这个时候数据库服务器需要同时并发处理这两个事务,这个时候我们应该怎么去处理呢?

如果我们希望数据库服务器的执行效率提高,这个时候就需要提高并发率,但是提高并发率可能会出现数据错误的情况,具体情况如下


脏读: 一个事务A正在写数据的的过程中,另一个事务B读取了同一个数据,接下来A又修改了数据,导致B之前读到的数据,是一个无效的数据/中间的数据(脏数据)

如何解决? 

注意上面的措词, 写数据的过程中,另一个事务读取了同一个数据

如果在一个事务写的过程中,另一个或者多个事务无法去读取该数据,那么问题不就完美解决了吗?

这个操作称之为 "写加锁"

并发性降低了,隔离性提高了,效率降低了,数据准确性提高了


不可重复读: 并发执行事务的过程中如果事务A在多次读取同一个数据的时候,出现不同的情况,这就是不可重复读,意味着在A两次读取数据之间,有一个数据B修改并提交了数据

如何解决?

注意措词 A两次读取数据之间,有一个数据B修改并提交了数据 如果在A读取数据的过程中,其他的事务无法读取该数据不就完美解决了吗?

这个操作我们称之为 - "读"加锁

并发程度进一步降低,隔离性提高,效率降低,数据的准确性提高


幻读: 一个事务A在执行过程中,两次的读取操作,数据内容虽然没有改变,但是结果集变了,这种称之为 "幻读"

比如我在读A文件,你不能写A文件,但是你可以写其他的文件,这样我在读取的时候,读取的内容虽然没有变,但是结果集发生了改变

如何解决?

引入串行化方式解决幻读,什么是串行化? 完全没有并发 我在读A文件的时候,其他人什么也不能干

数据绝对安全,效率绝对低的离谱!


总结一波

事务的四大特性通常指的是ACID特性,即:

  1. 原子性(Atomicity):事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。在事务执行过程中,如果发生错误或者中断,系统会将所有操作回滚到事务开始前的状态,保证数据的一致性。

  2. 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏。即使在事务执行过程中发生了错误,系统也会保证数据库从一个一致的状态转移到另一个一致的状态。

  3. 隔离性(Isolation):多个事务并发执行时,各个事务的操作互不干扰。每个事务的操作对其他事务是隔离的,因此不会出现数据争用、幻读等问题。

  4. 持久性(Durability):一旦事务提交,其所做的修改将会永久保存在数据库中,即使系统发生故障,这些修改也不会丢失。

这些特性确保了事务在数据库系统中的可靠性和一致性,是数据库设计和管理中非常重要的概念。


常见的事务隔离级别包括:

  1. 读未提交(Read Uncommitted):允许一个事务读取另一个事务未提交的数据。这是最低的隔离级别,可能会导致脏读、不可重复读和幻读的问题。

  2. 读提交(Read Committed):保证一个事务不会读取另一个事务未提交的数据。这个级别可以避免脏读,但仍然可能出现不可重复读和幻读的问题。

  3. 可重复读(Repeatable Read):保证一个事务不会读取到另一个事务已提交的修改,从而避免了不可重复读的问题。但仍然可能出现幻读的问题。(Innodb默认隔离级别)

  4. 串行化(Serializable):最高的隔离级别,通过强制事务串行执行来避免脏读、不可重复读和幻读。这个级别能够确保事务之间的完全隔离,但会导致性能下降。


总结


这篇博客主要介绍了mysql数据库索引和事务的相关内容,下一篇博客见!

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

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

相关文章

Linux基础(第三部分)

目录 一、查看文件显示命令 1、cat:查看文件内容;上下合并文件 2、标准输入与标准输出: 3、例题:如何合并两个文件 4、tac 就是反方向查看 5、rev 把一行倒过来 6、hexdump 查看硬件设备 7、more和less 8、查看文件内容…

鸿蒙原生应用/元服务开发-Stage模型能力接口(八)

一、说明 ExtensionAbility是特定场景扩展能力的基类,提供系统配置更新回调和系统内存调整回调。本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。本模块接口仅可在Stage模型下使用。 二、导入模块 .imp…

c++导入外部的依赖开源库

使用git submodule git submodule add https://github.com/username/subproject.git使用cmake导入 FetchContent 实际使用的话,有下面的三点总结 关于FetchContent,若并需要修改 配置以及编译的默认值的时候,推荐首要使用该方法。include(FetchContent)set(JSON_C_TAG jso…

JVM知识总结,一定要记住它。

1、知识点汇总 JVM是Java运行基础,面试时一定会遇到JVM的有关问题,内容相对集中,但对只是深度要求较高 其中内存模型,类加载机制,GC是重点方面.性能调优部分更偏向应用,重点突出实践能力.编译器优化 和执行模式部分偏向于理论基础,重点掌握知识点. 需了解 内存模型各部分作用…

用最通俗的语言讲解 TCP “三次握手,四次挥手”

目录 一. 前言 二. TCP 报文的头部结构 三. 三次握手 3.1. 三次握手过程 3.2. 为什么要三次握手 四. 四次挥手 4.1. 四次挥手过程 4.2. 为什么要四次挥手 五. 大白话说 5.1. 大白话说三次握手 5.2. 大白话说四次挥手 六. 总结 一. 前言 TCP 是一种面向连接的、可靠…

AI代码翻译神器,用AI翻译代码,轻松学习不同编程语言,已开源!

体验地址,github地址和部署地址在文章底部 AI代码翻译器的优势 近年来,随着技术的快速进步,人工智能技术展现出了在各个领域发挥作用的巨大潜力。AI代码翻译器作为一项创新技术,为开发者带来了全新的可能性。这项技术运用人工智…

TS 类型断言

Typescript允许你覆盖它的判断,并且能以任何你想要的方式分析它,这种机制被称为类型断言。 类型断言的两种方式: 1.as关键字 interface SquareConfig {color?: string;width?: number; }function createSquare(config: SquareConfig) {/…

Flink系列之:背压下的检查点

Flink系列之:背压下的检查点 一、Checkpointing under backpressure二、缓冲区 Debloating三、非对齐 Checkpoints四、对齐 Checkpoint 的超时五、限制六、故障排除 一、Checkpointing under backpressure 通常情况下,对齐 Checkpoint 的时长主要受 Che…

【MATLAB】数据拟合第13期-基于最小二乘支持向量机的拟合

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于最小二乘支持向量机的拟合算法是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。这种算法在曲线拟合中应用广泛,包括线性拟合和非线性拟合…

[网络安全]密码字典快速生成——在线网站

目录 1.密码字典在线生成器one点击链接 ​编辑2.密码字典在线生成器two点击链接 3.密码字典在线生成器three点击链接 个人推荐生成器1,因为复制黏贴好用。 1.密码字典在线生成器one点击链接 2.密码字典在线生成器two点击链接 3.密码字典在线生成器three点击链接 看…

JavaGUI期末速成版

前言 宇宙无责声明,本系列记录的JavaGUI编程都是十分精简的,内容只取常用的、套路的、应付期末考试的。 目录大纲: JavaGUI(但期末速成版)之JFrame和JDialog-CSDN博客 JavaGUI(但期末速成版)之容…

智能优化算法应用:基于饥饿游戏算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于饥饿游戏算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于饥饿游戏算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.饥饿游戏算法4.实验参数设定5.算法结果6.…

【重点】【贪心】55.跳跃游戏

题目 法1&#xff1a;贪心 class Solution {public boolean canJump(int[] nums) {int maxIndex nums.length - 1;int curMaxIndex 0;for (int i 0; i < nums.length; i) {if (i < curMaxIndex) {curMaxIndex Math.max(i nums[i], curMaxIndex);if (curMaxIndex &…

Ubuntu中基础命令使用

前言 以下指令测试来自于Ubuntu18.04 如果有说的不对的&#xff0c;欢迎指正与补充 以下指令为我学习嵌入式开发中使用过最多的指令 目录 前言 1 ls 首先我们进入到Linux操作系统中 2 touch创建一个文件 3 pwd查看当前路径 4 创建目录 5 删除文件 6 cd 目录跳转 0…

scrapy_redis概念作用和流程

scrapy_redis概念作用和流程 学习目标 了解 分布式的概念及特点了解 scarpy_redis的概念了解 scrapy_redis的作用了解 scrapy_redis的工作流程 在前面scrapy框架中我们已经能够使用框架实现爬虫爬取网站数据,如果当前网站的数据比较庞大, 我们就需要使用分布式来更快的爬取数…

JavaScript基础(数组+正则表达+字符串)

目录 1.数组 1.1创建数组 1.2字面量创建数组 1.3length函数 1.4遍历数组1 1.5遍历数组2语法糖 1.6增删改查 1push 2pop 3unshift("x",x) 4shift() 5数组的截取 slice() splice() 6concat 7reverse 2.内置对象 2.1data 2.2Math对象 2.3字符串 1c…

学成在线案例

1&#xff0c;CSS属性书写顺序 建议遵循以下顺序&#xff1a; 1&#xff0c;布局定位属性&#xff1a; display / position / float / clear / visbility / overflow &#xff08;建议display第一个写&#xff0c;关系到模式&#xff09; 2&#xff0c;自身属性&#xff1a…

二维相位展开问题(讨论针对不连续相位展开算法鲁棒性)

作者&#xff1a;Munther Gdeisat博士和Francis Lilley博士 先决条件&#xff1a;为了理解本教程&#xff0c;在阅读本文档之前&#xff0c;您必须已经学习并完成“一维相位展开问题”教程。 有许多应用程序可以生成包裹的相位图像。例如合成孔径雷达&#xff08;SAR&#xf…

FreeRTOS之列表及列表项实验(基于stm32f103c8t6)

B站正点原子视频链接&#xff1a; 第23讲 列表项的插入和删除实验_哔哩哔哩_bilibili #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "FreeRTOS.h" #include "task.h" #in…

Android开发——activity类中的回调方法中的7个生存期

1、onCreate() 这个方法在每个活动中都能进行重写&#xff0c;他会活动在第一次被创建的时候调用。在这个方法中完成活动的初始化操作&#xff0c;如&#xff1a;加载布局、绑定事件等 2、onStart() 这个方法在活动由不可见变为可见的时候调用 3、onResume() 这个方法在活动中准…