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


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

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

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

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

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

相关文章

【Modelground】个人AI产品MVP迭代平台(2)——网站从0-1部署教程

文章目录 1.选购一台云服务器2. 购买域名3. 通过nginx部署静态网站4. 通过gitee在云服务器拉取代码5. ICP备案总结 1.选购一台云服务器 目前阿里云在促销,一台2核2GB内存3Mbps宽带的云服务器,一年只需要99元,学生更便宜,我认为这…

Java——处理键盘输入

在Java中,可以使用多种方式来处理键盘输入。最常用的一种方法是使用 Scanner 类,它位于 java.util 包中。 一、使用 Scanner 类处理键盘输入 1、具体操作步骤 1)导入 Scanner 类 在开始编写代码之前,需要导入 java.util.Scann…

C++ 类与构造函数 三五法则

前言 本文介绍C中类的基础知识,介绍所有的构造函数,和什么时候应该该写哪些构造函数,并介绍经典的三五法则。 在C中,只是声明一个空类,不做任何事情的话,编译器会自动为你生成如下八个默认函数&#xff1…

mysql表GEOMETRY记录的读取与增加

两张表,均有GEOMETRY字段,合并成一张表。 直接读取记录并insert into 出错,需用AsText(SHAPE) 及 GeomFromText($v[1])转换 一、读取 $tStr "select OGR_FID,AsText(SHAPE),name,area,perimeter,cnty_,cnty_id,cnty_code,pyname,post…

CentOS8安装opensips-cli

环境:阿里云 操作系统CentOS8.5 opensips 3.x版本废弃了之前的配置管理脚本opensipsctl,引入了一个新的python工具叫opensips-cli。本文描述如何在CentOS8安装这个工具。 升级python CentOS 8默认的ptyhon版本是3.6。这不能满足opensips-cli的要求&…

信息化业务运维的必要性和重要性

随着信息技术的飞速发展,企业信息化已经成为提升竞争力的关键手段。然而,仅仅拥有先进的信息化系统并不足以保证企业的高效运转,对这些系统进行科学、有效的运维同样至关重要。本文将深入探讨信息化业务运维的必要性和重要性。 一、信息化业…

什么是股票,新手如何入门

股票是代表公司所有权的证券,当你持有某公司的股票时,你实际上拥有了该公司的一部分。作为股东,你有权分享公司的利润(如通过股息),以及在公司解散时对公司剩余资产的索取权。以下是关于股票的一些基本概念…

【TB作品】MSP430F5529,单片机,电子秒表,秒表

硬件 MSP430F5529开发板7针0.96寸OLED /* OLED引脚分配 绿色板子DO(SCLK)------P4.3D1(DATA)------P4.0RES-----------P3.7DC------------P8.2CS------------P8.1 */ 程序功能 该程序是一个用C语言编写的,用于msp430f5529微控制器上的简单电子秒表应用。它使用…

iOS与前端:深入解析两者之间的区别与联系

iOS与前端:深入解析两者之间的区别与联系 在数字科技高速发展的今天,iOS与前端技术作为两大热门领域,各自在移动应用与网页开发中扮演着不可或缺的角色。然而,这两者之间究竟存在哪些差异与联系呢?本文将从四个方面、…

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

7.2 Go 使用error类型

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

最大数位置c++

题目描述 输入n个整数,存放在数组a[1]至a[n]中,输出最大数所在位置(n≤1000)。 输入 第一行,数的个数n; 第二行,n个正整数,每个数在232−1之内。 输出 最大数所在位置。 样例输入 5 67 43 90 78 32 样例输出 3 代码如下…

数论1---整除

概念与基本性质就不说了 例题1:已知a|n,b|n.且axby1,求证:ab|n 即: 所以:ab|n 例题2:设m是一个大于2的正整数,证明:对于任意正整数n,都有 由于我不想打公式了直接拍照…

「前端+鸿蒙」核心技术HTML5+CSS3(七)

1、浮动简介、元素浮动后的特点、浮动后的影响、解决浮动产生的影响、浮动布局 浮动简介: 浮动(Float)是CSS中一种布局机制,它允许元素脱离常规的文档流,沿其容器的左侧或右侧排列。浮动元素仍然保留在页面布局中,可能会影响其他元素的布局。 元素浮动后的特点: 元素会…

react-native 默认停用 flipper 通知

react-native 0.74 默认停用 flipper ,但仍然可以手动安装 flipper 官方声明文档 英语好的可以直接阅读。 integration with React Native will no longer be enabled 原因 增加编译时间有时候会有连接问题升级会导致不能使用 之后调试推荐 我们建议团队使用 A…

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点:窗口坐标体系的原点位于窗口的左上角,即坐标(0, 0)位置。 轴方向: X轴:向右为正方向,随着X坐标值的增加,元素在窗口中从…

opencv-python(二)

马赛克 img cv2.imread(./bao.jpeg)print(img.shape)img2 cv2.resize(img,(35,23))img3 cv2.resize(img2,(900,666))cv2.imshow(bao,img3)cv2.waitKey(0)cv2.destroyAllWindows()img2 cv2.resize(img, (90,66))img3 np.repeat(img2, 10, axis 0) # 重复行img4 np.repeat(…

使用Bash脚本确保定时任务的单例执行

简介: 在Linux系统中,定时任务是自动化运维的重要组成部分。然而,有时候我们可能需要确保某个定时任务在任何给定时间点只运行一次,以避免资源冲突或数据不一致。本文将介绍如何使用Bash脚本和文件锁来实现单例定时任务。 什么是…

数据结构---时间复杂度与空间复杂度

文章目录 1. 知识背景2. 什么是时间复杂度?3. 空间复杂度4 .大O渐进表示法:对于一些算法的时间复杂度存在最好,最坏,平均的情况: 5. 常见的时间复杂度举例总结:6. 空间复杂度的举例与总结:总结&…

腾讯 InstantMesh,单图生成 3D 模型,10 秒内完成,性能超越 SOTA

前言 近年来,3D 内容创作在游戏、动画、虚拟现实等领域发挥着越来越重要的作用。然而,传统的 3D 模型制作流程繁琐,需要专业人员花费大量时间和精力。为了简化 3D 内容创作流程,腾讯 ARC 实验室推出了 InstantMesh,一…