当前位置: 首页 > news >正文

MySQL InnoDB引擎 MVCC

MVCC(Multi-Version Concurrency Control)即多版本并发控制,是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作,从而提高了数据库的并发性能。

一、原理

MVCC 的核心思想是通过保存数据在某个时间点的快照来实现并发控制。

在 MVCC 模型下,每个事务在启动时会看到一个数据库的一致性视图,该视图是由事务启动时数据库中所有已提交事务的状态决定的。

事务只能看到在其启动之前,已经提交的事务所做的更改,而看不到在其启动之后其他事务的未提交更改或新插入的数据,这样就避免了脏读、不可重复读等问题。

二、实现方式

InnoDB 存储引擎通过几个关键要素来实现 MVCC,包括隐藏列、回滚段(undo log)、事务 ID 和一致性视图(Read View)。

1. 隐藏列

InnoDB 为表中的每一行记录添加了三个隐藏列:

  • DB_TRX_ID:记录最近一次对该记录进行修改(INSERT、UPDATE)的事务 ID。当一个事务对记录进行插入操作时,会将自己的事务 ID 赋值给该记录的 DB_TRX_ID 列。

  • DB_ROLL_PTR:回滚指针,指向该记录的上一个版本所在的回滚段(undo log)。当对记录进行修改时,会将修改前的记录版本信息存储在回滚段中,并通过 DB_ROLL_PTR 指针指向该版本。

  • DB_ROW_ID:如果表中没有定义主键且没有唯一的非空索引,InnoDB 会自动为表添加一个隐藏的自增主键 DB_ROW_ID

2. 回滚段(undo log)

回滚段用于存储记录的旧版本信息。当一个事务对记录进行修改时,会将修改前的记录版本信息存储在回滚段中,并通过 DB_ROLL_PTR 指针将当前记录与旧版本记录连接起来,形成一个版本链。通过版本链,我们可以找到记录在不同时间点的所有版本。

在 MySQL InnoDB 引擎中,回滚段(undo log)的合理配置对于数据库的性能、事务处理以及数据恢复等方面都至关重要。

关键配置参数

1. innodb_undo_logs

  • 作用:该参数用于设置 InnoDB 存储引擎中回滚段的数量。在 MySQL 5.6 及以后的版本中,默认值通常为 128 个。增加回滚段的数量可以提高并发事务处理能力,因为多个事务可以同时使用不同的回滚段,减少了回滚段的竞争。

  • 配置示例:若要将回滚段数量设置为 256,可以在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中添加或修改如下配置:

[mysqld]
innodb_undo_logs = 256

2. innodb_undo_tablespaces

  • 作用:此参数用于指定回滚段所在的表空间数量。从 MySQL 5.6 开始,InnoDB 支持将回滚段存储在独立的表空间中,这样可以更好地管理回滚段的空间。设置多个回滚段表空间可以分散 I/O 负载,提高性能。

  • 配置示例:假设要将回滚段存储在 3 个独立的表空间中,可在配置文件中添加:

[mysqld]
innodb_undo_tablespaces = 3

3. innodb_max_undo_log_size

  • 作用:该参数限制了单个回滚段文件的最大大小。当回滚段文件达到这个大小后,InnoDB 会尝试回收不再使用的 undo log 空间。如果无法回收足够的空间,可能会导致事务等待或报错。

  • 配置示例:若要将单个回滚段文件的最大大小设置为 2GB,可以在配置文件中添加:

[mysqld]
innodb_max_undo_log_size = 2G

4. innodb_undo_log_truncate

  • 作用:这是一个布尔型参数,用于控制是否启用回滚段文件的截断功能。当设置为 ON 时,InnoDB 会在合适的时机自动截断回滚段文件,释放不再使用的空间。默认值为 OFF

  • 配置示例:若要启用回滚段文件截断功能,可在配置文件中添加:

[mysqld]
innodb_undo_log_truncate = ON

配置建议

  • 根据并发情况调整回滚段数量:如果数据库中有大量的并发事务,适当增加 innodb_undo_logs 的值可以减少回滚段的竞争,提高并发性能。但过多的回滚段也会增加系统管理的开销,需要根据实际情况进行权衡。

  • 使用独立的回滚段表空间:将回滚段存储在独立的表空间中(通过设置 innodb_undo_tablespaces)可以提高 I/O 性能,尤其是在高并发场景下。

  • 合理设置回滚段文件大小innodb_max_undo_log_size 的设置需要考虑数据库的事务大小和频率。如果事务较大或频繁,可适当增大该值;反之,则可以减小。

  • 启用回滚段文件截断功能:对于长期运行的数据库,启用 innodb_undo_log_truncate 可以有效地管理回滚段的空间,避免回滚段文件无限增长。

3. 事务 ID

每个事务在启动时会被分配一个唯一的事务 ID,事务 ID 是一个单调递增的整数。通过比较事务 ID 的大小,我们可以判断事务的先后顺序。

4. 一致性视图(Read View)

一致性视图是 MVCC 的关键机制之一,它是一个事务在启动时生成的,用于判断当前事务可以看到哪些版本的记录。一致性视图中包含了以下几个重要信息:

  • 低水位(trx_ids_min):当前所有活跃事务中最小的事务 ID。

  • 高水位(trx_ids_max):生成该视图时系统分配的下一个事务 ID。

  • 活跃事务列表(trx_ids):生成该视图时所有活跃事务的事务 ID 列表。

5. 工作流程

MVCC 的工作流程主要涉及读操作和写操作:

读操作

当一个事务要读取某条记录时,会根据记录的 DB_TRX_ID 和一致性视图的信息来判断是否可以看到该记录的当前版本。具体规则如下:

  • 如果 DB_TRX_ID < trx_ids_min,即最近修改数据的事务 ID 小于 当前所有活跃事务的最小事务 ID,表示该记录的修改事务在当前事务启动之前已经提交,当前事务可以看到该记录的当前版本。

  • 如果 DB_TRX_ID >= trx_ids_max,即最近修改数据的事务 ID 大于等于 生成该视图时系统分配的下一个事务 ID,表示该记录的修改事务在当前事务启动之后才启动,当前事务看不到该记录的当前版本,需要通过 DB_ROLL_PTR 指针查找旧版本。

  • 如果 trx_ids_min <= DB_TRX_ID < trx_ids_max,需要判断 DB_TRX_ID 是否在活跃事务列表 trx_ids 中:

    • 如果在列表中,表示该记录的修改事务在当前事务启动时还未提交,当前事务看不到该记录的当前版本,需要通过 DB_ROLL_PTR 指针查找旧版本。

    • 如果不在列表中,表示该记录的修改事务在当前事务启动时已经提交,当前事务可以看到该记录的当前版本。

写操作

当一个事务要对某条记录进行修改时,会将修改前的记录版本信息存储在回滚段中,并更新记录的 DB_TRX_ID 和 DB_ROLL_PTR 列。具体步骤如下:

  1. 将修改前的记录版本信息复制到回滚段中。

  2. 更新记录的 DB_TRX_ID 列,将其设置为当前事务的事务 ID。

  3. 更新记录的 DB_ROLL_PTR 指针,使其指向回滚段中存储的旧版本记录。

  4. 对记录进行实际的修改操作。

通过这种方式,写操作会创建一个新的数据版本,而不会影响其他事务对旧版本的读取。不同事务可以在不同的版本上进行操作,从而实现了读写操作的并发执行。

综上所述,MVCC 通过隐藏列、回滚段、事务 ID 和一致性视图等机制,实现了读写操作的并发执行,提高了数据库的并发性能,同时保证了数据的一致性。不同的事务隔离级别会影响一致性视图的生成和使用方式,从而实现不同程度的数据隔离。

三、对比

MVCC(多版本并发控制)和传统的锁机制都是数据库中用于实现并发控制的重要技术,它们各自具有独特的优缺点,以下是详细对比:

优点对比

MVCC
  • 高并发性能

    • MVCC 允许多个事务在不同版本的数据上进行读写操作,避免了大部分情况下的读写锁冲突。读操作可以直接读取数据的历史版本,无需等待写操作释放锁,写操作也不会阻塞读操作,从而显著提高了数据库的并发处理能力。例如,在一个高并发的电商系统中,大量用户同时进行商品信息的查询(读操作)和订单的创建(写操作),MVCC 可以让这些操作并行执行,减少用户的等待时间。

  • 实现事务隔离

    • 能够方便地实现不同的事务隔离级别,如读已提交(Read Committed)和可重复读(Repeatable Read)。通过一致性视图(Read View),事务可以看到特定时间点的数据快照,保证了数据的一致性和隔离性。在可重复读隔离级别下,一个事务在整个生命周期内多次读取同一数据时,会看到相同的结果,避免了不可重复读和部分幻读问题。

  • 减少死锁概率

    • 由于读操作通常不需要加锁,减少了锁的使用,从而降低了死锁发生的可能性。死锁是传统锁机制中常见的问题,当多个事务相互等待对方释放锁时,就会导致死锁的发生。MVCC 的使用使得事务之间的锁竞争减少,系统的稳定性得到提高。

传统锁机制
  • 强一致性保证

    • 传统锁机制可以提供严格的一致性保证,确保在同一时间只有一个事务可以访问或修改数据。在串行化隔离级别下,通过对数据加锁,保证了事务的串行执行,避免了任何并发问题,如脏读、不可重复读和幻读,适用于对数据一致性要求极高的场景,如金融交易系统。

  • 精确控制并发

    • 可以精确地控制事务对数据的访问权限,根据不同的业务需求选择不同类型的锁(如共享锁、排他锁)和加锁粒度(如行锁、表锁)。例如,在某些情况下,需要对整个表进行锁定以确保数据的完整性,传统锁机制可以很方便地实现这一点。

缺点对比

MVCC
  • 占用额外存储空间

    • 为了保存数据的多个版本,MVCC 需要使用回滚段(undo log)来存储旧版本信息,这会占用额外的磁盘空间。随着数据的不断更新和版本的增加,回滚段的空间开销会逐渐增大,需要进行定期的清理和管理。

  • 回滚段管理开销

    • 对回滚段的管理需要额外的系统资源和时间开销。包括回滚段的分配、回收以及过期版本的清理等操作,都会影响数据库的性能。如果回滚段管理不当,可能会导致性能下降或空间浪费。

  • 不支持完全序列化隔离

    • MVCC 不能完全实现序列化隔离级别,在某些情况下可能会出现幻读问题。虽然在可重复读隔离级别下可以避免大部分幻读,但在极端情况下,仍然可能需要使用额外的锁机制来解决幻读问题。

传统锁机制
  • 低并发性能

    • 传统锁机制会导致读写操作之间的锁竞争,当多个事务同时访问相同的数据时,会出现大量的锁等待现象,降低了数据库的并发性能。例如,一个写操作对数据加了排他锁,其他事务的读操作和写操作都需要等待该锁释放,从而导致系统响应时间变长。

  • 死锁风险高

    • 由于锁的使用,多个事务之间可能会形成循环等待锁的情况,从而导致死锁的发生。死锁的检测和处理需要额外的系统开销,并且会影响事务的正常执行,降低系统的可靠性。

  • 锁粒度选择困难

    • 选择合适的锁粒度是一个难题。如果锁粒度太粗(如表锁),会导致并发性能下降;如果锁粒度太细(如行锁),会增加锁的管理开销和死锁的风险。在实际应用中,需要根据具体的业务场景和数据访问模式来选择合适的锁粒度。

相关文章:

MySQL InnoDB引擎 MVCC

MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制&#xff0c;是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作&#xff0c;从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...

【Elasticsearch】simple_query_string

Elasticsearch 的simple_query_string查询是一种灵活且容错性较强的查询方式&#xff0c;它允许用户通过简单的语法构造查询字符串&#xff0c;以实现对文档的搜索。以下是关于simple_query_string查询的详细说明&#xff1a; 1.基本概念 simple_query_string查询是一种基于字…...

数据结构 04

4. 栈 4.2. 链式栈 4.2.1. 特性 逻辑结构&#xff1a;线性结构 存储结构&#xff1a;链式存储结构 操作&#xff1a;创建&#xff0c;入栈&#xff0c;出栈&#xff0c;清空&#xff0c;获取 4.2.2. 代码实现 头文件 LinkStack.h #ifndef __LINKSTACK_H__ #define __LINKST…...

Java并发中的上下文切换、死锁、资源限制

在Java并发编程中&#xff0c;上下文切换、死锁和资源限制是开发者经常需要面对的问题。这些问题不仅会影响程序的性能&#xff0c;还可能导致程序无法正常运行。本文将深入探讨这些问题的原理、影响以及如何在实际开发中避免或解决它们。 目录 1. 上下文切换&#xff08;Con…...

DeepSeek教unity------MessagePack-01

MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍&#xff0c;并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩——一种极其快速的压缩算法。性能在诸如游戏、分布式计算、微服务或数据缓存等应用中尤为重要。 这个库通过 NuGe…...

【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用

ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展&#xff0c;大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练&#xff0c;能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...

泰勒公式推导以及常用展开式与近似计算

泰勒公式的基本思想是通过函数在某点的导数来逐渐构建一个多项式&#xff0c;该多项式能够近似函数在该点附近的值。我们通过一次次引入导数来改进近似&#xff0c;从而得到一个无限级数的展开。 准备工作&#xff1a;函数的定义和导数 假设我们有一个函数 f ( x ) f(x) f(x)…...

深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现

1. A2DP概述 A2DP&#xff08;Advanced Audio Distribution Profile&#xff09;是一种高质量音频流媒体协议&#xff0c;旨在实现高质量音频内容的分发&#xff0c;通常用于通过蓝牙设备传输音频数据&#xff0c;例如将音乐从便携式播放器传输到耳机或扬声器。与传统的蓝牙语…...

STM32引脚VBAT和RTC的关系

一、RTC简介 1、RTC (Real Time Clock)&#xff1a;实时时钟。RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器&#xff0c;在相应的软件配置下&#xff0c;可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。RTC还包含用于管理低功耗模式的自动唤醒单…...

untiy 3d 混合动画

1.创建动画控制器 挂在到人物模型上 效果 20250213_170924...

django配置跨域

1、第一种 from django.views.decorators.csrf import csrf_exemptcsrf_exempt第二种 安装 pip install django-cors-headers在配置文件settings.py进入 INSTALLED_APPS [..."corsheaders", # 添加 ]MIDDLEWARE [corsheaders.middleware.CorsMiddleware, # 添加…...

【设计模式】【行为型模式】迭代器模式(Iterator)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

前端面试题目---页面抖动的原因、如何避免、如何解决

前端页面抖动是一个常见且影响用户体验的问题&#xff0c;下面将从抖动发生的场景、解决办法以及预防措施三个方面进行详细阐述。 页面抖动发生的场景 1. 元素尺寸动态变化 图片加载&#xff1a;当页面中图片的宽高没有预先设定&#xff0c;在图片加载完成后&#xff0c;其实…...

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展&#xff0c;大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世&#xff0c;为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、…...

将Sqlite3数据库挂在内存上处理

创作灵感&#xff1a;最近把小学生的口算题从2位数改到3位数&#xff0c;100以内四则运算练习&#xff08;千纬数学&#xff09;再次更新&#xff0c;选取难题-CSDN博客要不断刷题目&#xff0c;以前100以内的加减乘除也是这样刷出来的&#xff0c;代码如下&#xff1a; impor…...

#用于跟踪和反映数据源对象的变化--useMagical

import { cloneDeep } from lodash-es import { reactive, ref, watchEffect } from vue /*** 神奇函数* param source 数据源,* param initKey 固定需要返回的属性* description 收集数据源中修改的属性,并返回* version 1.0 仅支持对象* author sufei* return { source, resu…...

基于微信小程序的场地预约设计与实现

第3章 系统设计 3.1系统设计目标 本系统的实现可以帮助体育馆场地信息的管理。帮助管理员对注册用户管理以及用户预约管理。同时可以帮助用户进行场地预约。本系统可以实现用户足不出户预约到需要的场地&#xff0c;为用户提供场地信息了解的平台。 3.2系统功能结构图 本系统的…...

1446. 连续字符 简单

1446. 连续字符https://leetcode.cn/problems/consecutive-characters/ 给你一个字符串 s &#xff0c;字符串的「能量」定义为&#xff1a;只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1&#xff1a; 输入&#xff1a;s "leetcode"…...

多张图片合成PDF

昨天接了一个家教&#xff0c;在网上搜集了一些图片格式的素材&#xff0c;但想要发给学生家长打印&#xff0c;都是图片格式可能不太方便&#xff0c;就想着合成pdf文件之后再发给家长。 试用了“samll*”一次&#xff0c;就需要充值vip了&#xff0c;所以就用python自己写了…...

【办公】钉钉修改默认存储位置,释放C盘空间

Step1: 右击钉钉图标选择设置 Step2: 通用里面找到文件保存位置&#xff0c;修改文件目录: 最新版本钉钉界面&#xff1a; 设置完成后按提示重启即可&#xff01;...

VLLM历次会议(2024.7)

支持LLama3.1&#xff1a; 量化&#xff1a; vllm git下的子项目&#xff1a;llm-compressor CPU offloading 允许跑更大的模型&#xff1b;会变慢些&#xff1b;在CPU-GPU之间有NVLink的机器上&#xff0c;变慢的幅度小。 新增对Medusa&#xff08;用1个Head并行推出好几个…...

进程等待与进程替换

目录 一、进程等待 1.1 为什么要等待子进程&#xff1f; 1.2 等待的两种方式 1.2.1 wait函数 1.2.2 waitpid函数 1.3 获取子进程的退出状态 1.4 示例代码 阻塞式等待&#xff08;同步&#xff09; 非阻塞等待&#xff08;异步&#xff09; 二、进程替换 2.1 什么是进…...

C# CultureInfo 地区影响字符串

问题 线上遇到有玩家资源加载异常&#xff0c;发现资源路径出现异常字符&#xff1a; 发现是土耳其语下字符串转小写不符合预期&#xff1a; "I".ToLower() -> ı 解决方案 String.ToLower 改成 String.ToLowerInvariant 全局修改禁用文化差异&#xff1a;ht…...

走进 Tcl 语言:历史、特性与应用

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测

代码地址&#xff1a;CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测&#xff0c;光伏功率预测 CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测&#xff0c;光伏功率预测 一、引言 1、研究背景和意义 光伏发电作为可再生能源的重要组成部分&#xff0c;近…...

使用MaxKB及deepseek搭建本地AI知识库

序 本文主要研究一下如何MaxKB及deepseek搭建本地AI知识库 步骤 拉取MaxKB镜像 docker pull cr2.fit2cloud.com/1panel/maxkb如果拉取不下来就用docker.1ms.run/1panel/maxkb 启动MaxKB docker run -d --namemaxkb --restartalways -p 8080:8080 \ -v ~/.maxkb:/var/lib/p…...

一文通俗理解为什么需要泛型以及泛型的使用

为什么需要泛型&#xff1f; public static void main(String[] args) {ArrayList list new ArrayList();// 由于集合没有做任何限定&#xff0c;任何类型都可以给其中存放list.add("abc");list.add("def");list.add(5);Iterator it list.iterator();wh…...

凸包算法—— cad c#二次开发

效果如下&#xff1a; 代码如下&#xff1a; using IfoxDemo; //[assembly: CommandClass(typeof(IFoxDemo.凸包class))]//只允许此类快捷键命令 namespace IFoxDemo {public class 凸包class{public static class 凸包助手{/// <summary>/// 计算点集的凸包并返回多段线…...

Eclipse JSP/Servlet 深入解析

Eclipse JSP/Servlet 深入解析 引言 随着互联网的快速发展,Java Web开发技术逐渐成为企业级应用开发的主流。在Java Web开发中,JSP(JavaServer Pages)和Servlet是两个核心组件,它们共同构成了Java Web应用程序的基础。本文将深入解析Eclipse平台下的JSP/Servlet技术,帮…...

grep如何排除多个目录?

在使用 grep 进行文本搜索时&#xff0c;有时候需要排除多个目录&#xff0c;避免在这些目录下进行搜索。下面介绍几种不同的实现方式。 目录 1.使用 -r 和 --exclude-dir 选项&#xff08;GNU grep&#xff09; 2.使用扩展正则表达式和 -P 选项&#xff08;GNU grep&#x…...

linux ollama deepseek等大语言模型的model文件的存储目录

linux ollama deepseek等大语言模型的model文件的存储目录 一、用ollama serve启动的&#xff0c;模型数据存放在&#xff1a; /usr/share/ollama/.ollama/models二、如果在自启动文件中指定了工作目录&#xff0c;则在工作目录下的.ollama/models 1.自启动服务 /etc/system…...

React进阶之React核心源码解析(二)

React核心源码解析 diff单一节点比较diff多节点比较diff两轮遍历比较第一轮比较第二轮比较 Update 状态更新Concurrent Mode diff 一共两个阶段 render&#xff1a;内存中的更新&#xff0c;主要是通过递归的过程&#xff0c;来将react变化的部分&#xff0c;在内存中找到哪些…...

八、OSG学习笔记-

前一章节&#xff1a; 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码&#xff1a; OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…...

Python实现随机森林(Random Forest)算法

随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;通过构建多个决策树并结合它们的预测结果来提高模型的准确性和稳定性。下面是一个使用Python实现随机森林算法的示例。我们将使用scikit-learn库&#xff0c;它提供了方便的接口来实现随机森林。 …...

平方数列与立方数列求和的数学推导

先上结论&#xff1a; 平方数列求和公式为&#xff1a; S 2 ( n ) n ( n 1 ) ( 2 n 1 ) 6 S_2(n) \frac{n(n1)(2n1)}{6} S2​(n)6n(n1)(2n1)​ 立方数列求和公式为&#xff1a; S 3 ( n ) ( n ( n 1 ) 2 ) 2 S_3(n) \left( \frac{n(n1)}{2} \right)^2 S3​(n)(2n(n1)​…...

new和malloc的区别

new malloc流程 new new流程 调用operator new 分配内存&#xff1a;在free store 生成对象 free store 可能在 堆 / 自定义的地方 可以认为虚拟内存到物理内存的映射关系早已完成 若分配内存失败&#xff08;内存空间不够&#xff09;&#xff0c;抛出std::bad_alloc 异常…...

JVM——垃圾回收算法

目录 垃圾回收算法 评价标准&#xff1a; 标记-清除算法&#xff1a; 复制算法&#xff1a; 标记-整理算法&#xff1a; 分代GC&#xff1a; arthas查看分代之后的内存情况&#xff1a; 垃圾回收算法 java是如何实现垃圾回收的呢&#xff1f;简单来说&#xff0c;垃圾回…...

算法日记16:SC68 联通块问题(并查集)

一、题目&#xff1a; 二、题解&#xff1a; 1、看到求联通块问题&#xff0c;我们可以考虑使用DFS/并查集(在这里我们仅介绍并查集) 2、什么是并查集&#xff1f; 2.1&#xff1a;初始化&#xff1a;对于每一个点&#xff0c;我们都对其进行初始化操作pre[i]i pre[i]表示i的…...

Unity-Mirror网络框架-从入门到精通之Pong示例

文章目录 前言示例介绍NetworkManagerPongBallPlayer总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计…...

c++ 多线程知识汇总

一、std::thread std::thread 是 C11 引入的标准库中的线程类&#xff0c;用于创建和管理线程 1. 带参数的构造函数 template <class F, class... Args> std::thread::thread(F&& f, Args&&... args);F&& f&#xff1a;线程要执行的函数&…...

探索 Text-to-SQL 技术:从自然语言到数据库查询的桥梁

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

Java NIO ByteBuffer 详解

什么是 ByteBuffer ByteBuffer 是 Buffer 的一个具体实现&#xff0c;专门用于存储和操作字节数据。它提供了高效的、基于内存的 I/O 数据处理方式。 Buffer 类是构建 Java NIO 的基础&#xff0c;其中 ByteBuffer 类是 Buffer 子类中最受欢迎的。这是因为字节类型是最通用的…...

【机器学习】简单线性回归算法及代码实现

线性回归算法 一、摘要二、线性回归算法概述三、损失函数的定义和衡量标准四、简单线性回归的求解和应用五、机器学习算法一般求解思路 一、摘要 本文讲解了线性回归算法的基础知识和应用&#xff0c;强调线性回归主要用于解决回归问题。通过分析房产价格与房屋面积的关系&…...

【前端开发】query参数和params参数的区别

在Web开发中&#xff0c;query参数&#xff08;URL查询参数&#xff09;和params参数&#xff08;路由参数&#xff09;是两种不同的URL传参方式&#xff0c;它们的核心区别如下&#xff1a; 一、 位置不同 query参数params参数位置URL中?之后&#xff0c;用&连接多个参数…...

人工智能数学基础学习PPT

学习视频&#xff1a;人工智能 -数学基础 文章目录 1.简介1.函数2.极限3.无穷小与无穷大4.连续性与导数5.偏导数6.方向导数7.梯度 2.微积分1.微积分基本想法2.微积分的解释3.定积分4.定积分性质5.牛顿-莱布尼茨公式 3.泰勒公式与拉格朗日1.泰勒公式2.一点一世界3.阶数的作用4.…...

企业文件防泄密软件哪个好?

在企业文件防泄密软件领域&#xff0c;天锐绿盾和中科数安都是备受认可的品牌&#xff0c;它们各自具有独特的特点和优势。 以下是对这两款软件的详细比较&#xff1a; 天锐绿盾 功能特点 集成性强&#xff1a;集成了文件加密、数据泄露防护DLP、终端安全管理、行为审计等数据安…...

美丽 百褶裙提示词 + MD

MD 参考教程&#xff1a;Marvelous Designer零基础教学&#xff0c;MD布料制作-百褶裙建模制作&#xff0c;次世代教学_哔哩哔哩_bilibili 【MD新手教程】30分钟教会你制作百褶裙&#xff0c;Marvelous Designer超简单入门案例教程_哔哩哔哩_bilibili 【c4d技术解析】MD百褶裙…...

解释和对比“application/octet-stream“与“application/x-protobuf“

介绍 在现代 Web 和分布式系统的开发中&#xff0c;数据的传输和交换格式扮演着关键角色。为了确保数据在不同系统之间的传输过程中保持一致性&#xff0c;MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;被广泛应用于描述数据的格式和内容类型。在 …...

基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 系统建模 4.2 YALMIP工具箱 4.3 CPLEX工具箱 5.完整工程文件 1.课题概述 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真。通过YALMIP和cplex这两个工具箱&#xff0c;完成微电网的最优调…...

AI前端开发技能提升与ScriptEcho:拥抱AI时代的前端开发新范式

随着人工智能技术的飞速发展&#xff0c;AI前端开发岗位对技能的要求也水涨船高。越来越多的企业需要具备AI相关知识和高级前端开发能力的工程师&#xff0c;这使得传统的前端开发模式面临着巨大的挑战。如何提升开发效率&#xff0c;降低人力成本&#xff0c;成为了摆在所有前…...