【MySQL数据库】索引与事务

  🔥个人主页: 中草药

🔥专栏:【MySQL】探秘:数据库世界的瑞士军刀


目录

🗳️一.索引

📮1.工作原理

📬2.类型

📭3.作用 

📪4.优缺点

📫5.使用

📦6.索引的设计与管理

📤二.事务

📧1.事务的ACID特性*

📨2.使用

📩3.事务的隔离性

3.1. 脏读(Dirty Read)

3.2. 不可重复读(Non-Repeatable Read)

3.3. 幻读(Phantom Read)

3.4.隔离级别的解决

3.5.使用事务的场景

✉️三.总结与反思


🗳️一.索引

        索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引并指定索引的类型,各类索引有各自的数据结构实现。主要目的是为了加快数据检索的速度。索引使得数据库管理系统(DBMS)能够迅速地定位到表中特定的行,从而提升查询效率。下面是关于MySQL索引的一些关键点和详细说明:

📮1.工作原理

  1. 数据结构:最常见的索引类型是B-Tree索引(B树)。在MySQL中,索引被实现为一种平衡的树形结构(通常是B+树),这种结构允许快速查找、插入和删除操作。索引中存储了表中一列或多列的值(索引键)和这些值对应的行在表中的物理位置(通常是行ID或指针)。

  2. 查询过程:当执行一个查询时,数据库首先查看索引,而不是直接遍历整张表。通过索引,数据库可以迅速定位到包含目标值的行,然后再通过行ID或指针访问实际的行数据。

📬2.类型

  • B-Tree索引:是最通用的索引类型,适用于全值匹配、范围查询、排序和分组等操作。
  • Hash索引:适用于等值比较查询,通过哈希函数将索引列的值转换成哈希码,然后直接定位到相应行。不支持范围查询。
  • 全文索引:专为大文本字段设计,用于全文搜索,可以高效地处理LIKE '%keyword%'这类模糊查询。
  • R-Tree索引:用于空间数据类型的索引,如GIS地理坐标数据。

📭3.作用 

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

📪4.优缺点

优点

  • 提高查询速度:通过索引直接定位数据,减少全表扫描。
  • 加速排序和分组操作:如果排序或分组的列上有索引,数据库可以直接使用索引来避免额外的排序步骤。
  • 覆盖索引:如果查询所需的全部数据都在索引中(即索引包含了查询的所有列,无需回表查询),这将进一步提升查询性能。

缺点

  • 占用存储空间:每个索引都需要额外的磁盘空间来存储索引数据。
  • 影响写操作性能插入、删除和更新操作需要维护索引结构,可能会减慢这些操作的速度。
  • 选择性问题:如果索引的选择性不高(即索引列的值重复度高),索引的效果会大打折扣。

使用场景

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

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

📫5.使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
查看索引
show index from 表名;

案例:查看学生表已有的索引
show index from student;
创建索引
create index 索引名 on 表名(字段名);


案例:创建班级表中,name字段的索引
create index idx_classes_name on classes(name);

删除索引

drop index 索引名 on 表名;

案例:删除班级表中name字段的索引
drop index idx_classes_name on classes;

📦6.索引的设计与管理

  • 选择索引列:通常选择出现在WHERE子句、JOIN条件、ORDER BY和GROUP BY中的列作为索引。
  • 复合索引:当一个查询涉及多个列时,可以创建包含多个列的复合索引,但需注意索引列的排列顺序。
  • 监控和优化:定期分析索引的使用情况,移除无效或很少使用的索引,调整或新增索引来适应查询模式的变化。

综上所述,索引是MySQL性能优化的重要手段,但需要根据实际情况合理设计和管理,以达到最佳的性能与存储空间的平衡。

📤二.事务

        MySQL中的事务(Transaction)是数据库操作的基本单位,它能确保一系列操作要么全部成功,要么全部失败,以此来维护数据的一致性和完整性。事务是关系型数据库中的一个核心特性,特别是在处理金融、银行、电子商务等领域中对数据准确性要求极高的应用场景时尤为重要。以下是MySQL中事务的几个关键概念和操作:

📧1.事务的ACID特性*

  1. 原子性(Atomicity):事务被视为一个不可分割的最小工作单元,事务中的所有操作要么全部执行,要么都不执行。
  2. 一致性(Consistency):事务执行前后,数据库的状态都必须保持一致,即符合所有的预定义规则。
  3. 隔离性(Isolation):多个事务并发执行时,彼此之间互不影响,仿佛是在串行执行一样。MySQL提供了多种事务隔离级别来控制这一特性。下文做详细概述:
  4. 持久性(Durability):一旦事务提交,其结果就会永久保存在数据库中,即使系统发生故障也不会丢失。

📨2.使用

在MySQL中,可以通过以下命令来管理事务:

  • 开始事务:在默认的自动提交模式下,每条SQL语句都会作为一个单独的事务执行。要手动控制事务,首先需要关闭自动提交模式,使用SET autocommit = OFF;命令。
  • 执行事务中的操作:在此之后执行的SQL语句属于同一事务。
  • 提交事务:使用COMMIT;命令来确认并保存事务中的更改。
  • 回滚事务:如果事务中的某些操作失败,或者决定放弃已经做出的更改,可以使用ROLLBACK;命令撤销整个事务中的所有操作。
start transaction;

-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';

-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

📩3.事务的隔离性

        事务的隔离性问题主要体现在三种现象上:脏读(Dirty Read)、不可重复读(Non-Repeatable Read)和幻读(Phantom Read)。这些现象发生在并发事务处理时,不同的事务隔离级别会不同程度地解决这些问题。以下是这三种现象的具体解释:

3.1. 脏读(Dirty Read)

  • 定义:当一个事务读取了另一个事务尚未提交的数据时,如果后者进行了回滚,那么前者读取到的就是“脏数据”,即从未真正存在于数据库中的数据。
  • 示例:事务T1更新了一行记录,但还未提交。此时,事务T2读取了T1更新后的数据。如果T1随后因某种原因被回滚,那么T2之前读取的数据就是无效的,即发生了脏读。

3.2. 不可重复读(Non-Repeatable Read)

  • 定义:在一个事务内,两次读取同一行数据,由于另一个并发事务在这两次读取之间对该行数据进行了修改并提交,导致两次读取的结果不一致。
  • 示例:事务T1读取某一行数据,事务T2随后更新了该行数据并提交。当T1再次读取该行数据时,发现数据内容与第一次读取时不同,尽管T1本身没有对数据进行任何修改,这就是不可重复读。

3.3. 幻读(Phantom Read)

  • 定义:在一个事务内,两次执行相同的查询,第二次查询结果中出现了第一次查询结果中没有的新行,这是因为另一个事务在这两次查询之间插入了新数据。
  • 示例:事务T1执行一个查询,返回所有满足某个条件的行。在同一时间,事务T2插入了一行新数据,恰好也满足T1的查询条件,并提交了事务。当T1再次执行同样的查询时,发现多出了一行记录,就像幻影一样出现,这就是幻读。

3.4.隔离级别的解决

  • 读未提交(READ UNCOMMITTED):允许所有三种问题发生。
  • 读已提交(READ COMMITTED):解决了脏读问题,但不可重复读和幻读仍可能发生。
  • 可重复读(REPEATABLE READ):解决了脏读和不可重复读的问题,但在标准的SQL隔离级别定义中,理论上幻读仍可能发生。然而,在MySQL的InnoDB引擎中,通过多版本并发控制(MVCC)机制,实际上很大程度上避免了幻读的发生,他同时也是MySQL的默认级别。
  • 串行化(SERIALIZABLE):通过强制事务串行执行,解决了所有三种问题,但这是以牺牲并发性为代价的。

选择合适的事务隔离级别需要权衡数据一致性和系统性能之间的关系。在大多数应用中,可重复读(REPEATABLE READ)是一个平衡的选择。

3.5.使用事务的场景

  • 当你需要确保一系列数据库操作要么全部成功,要么全部失败时,应该使用事务。
  • 在转账、库存管理、订单处理等需要精确数据一致性的场景中,事务是必不可少的。

理解并正确使用事务,对于开发高性能、高可靠性的数据库应用程序至关重要。

✉️三.总结与反思

任凭怎样脆弱的人,只要把全部的精力倾注在唯一的目的上,必能使之有所成就。——西塞罗

        在深入学习MySQL的索引与事务后,我深刻体会到这两个概念不仅是数据库技术的核心组成部分,也是构建高性能、高可用数据库应用的关键。以下是我对这两个主题的学习总结与反思。

索引

重要性:索引是数据库优化的利器,它通过减少数据检索的时间复杂度,极大地提升了查询效率。理解索引的工作原理,特别是B-Tree结构,对于合理设计索引至关重要。

索引设计的艺术:选择合适的列建立索引,考虑列的选择性、查询频率以及是否涉及范围查询等因素。复合索引的顺序安排也是优化查询的关键。此外,认识到索引并非越多越好,过多的索引会占用额外的存储空间,并可能降低写操作的性能。

监控与调优:通过EXPLAIN分析查询计划,了解索引的实际使用情况,定期评估并调整索引策略。学会利用MySQL的性能监控工具,如SHOW INDEX、INFORMATION_SCHEMA库等,来辅助决策。

反思:在实践中,我意识到初期对索引的过度依赖有时会导致忽视了对查询逻辑本身的优化。未来,我应更加注重平衡索引的利弊,结合查询优化和合理的数据库设计来提升整体性能。

事务

事务的基石:ACID:理解事务的ACID属性(原子性、一致性、隔离性、持久性)是掌握事务管理的基础。每个属性都有其在保证数据完整性和一致性方面的关键作用。

隔离级别与并发控制:深入学习了四种事务隔离级别(读未提交、读已提交、可重复读、串行化)及其权衡,认识到不同的业务场景需要不同的隔离级别来平衡并发性和数据一致性。特别是InnoDB引擎的MVCC机制如何在可重复读级别上减少了幻读现象。

事务的实战应用:实践操作中,明确事务边界,适时使用BEGIN、COMMIT、ROLLBACK命令来控制事务流程,是防止数据不一致和错误累积的有效手段。同时,对死锁的理解和预防也是在并发环境下不可或缺的知识点。

反思:事务管理在实际应用中往往比理论学习更为复杂,尤其是在高并发场景下,正确选择隔离级别和处理事务冲突成为一大挑战。我需要更多地通过实战案例来深化理解,尤其是如何在特定场景下灵活运用SAVEPOINT、锁机制等高级特性,以提高系统的稳定性和响应速度。

        总之,学习MySQL的索引与事务是一个不断实践、反思和优化的过程。通过理论学习结合实际应用,我不仅加深了对这些核心概念的理解,也意识到了在实际工作中持续优化和学习的重要性。未来,我将继续探索更深层次的数据库知识,不断提升数据库设计和优化的能力


🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mamba In-2.Vision Mamba公式推导

Vision Mamba 从公式推导切入,介绍一下Vision Mamba,论文的第一个公式中表达了连续状态空间方程 在之后加入 步长∆后,h(t∆)如何表示呢? 可以在h(t)处做一个切线,此时的h(t∆)就由红色加蓝色的虚线相加得到了。那蓝…

详解 Spark 核心编程之累加器

累加器是分布式共享只写变量 一、累加器功能 ​ 累加器可以用来把 Executor 端的变量信息聚合到 Driver 端。在 Driver 程序中定义的变量,在 Executor 端的每个 Task 都会得到这个变量的一份新的副本,每个 task 更新这些副本的值后,传回 Dri…

制作ChatPDF之前端Vue搭建(二)

前端界面 接上篇: 制作ChatPDF之Elasticsearch8.13.4搭建(一) 为了实现一个基于 Vue.js 的前端应用,用户可以上传 PDF 文件,输入查询,并在输出框中显示查询结果,你需要以下步骤: 初始化 Vue …

Vue3实战笔记(59)—从零开始掌握Vue3插槽机制,进阶与提高

文章目录 前言一、具名插槽二、高级列表组件示例总结 前言 接上文&#xff0c;接下来看一点稍微复杂的&#xff1a;具名插槽 一、具名插槽 子组件 MyComponent.vue&#xff1a; <template><div><slot name"header"></slot><slot><…

LeetCode162寻找峰值元素

题目描述 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] nums[n] -∞ 。你必须实现时间复杂度为…

How to install a dataset from huggingface?

当我从抱抱脸上git clone imdb数据集时&#xff0c;plain_text里的文件是这样的&#xff1a;

FPGA新起点V1开发板(九)——流水灯

文章目录 一、模块框图二、代码编写三、注意点四、总结 一、模块框图 二、代码编写 endmodule下面需要敲出一个回车代码拼接是大括号 led < {led[2:0],led[3]}注意二进制和十进制 module flow_led(input sys_clk50,input rst_n,output reg [3:0] le…

双指针练习:盛水最多的容器

题目链接&#xff1a;11.盛水最多的容器 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可…

# linux 系统下,使用 docker 启动 mysql 后,通过 sqlyog 连接 mysql 报“错误号码2058“

linux 系统下&#xff0c;使用 docker 启动 mysql 后&#xff0c;通过 sqlyog 连接 mysql 报“错误号码2058“ 一、错误描述&#xff1a; 在 ubuntu 系统上&#xff0c;刚安装的 docker 启动 mysql 后&#xff0c;想通过图形界面 SQLyong 等工具连接 mysql 出现“错误号码2058…

算法题-给定一个日期,输出星期几

目录 给定日期&#xff0c;输出对应是星期几 测试结果 如1900年 5月6日是星期三&#xff0c;计算给的日期是星期几 给定日期&#xff0c;输出对应是星期几 #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {char input[100];int d…

【Python技术】AI编程新手快速入门学习LangChain大模型框架

如果我们要搞AI智能体&#xff0c;普通人一般 借助腾讯元器、 coze、KIMI 或者其他大平台搞一搞&#xff0c;比如我配置的coze智能体在微信公众号聊天。 对于程序员来说&#xff0c;一言不合就喜欢搞代码。 前面文章也介绍了不少关于AI知识库问答&#xff0c;AIagent 不少开源…

STM32基于HAL库的HC-SR04模块超声波测距

文章目录 一、HC-SR04模块介绍二、创建工程1.选择芯片2.配置RCC、SY![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9d2a5b883f0e409eabb804e6da861277.png)3.配置串口14.配置定时器5.配置GPIO 三、Keil代码1.勾选Use MicroLIB2.创建SR04.c和SR04.h文件3.其他代码 …

钣金件设计规范

(一&#xff09; 钣金 1、钣金的概念 钣金&#xff08;sheet metal&#xff09;是针对金属薄板&#xff08;厚度通常在6mm以下&#xff09;的 一种综合冷加工工艺&#xff0c;包括冲裁、折弯、拉深、成形、锻压、铆合等&#xff0c; 其显著的特征是同一零件厚度一致。 2、钣…

使用 Ollama 本地运行各种 LLM

今天看看另外一个产品Ollama。Ollama 的安装非常简单&#xff0c;只需从官网&#xff08;https://ollama.com/download&#xff09;下载后解压缩&#xff0c;并在 Terminal 中运行脚本 ollama run llama3 即可完成环境设置。 我尝试运行 Llama3&#xff0c;虽然在运行时占用了大…

网络协议分析

网络协议分析 网络协议分析概述用IP实现异构网络互联网络协议的分层TCP/IP的分层模型协议分析协议分析应用协议分析任务 常见网络协议PPP协议报文选项IPCP认证协议PAP安全缺陷认证协议CHAPPPPoE协议流程 地址解析协议ARPARP的思想和步骤ARP报文格式及封装 移动IP移动IP的工作机…

OpenAI 近期动荡:解雇 Sam Altman 事件分析与 AI 未来展望

引言 OpenAI 的动荡从未停止。最近&#xff0c;由于 OpenAI 高层领导的更迭&#xff0c;引发了广泛的关注和讨论。特别是在 Sam Altman 被解雇后&#xff0c;再次回归 CEO 职位的过程&#xff0c;更是引起了公众和业内的巨大反响。前 OpenAI 董事会成员 Helen Toner 在最新一期…

vue使用tailwindcss

安装依赖 pnpm add -D tailwindcss postcss autoprefixer创建配置文件tailwind.config.js npx tailwindcss init在配置文件content中添加所有模板文件的路径 /** type {import(tailwindcss).Config} */ export default {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,…

安卓模拟鼠标,绘图板操作电脑PC端,卡卡罗特也说好,儿童节快乐

家人们&#xff0c;上链接了&#xff1a;https://download.csdn.net/download/jasonhongcn/89387887

Go语言-切片底层探索 —— 补充篇:切片和底层数组到底是什么关系?

之前的切片探索中&#xff0c;上篇通过一道算法题目&#xff0c;了解到切片的两大特性&#xff1a;一是&#xff1a;切片是引用类型&#xff0c;指向底层数组&#xff0c;修改其底层数组的时候&#xff0c;会影响切片中的值。二是&#xff1a;向切片中添加元素的时候&#xff0…

限流算法整理——滑动窗口限流算法

限流算法描述 滑动窗口限流需要将每个窗口空间划分为无限小的窗口区间&#xff0c;并且动态调整区间的起始点&#xff0c;并且在调整完毕之后需要判断各个区间&#xff0c;累加各个区间的请求&#xff0c;查看是否到达最大的阈值&#xff0c;以此返回允许请求还是拒绝请求 算…