首页 > 数据库 >MySQL 的索引和事务

MySQL 的索引和事务

时间:2024-10-13 09:10:50浏览次数:7  
标签:事务 并发 -- 索引 MySQL 数据 节点

MySQL 的索引事务

1. 索引

首先知道两个事情

  1. 索引 是一种 特殊的文件 ,包含对数据表所有记录的 指针 像目录
  2. 一个表是可以产生多个索引的
  3. 关键字是 index

索引的作用:

  1. 用于快速定位和检索

    我们都知道 mySQL 每次的查询都会 遍历一遍这个列 利用好索引可以快速的 定位检索数据

  2. 数据库中 表 数据 索引之间的关系 类似于 书架中 图书 书中内容 目录 之间的作用

  3. 索引是一种 牺牲空间 提高时间的 一种 效率工具

1.1 使用

创建表时 创建主键约束 唯一约束 外键约束 都会自动创建 对应列的 索引

  • 查看索引

    show index from 表名;
    
  • 创建索引

    create index 索引名 on 表名(字段名);
    

    创建班级表中 name字段的索引

    create index idx_classes_name on classes(name);
    

    创建索引的时候,需要针对现有数据,进行大规模的重新整理

    所以创建索引操作也是一个 危险操作

    创建索引 都是在创建表的时候规划好的,一旦表已经使用很久 有很多数据了 再修改索引 就要慎重了

  • 删除索引

    drop index 索引名 on 表名;
    

​ 删除的时候 只能删除 手动创建的索引 不能删除 自动删除的索引

移花接木

如果真的有需要 修改索引 删除或者创建

我们可以先搞一个新的机器 创建空表 把旧机器的 数据导入到新机器 然后再新机器替换旧机器

1.2 索引的本质

数据库的索引 是一种 改进的 树形结构 B+树

首先大致了解一下 B 树 (N叉搜索树)

每个节点都有 m 个 key 划分出 m+1 个区间

进行查询的时候就可以直接从根结点出发 , 判定当前要查的数据 在节点上的 哪一个区间中 决定下一步往哪里走

进行添加/删除元素的时候 就涉及到了 结点的拆分和 节点的合并

B + 树 是 B 树的改进

也是一个 N 叉搜索树

  1. 每个节点都有 N 个 key 划分为 N 个 区间

  2. 每个节点上的最后一个 相当于 当前子树 的最大值

  3. 父节点上的每一个 key 都会以最大值的身份出现在相对应的区间子树中 (key 会重复出现) 也就意味着 叶子这一层包含了所有整个树 的数据集

  4. B+树 用类似于链表的结构 将叶子节点串联起来

    此时就可以很方便的完成数据集合的遍历

    并且 按照所需范围 从数据集合中取出一个 子集

image-20241012104537463

B + 树的优点:(相对于 B树)

  1. N叉搜索树 书的高度优先 降低了 Io次数

  2. 非常擅长范围查询

  3. 所有查询最后都会落到叶子中 查询和查询之间的时间开销是稳定的

    对于 B 树来说 要查询的元素 再 层次比较高的 节点 就很快 如果在比较下面的层次 就比较慢

  4. 行数据 存储到 叶子节点上 所以叶子节点会 非常占用空间

    把 非叶子节点 缓存在 内存中 可以进一步减少 io的访问次数

2. 事务

事务可以把 多个 sql 打包成整体

可以保证这些 sql 要么全部都执行 要么就 “一个都不执行”

看起来是 “一个都不执行” 其实是 执行了 发现出错后 对数据进行了 回滚的 操作

可以理解成是 翻新

这样的特点 也称为 “原子性” 表示 不可拆分的情况

事务的特性:

  1. 原子性 :打包数据 可以通过回滚的方式 回到初状态

  2. 一致性 :让数据不会太离谱 通过数据库的约束 来完成

  3. 持久性 :事务所做出的修改 都是在硬盘中 持久保存的 重启服务器,数据依旧存在

  4. 隔离性 :

    并发执行:多个客户端会让数据库执行事务 当客户端1 提交事务1 执行了一般 客户端2 提交的事务2 也来了

    数据库这时 需要同时 处理 这两个事务

    并发程度越高,整体效率就越高

    但同时 也存在一定的问题 导致数据错误的情况

    并发执行可能出现的问题:

    1. 脏读问题

      一个事务A正在写数据的过程中,另一个事务读取了同一个数据

      接下来 事务A 又修改了数据 导致 B 之前读到的数据 是一个 无效的数据/过时的数据

      (如果一个一个执行 就不会出现问题)

      解决脏读问题:针对 写操作 进行加锁 ,让 写操作 写完以后 再读 ,并发程度降低

    2. 不可重复读

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

      解决不可重复读问题:针对 读操作 进行枷锁,让 读的过程中不能写

      并发程度有进一步降低了,隔离性也进一步提高了,效率降低了,数据准性又提高了

    3. 幻读(是不是问题 要具体场景具体分析)

      在 锁了 写操作和 读操作 之后 一个事务A执行的过程中 ,两次读取操作,数据内容没变但是 结果集变了(可以理解成 多了一份不同的数据集)

      解决:映入串行化的方式 ,保持一个绝对的串行执行事务,此时完全没有并发了,效率是最低的 数据是最准确的 同时 隔离性是最高的

2.1 使用

  1. 开始 事务

    start transaction;
    

    开启事务后 后面所写的 sql 都会被打包 拥有“原子性”

  2. 执行多条 sql 语句

  3. 回滚/提交 : rollback/commit

    这里是 主动出发回滚 一般要搭配一些 条件判断逻辑来使用的

回滚 是怎么做到的?

​ 日志的方式 ,记录事务中的关键操作,这样的纪律就是回滚的依据

3. 隔离级别

效率 正确性 ====> 不同的需求场景就有不同的需求

比如 转账 支付 这一些列和钱相关的场景 宁愿牺牲效率 也要保证正确性

短视频 转发 点赞 这些 数量要求不高 就可以 牺牲正确性来 增加效率

mySQL 服务器也提供了“隔离级别“让我们针对隔离成都进行设置

-- 并发程度最高,速度最快,隔离性最低,准确性最低
read uncommitted;-- 读未提交
-- 引入写枷锁 只能读写完之后的版本 解决脏读问题 
-- 并发程度降低,速度降低,隔离性提高,准确性也提高
read committed; -- 读已提交
-- 引入读枷锁以及写枷锁 写的时候不可读 读的时候不可写 解决不可重复读问题
-- 并发程度进一步降低,速度降低,隔离性提高,准确性也提高
repeatable read; -- 可重复读
-- 严格按照 串行 的方式进行 一个一个的执行事务
-- 没有并发,速度最低,隔离性最高,准确性也最高
serializable; -- 串行化

标签:事务,并发,--,索引,MySQL,数据,节点
From: https://www.cnblogs.com/ljy2003/p/18461880

相关文章

  • Java项目:高校心理辅导系统(java+SpringBoot+Vue+elementui+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于Springboot+vue高校心理教育辅导设计与实现本系统分为前后台,包含管理员、学生、教师三种角色,前台为学生、教师登录,后台为管理员、学生、教师分别登录。前台主要功能:首页、心理健康学习、试卷列表、公告通知、留言反馈、......
  • Java项目:母婴商城系统(java+SpringBoot+Mybaits+Vue+elementui+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于Springboot+vue的母婴商城系统本系统分为前后台,包含管理员、用户两种角色,前台为普通用户登录,后台为管理员、用户分别登录。前台主要功能:首页、商品信息、商品资讯、用户登录、用户注册、用户个人中心、我的订单、我的地......
  • Java项目:房产销售系统(java+SpringBoot+Mybaits+Vue+elementui+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于Springboot+vue的房产销售系统本系统分为前后台,包含管理员、用户、销售经理三种角色,前台为普通用户登录,后台为管理员、用户、销售经理分别登录。前台主要功能:首页、房源信息、用户登录、用户注册、用户个人中心、我的收......
  • 20241012 mysql查漏补缺
    2024/10/12mysql查漏补缺1.联合索引什么时候会失效[联合索引]遵循最左前缀法则NO1​ 如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效​ 对于最左前缀法则指的是,查询时,最左边......
  • 外链建设对搜索引擎优化的作用
    在搜索引擎优化(SEO)中,外链建设是一个重要的环节。外链,也称为反向链接,是指其他网站链接到你的网站。本文将探讨外链建设对搜索引擎优化的作用,以及如何有效地进行外链建设。1.提高网站权威性高质量的外链可以提高你网站的权威性。当权威网站链接到你的网站时,搜索引擎会认为你的......
  • python3 mysql 连接
    python3mysql连接脚本#-*-coding:utf-8-*-#importMySQLdb,sys,osimportpymysqlasMySQLdb,sys,osimportos,sys,traceback#importMySQLdb.cursors#importmysql.connectordefsingleton(cls):instances={}defget_instance():ifcls......
  • Docker中Mysql容器内如何执行SQL文件?
    Docker中Mysql容器内如何执行SQL文件?查看当前运行的容器dockerps拷贝sql文件到mysql容器中sudodockercp/root/sqlfile/423d23129a6b:/home/temp将sqlfile文件夹下的init.sql数据库拷贝到【423d23129a6b容器】下的/home/temp/文件夹下。进入mysql容器内部dockerex......
  • 不一样的事务
    事务处理几乎在每一个信息系统中都会涉及,它存在的意义是为了保证系统中所有的数据都是符合期望的,且相互关联的数据之间不会产生矛盾,即数据状态的一致性。按照数据库的经典理论,要达成这个目标,需要三方面共同努力来保障。原子性(Atomic):在同一项业务处理过程中,事务保证了对多个数......
  • MySQL命令rebootClusterFromCompleteOutage重启集群注意事项
    rebootClusterFromCompleteOutage()是MySQLShell中的一个实用命令,用于在InnoDB集群遇到完全中断(例如,当组复制在所有成员实例上停止时)后重新配置和恢复集群。这个命令允许你连接到集群中的一个MySQL实例,并使用该实例的元数据来恢复整个集群。在MySQLShell中使用rebootClust......
  • MySQL 读写分离
    优质博文:IT-BLOG-CN一、背景随着机票业务不断增长,订单库的读性能遇到了挑战,因此对订单库进行读写分离操作。主要目的是提高数据库的并发性能和可扩展性。当系统的所有写操作效率尚可,读数据请求效率较低时,比如之前订单表存放了几千万条数据,且查询订单信息需要关联十几个字......