【MySQL】索引和事务

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】索引和事务

秋招

秋招中最经典,最高频的面试题

索引 index

在数据库中建立一个特殊的“目录“(一系列特定的数据结构),为了加快查询速度


select 查询都是遍历查询,比较复杂 O(N) 级别复杂度


嵌入式设备

咱们平时用的电脑、手机这些都是“计算机”,还有一些其他设备,也是包含“计算机”的,例如:路由器、冰箱、洗衣机、空调、投影仪等等,这些设备的“计算机”不是用来计算的,是作为辅助设施。


嵌入式系统

这些计算机往往非常小,硬件配置也比较低,这样的计算机系统就叫“嵌入式系统”。

操作索引的 SQL

查看索引

  • show index from 表名;
  • primary keyforigen keyunique 都能自动生成索引
  • 索引都是针对列生成的
    搜索创建了索引的列才会加快查询速度

创建索引

  • create index 索引名 on 表名(列名);
  • 创建索引需要在最初创建表的时候规划好
  • 危险操作

删除索引

  • drop index 索引名 on 表名;
  • 只能删除自己创建的,不能删自动生成的
  • 危险操作

事务

  • 把多个要执行的 SQL 打包成一个“整体”,其能做到要么都完成执行,要么一个都不执行,防止出现“半吊子”
  • 同时,也把事务支持的上述“特性”称为“原子性
  • 批量执行 SQL问题

回滚(rollback)

  • 不是没执行,而是在出错的时候,数据库会自动执行“还原操作”,将已经执行过的 SQL “撤销“了,效果就和没执行一样。
  • 数据库存在一系列“日志体系”,记录在文件中,记录了每一步 SQL 的操作,可以看到对数据进行了哪些修改,回滚时就参考这些信息进行完成。
  • 既可应对“程序崩溃”,也可应对“主机掉电”

操作

  1. 开启事务
  • start transaction;
  • 一般开发中不会这么搞,都是通过“代码”的方式开启事务,批量执行
  1. 提交事务
  • commit;

四个核心特性

  1. 原子性(最重要)
  • 事务内的所有操作作为一个整体被执行,不会出现部分完成的情况。
  1. 一致性
  • 事务执行前后,数据库中的数据都是“合法状态”,不会出现非法的临时结果的状态
  1. 持久性
  • 事务执行之后,就会修改硬盘上的数据,持久生效
  1. 隔离性(最常考)

             1.事务并发执行的时候,相互之间产生的影响是

  • MySQL 是一个“客户端—服务器”结构程序,所以一个服务器通常会给多个客户端同时提供服务,因此这多个客户端就同时给这个服务器提交事务来执行。与之相对,服务器就需要同时执行多个事务,此时就是“并发执行
  • 若这些同时执行的事务,恰好是针对同一个表进行增删改查,此时会出现一些问题
  1. 脏读(数据过时了)
  • 在一个事务中读取了另一个未提交事务的数据。这意味着读取的数据可能是不正确的、不一致的或者“脏”的,因为这些数据可能随时会被回滚,导致之前读取到的数据无效。
  • 例如,事务A读取了事务B未提交的数据,但事务B后来可能由于某种原因回滚了,那么事务A读取到的数据就是“脏”的,因为它基于了永远不会在数据库中实际存在的数据。
  • 解决办法:给写操作加锁
    在进行修改操作的时候,不能进行读操作
  1. 不可重复读
  • 当一个事务在读取某个数据项后,在该事务还未结束时,另一个并发事务修改或删除了这个数据项,并提交了修改。这时,如果第一个事务再次读取这个数据项,就可能会读取到已经被修改或不存在的数据,导致两次读取的结果不一致。
  • 例如:假设有一个银行账户,初始余额为1000元。事务A开始并读取账户余额,看到是1000元。此时,事务B开始并执行了一个存款操作,向该账户存入了500元,然后提交了事务。如果事务A再次读取该账户的余额,它会发现余额已经变成了1500元,与之前的1000元不一致。这就是“不可重复读”的一个例子,因为事务A在两次读取之间看到了不一致的数据。
  • 解决办法:给读操作加锁
    在进行读取操作时,其他事务不能修改它正在读的数据
  1. 幻读
  • 相当于“不可重复读”的特殊情况
  • 它发生在一个事务读取了几行数据后,另一个并发事务插入或删除了一些行,然后第一个事务再次读取同样的数据范围时,发现出现了“幻影”行或某些行消失了。
  • 例如,假设有一个事务正在读取一个范围内的订单数据,它先读取了10行数据。此时,另一个事务插入了一个新的订单到这个范围内。当第一个事务再次执行相同的查询时,它会发现现在有11行数据,多出来的这一行就像是“幻影”一样突然出现了。
  • 解决办法:串行化
    每个事务都必须等待前一个事务完成后才能开始执行,这样可以确保事务之间不会互相干扰,从而保持数据的一致性和完整性。

               2.隔离级别

  • 可通过配置文件来设置当前服务器的隔离级别的级别
  • 不同的隔离级别会使事物之间并发执行的影响产生不同的差别,从而影响到上述三个问题的情况
  • 四个隔离级别
  1. read uncommitted:读未提交
  • 一个事物可以读取另一个事务未提交的数据,此时就可能会产生“脏读”、“不可重复读”和“幻读”三种问题。
  • 但此时,多个事务并发执行程度最高的。(速度最快
  1. read committed:读已提交
  • 一个事物只能读取另一个事务提交后的数据(给写操作加锁了),此时可能会产生“不可重复读“和“幻读“问题。(“脏读“问题解决了
  • 此时,并发程度降低执行速度变慢,同时也称为:事物之间的隔离型提高
  1. repeatable read:可重复读
  • 事务在开始时创建一个快照,事务内的查询都是基于这个快照进行的,从而确保了在同一个事务内多次读取相同数据时会看到一致的结果。相当于是给“写操作”和“读操作”都加锁了。此时可能产生“幻读”问题(“脏读”和“不可重复读”问题解决了
  • 并发程度进一步降低执行速度进一步变慢,事物之间的隔离性进一步提高
  1. serializable:串行化
  • 它要求事务串行执行,即事务之间不会并发执行,所有的事务都是在服务器上一个接一个的执行,从而避免了“脏读”、“不可重复读”和“幻读”的所有问题。
  • 并发程度最低执行速度最慢隔离型最高数据最准确


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
MySQL底层概述—9.ACID与事务
本文介绍了数据库事务的ACID特性(原子性、一致性、隔离性、持久性),以及事务控制的演进过程,包括排队、排它锁、读写锁和MVCC(多版本并发控制)。文章详细解释了每个特性的含义及其在MySQL中的实现方式,并探讨了事务隔离级别的类型及其实现机制。重点内容包括:ACID特性(原子性、持久性、隔离性和一致性的定义及其实现方式)、事务控制演进(从简单的全局排队到复杂的MVCC,逐步提升并发性能)、MVCC机制(通过undo log多版本链和Read View实现高效并发控制)、事务隔离级别(析了四种隔离级别(读未提交、读已提交、可重复读、可串行化)的特点及适用场景)、隔离级别与锁的关系。
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
450 9
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
291 80
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
MySQL原理简介—9.MySQL索引原理
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
MySQL底层概述—6.索引原理
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
123 22
 MySQL秘籍之索引与查询优化实战指南
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
104 7
MySQL事务日志-Undo Log工作原理分析
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等