【MySQL数据库】索引与事务

news2025/1/22 18:48:36

  🔥个人主页: 中草药

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


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

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

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

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

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

相关文章

一维时间序列突变检测方法(小波等,MATLAB R2021B)

信号的突变点检测问题是指在生产实践中,反映各种系统工作状态的信号,可能因为受到不同类型的噪声或外界干扰而发生了信号突变,导致严重失真的信号出现,因此必须探测突变出现的起点和终点。研究目的在于设计出检测方案,…

python-字符替换

[题目描述] 给出一个字符串 s 和 q 次操作,每次操作将 s 中的某一个字符a全部替换成字符b,输出 q 次操作后的字符串输入 输入共 q2 行 第一行一个字符串 s 第二行一个正整数 q,表示操作次数 之后 q 行每行“a b”表示把 s 中所有的a替换成b输…

docker 存储 网络 命令

文章目录 1 docker存储1.1 目录挂载2.1卷映射2.1.1卷映射和目录挂载的区别2.1.2卷映射的使用 2 docker网络2.1查看docker的默认网络2.2查看容器的IP2.3容器互通2.4自定义网络2.4.1 创建自定义网络2.4.2创建容器的时候加入到自定义的网络2.4.3使用域名进行容器之间的访问2.4.4re…

小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…

低代码设计中的组织结构的作用与模式

一、组织结构的作用 在低代码设计中,组织结构是系统运作的基石,它定义了系统中的关键元素,包括人员、部门、角色,以及一人多部门、一人多部门多角色的复杂关系。这种定义不仅为系统提供了清晰的运行框架,还确保了系统…

学生问的一道CSS3媒体查询,实现响应式设计的题

目录 题目要求: 解题思路: 解题: 1)大屏、3个DIV水平排列 2)中屏、前2个DIV水平占一半,第三个另起一行,宽度占满 3)小屏,3个DIV铺满,垂直排列 题目要求&…

深入理解计算机系统 家庭作业5.13

A:关键路径在xmm0那条路,书中几条关键路径全部是xmm0,有xmm1时,xmm1也是 B:3 C:1 D:按书中的定义: 关键路径才是下界!按书上的方法根据 图5-12 算出关键路径的CPE即可. 非关键路径把它视为黑盒子.因为是乱序和超标量的,没办法搞清楚处理器具体怎么处理这些指令.

17、Spring系列-SpringMVC-请求源码流程

前言 Spring官网的MVC模块介绍: Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中。正式名称“ Spring Web MVC”来自其源模块的名称(spring-webmvc),但它通常被称为“ Spring MVC…

PHP 页面报错Warning</b>: Cannot modify header information - headers already sent by

先给出解决方案再解释,如果急着用就不用看解释了。 解决方案一:保存php文件编码为utf-8无BOM码,具体操作可以用notepad等编辑器完成,把 sesstion_start() 放在文档所有输出(包括html标签和php的输出语句,具…

了解可燃气体报警器检验收费,守护企业安全新防线

在工业生产中,可燃气体报警器作为预防火灾和爆炸事故的重要设备,其准确性和可靠性至关重要。为了确保报警器的正常运行,定期的检验工作必不可少。 而关于检验收费,很多企业可能存在疑虑:这项费用是否合理?…

AC自动机(查询)

上面讲了AC自动机是如何建树和建自动机的,这里要讲的是AC自动机的查询和各个数组的功能和作用。 其实AC自动机的查询和KMP算法是及其相近的,都是一个指针跑主串,另一个指针跑ne串(这里就是回跳边)。 话都说到这了&…

C#中字节数组(byte[])末尾继续添加字节的示例

方法一:使用List 使用List可以很容易地在末尾添加字节,然后如果需要,可以将其转换回byte[]。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Lin…

【C++小知识】为什么C语言不支持函数重载,而C++支持

为什么C语言不支持函数重载,而C支持 编译链接过程函数名修饰过程总结 在了解C函数重载前,如果对文件的编译与链接不太了解。可以看看我之前的一篇文章,链接: 文件的编译链接 想要清楚为什么C语言不支持函数重载而C支持,有俩个过程…

大数据学习问题记录

问题记录 node1突然无法连接finalshell node1突然无法连接finalshell 今天我打开虚拟机和finalshell的时候,发现我的node1连接不上finalshell,但是node2、node3依旧可以链接,我在网上找了很多方法,但是是关于全部虚拟机连接不上finalshell&a…

12 - 常用类

那就别跟他们比,先跟自己比,争取今天比昨天强一些,明天比今天强一些。 1.包装类 针对八种基本数据类型封装的相应的引用类型。 有了类的特点,就可以调用类中的方法。(为什么要封装) 基本数据类型包装类b…

目标检测数据集 - 打架检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:打架检测数据集,真实监控场景高质量打架图片数据,涉及场景丰富,比如街道场景打架数据、酒吧场景打架数据、商店场景打架数据、公交车场景打架数据、监狱场景打架数据、空旷地打架数据、两人打架数据、多人群殴数据等。…

mysql中optimizer trace的作用

大家好。对于MySQL 5.6以及之前的版本来说,查询优化器就像是一个黑盒子一样,我们只能通过EXPLAIN语句查看到最后 优化器决定使用的执行计划,却无法知道它为什么做这个决策。于是在MySQL5.6以及之后的版本中,MySQL新增了一个optimi…

【Python】 将日期转换为 datetime 对象在 Python 中

基本原理 在 Python 中,处理日期和时间的库是 datetime,它提供了广泛的功能来处理日期和时间。datetime 模块中有一个 datetime 类,它可以用来表示日期和时间。有时,我们可能会遇到需要将日期字符串转换为 datetime 对象的情况&a…

计算机网络学习记录 运输层 Day5

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…

Cocos入门2:软件安装

Cocos Creator的安装教程如下,按照步骤进行,可以帮助您顺利安装Cocos Creator: 一、下载Cocos Dashboard 访问Cocos官网:前往Cocos Creator的官方网站(https://www.cocos.com/creator/)。 下载Cocos Dash…