MySQL提升

news2025/6/7 6:50:30

事务

事务:在多个操作合在一起视为一个整体。要么就不做、要么就做完。

事务应该满足ACID

  • A : 原子性。不可分割。
  • C : 一致性。追求的目标,在开始到结束没有发生预定外的情况。
  • I : 隔离性。不同的事务是独立的。
  • D : 持久性。系统崩溃,数据依然要存在。

AID是为了C。

我们之前一直在使用事务

@@autocommit 为1,说明启用了自动提交属性,每个SQL指令都单独看成是一个事务。

在开两个命令窗口对同一个表进行一次操作,不会出现一个进行到一半另一个窗口指令执行的现象,因为每个SQL指令都单独看为一个事务。

让多个SQL指令合成一个事务

begin;/start transaction;   开启事务

写各种指令

commit;事务完成

rollback;事务回滚(放弃该事务前面所作的所有操作)

开启事务后,一定要以事务完成或者事务回滚结束本次事务。

用了begin;后面的每单独一条指令不是事务(非原子操作)。

接下来演示事务回滚与事务完成

准备一张表:

 

事务回滚

 开两个窗口,在左窗口begin;后执行更改数据,右窗口此时查看的是旧数据。

随后左窗口执行rollback;事务回滚到begin;现在数据没有进行更改。

事务完成

同样使用两个窗口

在左窗口执行begin;后,执行数据更改,此时右窗口查看到的依然是旧数据。

左窗口随后执行commit;完成事务,这时候右窗口再进行查看,查看到的为更改完成后的数据。 

事务的隔离性

不同的事务彼此之间是独立的

多个事务同时执行,有可能会操作同一份数据,会产生竞争条件。若是像进程线程一样采用锁,会导致粒度过大,因为数据库的数据存在磁盘上,对锁的操作时间过长。在数据库领域,访问共享资源(磁盘数据)的时间很长,我们需要对锁机制做更加精细的管理,我们希望尽量让同时运行的时间越长越好。

首先需要做的是对并发带来的问题,按严重程度进行分级。

并发带来的问题

最严重 --> 最不严重问题:脏写 -> 脏读 ->  不可重复读  ->  幻读

脏写

 对于t2来说没有实现隔离性,在任何情况下,脏写都是不可接受的。

解决方案:让第二次write操作会阻塞,直到第一次事务结束。

脏读

整个过程顺利完成了,但是在事务进行中某个过程t2读出的数据不满足一致性。 在一致性要求不高的场景下是可以接受的。

解决问题:只能读到已经提交的旧数据,不能读到最新还未提交的数据。

不可重复读

一个事务内部先后两次读取,数据不一致。不会造成严重后果,在t2看起开很奇怪。

解决方案:只要进行读就加锁,不让别人更改。

幻读

 

在一个事务当中连续读取多次数据,第一次读取到的内容在第二次读取中保持不变,但是会读取到其他数据。

隔离级别

为了实现隔离性,我们需要解决并发带来的问题。

  • 读未提交(READ UNCOMMITTED)
  • 读已提交(READ COMMITTED)
  • 可重复读  (REPEATABLE READ)
  • 串行化  (SERIALIZABLE)

查看隔离级别(注:每个窗口的隔离级别是不一样的,若要更改,每个窗口都要单独执行更改隔离级别的指令)@@开头的为系统变量。

 

读未提交

更改隔离级别为读未提交

当右一方提交新数据时,其他方对该数据的updata会被阻塞。

解决了脏写问题

没有解决脏读问题

读已提交

更改隔离级别为读已提交

 解决了脏读问题,没有解决不可重复读问题

可重复读

这是默认的隔离级别

 

解决了不可重复读问题,第一次和第二次读到的内容一定是一样的。这是一种比较高的隔离级别。

如果一边insert into ,看上去没有幻读,但是紧接着insert into,触发约束,说明幻读依旧存在。

串行化

等价于mutex

解决了幻读问题,但是可能导致效率低。做任何读或者写都可能卡住。

性能

查询条件不一样导致查询时间相差很多倍。

 

数据在数据库中的存储方式

磁盘IO页大小一般为16KB

可使用select  @@innodb_page_size查看

数据在磁盘当中按行存储的,在同一个磁盘页中,数据是有序的,按照主键排序。

特点:

  • 数据按行存储
  • 多行可以串联成一个链表
  • 行是有顺序的,按主键排序的(可以使用二分查找定位,时间复杂度O(logN)) 

 数据存储在多个磁盘页时,需要再分配磁盘页用来存储其他磁盘页的位置。

 左侧称为数据IO页,右侧称为索引IO页。

现在数据量进一步增大,一个索引页不够存储,此时需要新的索引页。同时为这一级的索引页再添加索引页。此时的结构称为B+树。

 

 B+树

  • 所有的非叶子节点都是索引页,所有的叶子节点都是数据页
  • 数据是有序的
  • 查询次数(将数据从磁盘加载到内存中的次数)由树的高度决定

主键自带B+树的索引,查找速度很快,因为B+树按照主键排序。按照其他查找,只能通过遍历树来实现,速度很慢。

索引项的大小一般是固定的,一般一个索引页可以放1600个索引项。一个表中的数据最好不要超过两千万,此时树的高度可能增长到四层,导致所有的查询操作变慢。

索引

额外的数据结构,用来做快速查找,可以由以下几种数据结构考虑:

线性表 O(N)

哈希表 O(1)

  • 消耗空间大
  • 适合做等值查询,不适合做范围查询

排序树 O(logN)

  • 二叉排序树 树的高度容易过高
  • 多叉排序树 B(B-)树、B+树

LSM tree

  • 是一种专门为写入密集型场景优化的分层存储结构,将随机写入转换为顺序写入,显著提升系统写入效率

查看当前索引

这里的BTREE实际上是B+树。

新建索引

建立一个索引,number_idx是索引名,(number)是索引的依据

 引入索引之后速度变快

新建索引 的叶子节点不存放所有数据,里面只存放新索引和主键,消耗的磁盘空间小。根据新索引找到查找内容的主键,再通过主键在旧索引中查找。

  • 聚簇索引:主键是聚簇的,把行的值放入索引结构内部
  • 非聚簇索引: 新建的索引,把行的地址或主键放入索引结构内部

mysql只有一个聚簇索引。非聚簇索引要经过两次索引查找擦能找到查询的内容,速度比聚簇索引略慢。

 移除索引

移除索引后,查找速度显著变慢

 组合索引

索引关注多列。

 索引时遵循最左优先原则,如在上例中,先看c3、再看c2、最后看c1。

索引的分类

  • 按数据结构分类:哈希/B树/B+树
  • 聚簇索引:把行的值放入索引结构内部(主键是聚簇的)
  • 非聚簇索引:把行的地址或主键放入索引结构内部
  • 单列索引:看一个值
  • 组合索引:看多个值,遵循最左优先原则

覆盖索引

有下图的表,主键为id,number是非聚簇索引

分析下列三种查找效率

  1. select  id,number  from  ……  where  number  = 123;
  2. select  data   from  ……  where  number  =  123;
  3. select  *  from ……  where  number  =  123;

非聚簇索引中仅存储了行地址、主键以及number值,而第一次查找仅依赖非聚簇索引即可完成,称之为覆盖索引。

三次查找速度对比:

  • 第一次操作速度最快
  • 第二次、第三次要多做一次回表(到聚簇中去查询)操作

索引的坏处

  • 消耗额外的空间
  • 查询速度快,但是插入、修改、删除时间变长
  • 随着时间的推移,索引的结构会产生碎片,索引是需要维护的

性能考虑

自动增长的整数作为主键比不会重复的随机数做主键要好。因为自动增长的整数,每次会按序进入B+树,即使需要节点合并、分裂操作也在偏向于叶子节点的位置,对B+树更加友好。

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

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

相关文章

go语言的锁

本篇文章主要讲锁,主要会涉及go的sync.Mutex和sync.RWMutex。 一.锁的概念和发展 1.1 锁的概念 所谓的加锁和解锁其实就是指一个数据是否被占用了,通过Mutex内的一个状态来表示。 例如,取 0 表示未加锁,1 表示已加锁&#xff…

VUE解决页面请求接口大规模并发的问题(请求队列)

方案1: 请求队列 // RequestQueue.js export default class RequestQueue {constructor(maxConcurrent) {this.maxConcurrent maxConcurrent; // 最大并发请求数this.currentConcurrent 0; // 当前并发请求数this.queue []; // 请求队列this.requestId 0; // …

IDEA安装迁移IDEA配置数据位置

需求 因为C盘有清空风险,需要把IDEA(2025)安装位置以及配置数据都挪到D盘。 安装 到官网下载安装包 安装,这里可以改下安装位置 这几个选项随意,然后一直下一步就好 完成后重启或不重启都随意 迁移数据 初次安…

Blazor-表单提交的艺术:如何优雅地实现 (下)

在上一章节中我们使用HTML的方式介绍了如何在Blazor框架下进行表单的提交&#xff0c;而在Blazor框架中也为我们内置了<EditForm>组件来代替原始的HTML,<form>&#xff0c;下面我们将对<EditForm>的用法进行讲解&#xff0c;并将两种表单方式进行对比&#x…

五子棋网络对战游戏的设计与实现设计与实现【源码+文档】

五子棋网络对战游戏的设计与实现 摘 要 在现代社会中,及其它无线设备越来越多的走进普通老百姓的工作和生活。随着3G技术的普及与应用&#xff0c;基于Java开发的软件在上的使用非常的广泛&#xff0c;增值服务的内容也是越来越多&#xff0c;对丰富人们的生活内容、提供快…

Vue基础(14)_列表过滤、列表排序

Array.prototype.filter()【ES5】 filter() 方法创建给定数组一部分的浅拷贝&#xff0c;其包含通过所提供函数实现的测试的所有元素。 语法&#xff1a; filter(callbackFn) filter(callbackFn, thisArg) 参数&#xff1a; callbackFn(回调函数)&#xff1a;为数组中的每个元…

Spring Boot项目中JSON解析库的深度解析与应用实践

在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为轻量级的数据交换格式&#xff0c;已成为前后端通信的核心桥梁。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供了对多种JSON库的无缝集成支持。本文将深入探讨Spring B…

我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店

自从接触了Amazon Q&#xff0c;我陆陆续续写了不少小软件&#xff0c;其中这个项目是一个典型的例子&#xff0c;自己平时来使用&#xff0c;也分享给一些 NAS 爱好者来用。 故事还要用上次折腾黑群晖说起&#xff0c;本意想把 NAS 和打印机共享二合一的&#xff0c;所以把闲着…

Django CMS 的 Demo

以下是关于 Django CMS 的 Demo 示例及相关资源的整理 安装与运行 Django CMS 示例 使用 djangocms-installer 快速创建 Django CMS 项目&#xff1a; pip install django_cms djangocms -p . mysite安装记录 pip install django-cms Looking in indexes: https://pypi.tun…

在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标

目标 UE5的蓝图的事件图表里面&#xff0c;有一个模块&#xff08;节点&#xff09;如图&#xff0c;这是一个设置Actor的location和rotation量的模块&#xff0c;其中需要接收一个Target作为输入&#xff0c;这个Target应该就是一个在map中具备location和rotation信息的实例化…

适用于vue3的大屏数据展示组件库DataV(踩坑版)

踩坑版 如果按照官网(https://datav-vue3.jiaminghi.com/)的vue3安装有问题 官网是将dataview/datav-vue3 安装为本地依赖 npm install dataview/datav-vue31、跑起来报错&#xff08;报错信息忘记保留了&#xff09; 有人说找到node_modules&#xff0c; 安装成功后会有这个…

基于3D对象体积与直径特征的筛选

1&#xff0c;目的 筛选出目标3D对象。 效果如下&#xff1a; 2&#xff0c;原理 使用3D对象的体积与直径特征进行筛选。 3&#xff0c;代码解析 3.1&#xff0c;预处理2.5D深度图。 * 参考案例库&#xff1a;select_object_model_3d.hdev * ****************************…

DJango项目

一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…

excel数据对比找不同:6种方法核对两列数据差异

工作中&#xff0c;有时需要核对两列数据的差异&#xff0c;用于对比、复核等。数据较少的情况下差异肉眼可见&#xff0c;数据量较大时用什么方法比较好呢&#xff1f;从个人习惯出发&#xff0c;我整理了6种方法供参考。 6种方法核对两列数据差异&#xff1a; 1、Ctrl G定位…

基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略

股票市场涉及众多统计数据和模式。股票交易基于研究和数据驱动的决策。人工智能的使用可以实现流程自动化&#xff0c;让投资者在研究上花费更少的时间&#xff0c;同时提高准确性。这使他们能够更加专注于监督实际交易和服务客户。 顶尖对冲基金经理发挥着至关重要的作用&…

MySQL数据库基础(二)———数据表管理

前言 上篇文章介绍了MySQL数据库以即数据库的管理 这篇文章将给大家讲解数据表的管理 一、数据表常见操作 数据表常见操作的指令 进入数据库use数据库&#xff1b; 查看当前所有表&#xff1a;show tables; 创建表结构 1.创建表操作 1.1创建表 create table 表名(列名 …

RDMA简介5之RoCE v2队列

在RoCE v2协议中&#xff0c;RoCE v2队列是数据传输的最底层控制机制&#xff0c;其由工作队列&#xff08;WQ&#xff09;和完成队列&#xff08;CQ&#xff09;共同组成。其中工作队列采用双向通道设计&#xff0c;包含用于存储即将发送数据的发送队列&#xff08;SQ&#xf…

SAFe/LeSS/DAD等框架的核心适用场景如何选择?

在敏捷开发的规模化实践中&#xff0c;SAFe&#xff08;Scaled Agile Framework&#xff09;、LeSS&#xff08;Large Scale Scrum&#xff09;和DAD&#xff08;Disciplined Agile Delivery&#xff09;是三大主流框架。它们分别以不同的哲学和方法论应对复杂性、协作与交付的…

window查看SVN账号密码

背景 公司的SVN地址发生迁移&#xff0c;想迁移一下本地SVN地址&#xff0c;后来发现SVN账号密码忘记了。写此文章纯记录。 迁移SVN地址&#xff1a; 找到svn目录点击relocate&#xff0c;输入新的svn地址&#xff0c;如需输入账号密码&#xff0c;输入账号密码即完成svn地址…

前端项目初始化

​​​​​​ 目录 1. 安装 nvm 2. 配置 nvm 并切换到 Node.js 16.15.0 3. 安装 LightProxy 代理 4. GIT安装 1. 配置用户名和邮箱&#xff08;这些信息将用于您在提交代码时的标识&#xff09;&#xff1a; 2. 生成SSH密钥&#xff08;用于将本地代码仓库与远程存储库连…