MySQL提升
事务
事务:在多个操作合在一起视为一个整体。要么就不做、要么就做完。
事务应该满足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是非聚簇索引
分析下列三种查找效率
- select id,number from …… where number = 123;
- select data from …… where number = 123;
- select * from …… where number = 123;
非聚簇索引中仅存储了行地址、主键以及number值,而第一次查找仅依赖非聚簇索引即可完成,称之为覆盖索引。
三次查找速度对比:
- 第一次操作速度最快
- 第二次、第三次要多做一次回表(到聚簇中去查询)操作
索引的坏处
- 消耗额外的空间
- 查询速度快,但是插入、修改、删除时间变长
- 随着时间的推移,索引的结构会产生碎片,索引是需要维护的
性能考虑
自动增长的整数作为主键比不会重复的随机数做主键要好。因为自动增长的整数,每次会按序进入B+树,即使需要节点合并、分裂操作也在偏向于叶子节点的位置,对B+树更加友好。
相关文章:

MySQL提升
事务 事务:在多个操作合在一起视为一个整体。要么就不做、要么就做完。 事务应该满足ACID A : 原子性。不可分割。C : 一致性。追求的目标,在开始到结束没有发生预定外的情况。I : 隔离性。不同的事务是独立的。D : 持久性。系统崩溃,数据依然…...
hbase资源和数据权限控制
hbase适合大数据量下点查 https://zhuanlan.zhihu.com/p/471133280 HBase支持对User、NameSpace和Table进行请求数和流量配额限制,限制频率可以按sec、min、hour、day 对于请求大小限制示例(5K/sec,10M/min等),请求大小限制单位如…...
VMWare下设置共享文件,/mnt/hgfs下却不显示共享文件的解决方法
一、共享文件夹设置步骤 打开虚拟机设置:右键点击虚拟机 → 选择 “设置” → 切换到 “选项” 标签页 → 点击 “共享文件夹”启用共享功能:选择 “总是启用”(确保虚拟机已关闭或处于运行状态)添加共享文件夹: 点击…...

go语言的锁
本篇文章主要讲锁,主要会涉及go的sync.Mutex和sync.RWMutex。 一.锁的概念和发展 1.1 锁的概念 所谓的加锁和解锁其实就是指一个数据是否被占用了,通过Mutex内的一个状态来表示。 例如,取 0 表示未加锁,1 表示已加锁ÿ…...
C++11完美转发
在 C11 之前,泛型函数在传递参数时无法保证参数的原始类型(左值或右值)导致额外的拷贝或移动操作,完美转发是一种高效传递技术,能够保持参数的原始特性,避免额外的性能开销 完美转发是指在泛型编程中以参数…...

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框架下进行表单的提交,而在Blazor框架中也为我们内置了<EditForm>组件来代替原始的HTML,<form>,下面我们将对<EditForm>的用法进行讲解,并将两种表单方式进行对比&#x…...

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

Vue基础(14)_列表过滤、列表排序
Array.prototype.filter()【ES5】 filter() 方法创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素。 语法: filter(callbackFn) filter(callbackFn, thisArg) 参数: callbackFn(回调函数):为数组中的每个元…...

Spring Boot项目中JSON解析库的深度解析与应用实践
在现代Web开发中,JSON(JavaScript Object Notation)作为轻量级的数据交换格式,已成为前后端通信的核心桥梁。Spring Boot作为Java生态中最流行的微服务框架,提供了对多种JSON库的无缝集成支持。本文将深入探讨Spring B…...

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

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

在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标
目标 UE5的蓝图的事件图表里面,有一个模块(节点)如图,这是一个设置Actor的location和rotation量的模块,其中需要接收一个Target作为输入,这个Target应该就是一个在map中具备location和rotation信息的实例化…...
Android 之 kotlin 语言学习笔记四(Android KTX)
一、Android KTX 简介 Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此,这些扩展程序利用了多种 Kotlin 语言功能,其中包括&…...

适用于vue3的大屏数据展示组件库DataV(踩坑版)
踩坑版 如果按照官网(https://datav-vue3.jiaminghi.com/)的vue3安装有问题 官网是将dataview/datav-vue3 安装为本地依赖 npm install dataview/datav-vue31、跑起来报错(报错信息忘记保留了) 有人说找到node_modules, 安装成功后会有这个…...
mysql实现分页查询
文章目录 mysql实现分页查询1. 使用LIMIT和OFFSET2. 使用计算OFFSET的函数(适用于动态分页)3. 使用MySQL的变量(适用于存储过程) 获取所有用户数据并分页 mysql实现分页查询 在MySQL中实现分页查询,通常我们会使用LIM…...
Flink checkpoint
对齐检查点 (Aligned Checkpoint) Flink 的分布式快照机制受到 Chandy-Lamport 算法的启发。 其核心元素是数据流中的屏障(Barrier)。 Barrier 注入 :JobManager 中的 Checkpoint Coordinator 指示 Source 任务开始 Checkpoint。Source 任务…...
【java】在springboot中实现证书双向验证
证书生成 public static void main(String[] args) throws Exception {// 生成密钥对KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);KeyPair keyPair keyPairGenerator.generateKeyPair();// 获取私…...
CppCon 2015 学习:Functional Design Explained
这两个 C 程序 不完全相同。它们的差异在于对 std::cout 的使用和代码格式。 程序 1: #include <iostream> int main(int argc, char** argv) {std::cout << "Hello World\n"; }解释:这个程序是 正确的。std::cout 是 C 标准库中…...

基于3D对象体积与直径特征的筛选
1,目的 筛选出目标3D对象。 效果如下: 2,原理 使用3D对象的体积与直径特征进行筛选。 3,代码解析 3.1,预处理2.5D深度图。 * 参考案例库:select_object_model_3d.hdev * ****************************…...
GIT - 如何从某个分支的 commit创建一个新的分支?
如果上一个Release 分支被污染了,想要还原这个分支最原始的样子,有什么办法或者说该怎么办呢?简单来说,就是如何从某个指定的 commit 创建一个新的 Git 分支? 操作非常简单! 命令格式 git branch <ne…...
Claude vs ChatGPT vs Gemini:功能对比、使用体验、适合人群
随着AI应用全面进入生产力场景,市面上的主流AI对话工具也进入“三国杀”时代: Claude(Anthropic):新锐崛起,语言逻辑惊艳,Opus 模型被称为 GPT-4 杀手ChatGPT(OpenAI)&a…...
线程基础编程
早期的计算机只能执行一个任务,一旦任务完成,计算机就会等待下一个任务。这种模型效率低下,无 法充分利用计算机的性能。 随着计算机技术的发展,操作系统开始支持多进程模型,即同时执行多个任务。每个任务被称为一个进…...

DJango项目
一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…...
深入了解JavaScript当中如何确定值的类型
JavaScript是一种弱类型语言,当你给一个变量赋了一个值,该值是什么类型的,那么该变量就是什么类型的,并且你还可以给一个变量赋多种类型的值,也不会报错,这就是JavaScript的内部机制所决定的,那…...

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

基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略
股票市场涉及众多统计数据和模式。股票交易基于研究和数据驱动的决策。人工智能的使用可以实现流程自动化,让投资者在研究上花费更少的时间,同时提高准确性。这使他们能够更加专注于监督实际交易和服务客户。 顶尖对冲基金经理发挥着至关重要的作用&…...

MySQL数据库基础(二)———数据表管理
前言 上篇文章介绍了MySQL数据库以即数据库的管理 这篇文章将给大家讲解数据表的管理 一、数据表常见操作 数据表常见操作的指令 进入数据库use数据库; 查看当前所有表:show tables; 创建表结构 1.创建表操作 1.1创建表 create table 表名(列名 …...
如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验
目录 -1.前言0.预备知识1.创建一个新的Game Feature Plugin插件2.创建Lyra Pawn Data Asset3. 创建Lyra Experience Definition4. 创建自定义关卡5. 设置资产管理器Asset Manager引用6. 创建Lyra User Facing Experience Definition7. 在编辑器中运行测试后记-1.前言 由于转职…...