InnoDB 引擎核心知识点

InnoDB 引擎核心知识点


6.1 逻辑存储结构

在这里插入图片描述

  • 表空间(Tablespace):所有数据逻辑上存储在一个表空间中,物理上可能由多个文件组成。
  • 段(Segment):分为数据段(B+树叶子节点)、索引段(B+树非叶子节点)、回滚段(Undo Log)。
  • 区(Extent):由连续的页组成,每个区固定为 1MB(64个16KB的页)。
  • 页(Page):InnoDB的最小存储单元,默认 16KB
  • 行(Row):数据按行存储,支持行级锁。
-- 示例:查看页大小(默认16KB)
SHOW VARIABLES LIKE 'innodb_page_size';

6.2 架构

6.2.1 概述

MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发 中使用非常广泛。下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构。

在这里插入图片描述

在左侧的内存结构中,主要分为这么四大块儿: Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer。 接下来介绍一下这四个部分。

InnoDB架构分为 内存结构磁盘结构,通过后台线程协调工作。

6.2.2 内存结构

  1. Buffer Pool(缓冲池)核心组件,缓存数据和索引页。

    InnoDB存储引擎基于磁盘文件存储,访问物理硬盘和在内存中进行访问,速度相差很大,为了尽可能 弥补这两者之间的I/O效率的差值,就需要把经常使用的数据加载到缓冲池中,避免每次访问都进行磁 盘I/O。

    在InnoDB的缓冲池中不仅缓存了索引页和数据页,还包含了undo页、插入缓存、自适应哈希索引以及 InnoDB的锁信息等等。

    在这里插入图片描述

    缓冲池 Buffer Pool,是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增 删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频 率刷新到磁盘,从而减少磁盘IO,加快处理速度。

    缓冲池以Page页为单位,底层采用链表数据结构管理Page。根据状态,将Page分为三种类型:

    • free page:空闲page,未被使用。

    • clean page:被使用page,数据没有被修改过。

    • dirty page:脏页,被使用page,数据被修改过,也中数据与磁盘的数据产生了不一致。

    在专用服务器上,通常将多达80%的物理内存分配给缓冲池 。参数设置: show variables like ‘innodb_buffer_pool_size’;

    在这里插入图片描述

    -- 示例:查看Buffer Pool大小
    SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
    
  2. Change Buffer(写缓冲):缓存非唯一索引的变更,减少磁盘IO。

    Change Buffer,更改缓冲区(针对于非唯一二级索引页),在执行DML语句时,如果这些数据Page 没有在Buffer Pool中,不会直接操作磁盘,而会将数据变更存在更改缓冲区 Change Buffer 中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中。

    Change Buffer的意义是什么呢?

    先来看一幅图,这个是二级索引的结构图:

    在这里插入图片描述

    Change Buffer的意义是什么?

    与聚集索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引。同样,删除和更新 可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO。有了 ChangeBuffer之后,我们可以在缓冲池中进行合并处理,减少磁盘IO。

  3. Adaptive Hash Index(自适应哈希索引):自动为频繁访问的数据创建哈希索引。

    在这里插入图片描述

    自适应hash索引,用于优化对Buffer Pool数据的查询。MySQL的innoDB引擎中虽然没有直接支持 hash索引,但是给我们提供了一个功能就是这个自适应hash索引。因为前面我们讲到过,hash索引在 进行等值匹配时,一般性能是要高于B+树的,因为hash索引一般只需要一次IO即可,而B+树,可能需 要几次匹配,所以hash索引的效率要高,但是hash索引又不适合做范围查询、模糊匹配等。

    InnoDB存储引擎会监控对表上各索引页的查询,如果观察到在特定的条件下hash索引可以提升速度, 则建立hash索引,称之为自适应hash索引。

    自适应哈希索引,无需人工干预,是系统根据情况自动完成。

    参数: adaptive_hash_index

  4. Log Buffer(日志缓冲):存储Redo Log的缓冲区,定期刷盘。(如果有一台Mysql的服务器,那么一般80%的内存一般都会分配给缓存池,以此来提高Myql的执行效率。)

    在这里插入图片描述

    Log Buffer:日志缓冲区,用来保存要写入到磁盘中的log日志数据(redo log 、undo log), 默认大小为 16MB,日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除许多行的事 务,增加日志缓冲区的大小可以节省磁盘 I/O。

    参数:

    innodb_log_buffer_size:缓冲区大小

    innodb_flush_log_at_trx_commit:日志刷新到磁盘时机,取值主要包含以下三个:

    1: 日志在每次事务提交时写入并刷新到磁盘,默认值。

    0: 每秒将日志写入并刷新到磁盘一次。

    2: 日志在每次事务提交后写入,并每秒刷新到磁盘一次。

6.2.3 磁盘结构

  1. 系统表空间(ibdata1):存储元数据、Undo Log、Double Write Buffer。

    系统表空间是更改缓冲区的存储区域。如果表是在系统表空间而不是每个表文件或通用表空间中创建 的,它也可能包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog等)

    在这里插入图片描述

    参数:innodb_data_file_path

    在这里插入图片描述

    **系统表空间,默认的文件名叫 ibdata1。

  2. 用户表空间(.ibd文件):每个表独立存储数据和索引

    File-Per-Table Tablespaces

    如果开启了innodb_file_per_table开关 ,则每个表的文件表空间包含单个InnoDB表的数据和索 引 ,并存储在文件系统上的单个数据文件中。 开关参数:innodb_file_per_table ,该参数默认开启。

    在这里插入图片描述

    那也就是说,我们每创建一个表,都会产生一个表空间文件,如图:

    在这里插入图片描述

  3. 通用表空间: General Tablespaces

    通用表空间,需要通过 CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空 间。

    A. 创建表空间

     CREATE TABLESPACE ts_name  ADD  DATAFILE  'file_name' ENGINE = engine_name;
    

    在这里插入图片描述

    B. 创建表时指定表空间

    CREATE  TABLE  xxx ...  TABLESPACE  ts_name;
    

    在这里插入图片描述

  4. Undo Log(回滚日志):保证事务原子性,用于回滚和MVCC。

    Undo Tablespaces

    撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储 undo log日志。

    5). Temporary Tablespaces InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。

    6). Doublewrite Buffer Files 双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件 中,便于系统异常时恢复数据。

    7). Redo Log 重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所 有修改信息都会存到该日志中, 用于在刷新脏页到磁盘时,发生错误时, 进行数据恢复使用。 以循环方式写入重做日志文件,

    涉及两个文件:

    在这里插入图片描述

    前面我们介绍了InnoDB的内存结构,以及磁盘结构,那么内存中我们所更新的数据,又是如何到磁盘 中的呢? 此时,就涉及到一组后台线程,接下来,就来介绍一些InnoDB中涉及到的后台线程。

6.2.4 后台线程

  • Master Thread:负责异步刷盘、合并写缓冲等核心任务。
  • IO Thread:处理异步IO请求(如Redo Log写入)。
  • Purge Thread:清理Undo Log中无用的数据。
  • Page Cleaner Thread:协助刷新脏页。

6.3 事务原理

6.3.1 事务基础

1). 事务 事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 (例如:银行转账)

2). 特性

• 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

• 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。(数据+约束的一致性)

• 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

• 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

那实际上,我们研究事务的原理,就是研究MySQL的InnoDB引擎是如何保证事务的这四大特性的。

在这里插入图片描述

而对于这四大特性,实际上分为两个部分。 其中的原子性、一致性、持久化,实际上是由InnoDB中的 两份日志来保证的,一份是redo log日志,一份是undo log日志。 而持久性是通过数据库的锁, 加上MVCC(多版本并发控制)来保证的。

在这里插入图片描述

我们在讲解事务原理的时候,主要就是来研究一下redolog,undolog以及MVCC。

  • ACID特性:原子性(Undo Log)、持久性(Redo Log)、隔离性(锁+MVCC)、一致性(前三者共同保证)。
  • 事务隔离级别:READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ(默认)→ SERIALIZABLE。

6.3.2 Redo Log

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用。

如果没有redolog,可能会存在什么问题的? 我们一起来分析一下。

我们知道,在InnoDB引擎中的内存结构中,主要的内存区域就是缓冲池,在缓冲池中缓存了很多的数 据页。 当我们在一个事务中,执行多个增删改的操作时,InnoDB引擎会先操作缓冲池中的数据,如果 缓冲区没有对应的数据,会通过后台线程将磁盘中的数据加载出来,存放在缓冲区中,然后将缓冲池中 的数据修改,修改后的数据页我们称为脏页。 而脏页则会在一定的时机,通过后台线程刷新到磁盘 中,从而保证缓冲区与磁盘的数据一致。 而缓冲区的脏页数据并不是实时刷新的,而是一段时间之后 将缓冲区的数据刷新到磁盘中,假如刷新到磁盘的过程出错了,而提示给用户事务提交成功,而数据却没有持久化下来,这就出现问题了,没有保证事务的持久性。

(buffer pool 存储的数据。只是当前屏幕上显示的数据, 修改它, 只是为了让屏幕上显示的数据进行变更。)

在这里插入图片描述

那么,如何解决上述的问题呢?(数据缓存池的脏数据丢失,导致应该持久化的数据无法持久化。) 在InnoDB中提供了一份日志 redo log,接下来我们再来分析一 下,通过redolog如何解决这个问题

在这里插入图片描述

有了redolog之后,当对缓冲区的数据进行增删改之后,会首先将操作的数据页的变化,记录在redo log buffer中。在事务提交时,会将redo log buffer中的数据刷新到redo log磁盘文件中(循环型,每隔一段时间就会清理,并不会永久保留下来,因为持久化完成之后这块的数据就没必要存在了。)。 过一段时间之后,如果刷新缓冲区的脏页到磁盘时,发生错误,此时就可以借助于redo log进行数据 恢复,这样就保证了事务的持久性。 而如果脏页成功刷新到磁盘 或 或者涉及到的数据已经落盘,此 时redolog就没有作用了,就可以删除了,所以存在的两个redolog文件是循环写的。

那为什么每一次提交事务,要刷新redo log 到磁盘中呢,而不是直接将buffer pool中的脏页刷新到磁盘呢 ? 因为在业务操作中,我们操作数据一般都是随机读写磁盘的,而不是顺序读写磁盘。 而redo log在 往磁盘文件中写入数据,由于是日志文件,所以都是顺序写的。顺序写的效率,要远大于随机写。 这 种先写日志的方式,称之为 WAL(Write-Ahead Logging:先写日志)。

小结:

  • 作用发生脏页数据丢失,也能保证事务持久性,记录物理修改(如页的变更)。

  • 写入流程:事务提交时,Redo Log先写入日志文件,再异步刷盘。

    事务提交 → Redo Log Buffer → 刷盘(fsync)→ 持久化
    

6.3.3 Undo Log(解决事务原子性)

回滚日志,用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚(保证事务的原子性) 和 MVCC(多版本并发控制) 。

undo log和redo log记录物理日志不一样,它是逻辑日志。(物理日志:mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更)可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的 update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。(key:反向的日志,目的是为了方便事务的回滚

Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些 日志可能还用于MVCC。

Undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的 rollback segment 回滚段中,内部包含1024个undo log segment。

  • 作用保证事务原子性,提供回滚功能,记录逻辑反向操作(如INSERT对应DELETE)。
  • 其他用途支持MVCC,提供历史版本数据

6.4 MVCC(多版本并发控制)(高频面试题)

6.4.1 基本概念

1). 当前读(每一次读操作都会加锁)

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select … lock in share mode(共享锁),select … for update、update、insert、delete(排他锁)都是一种当前读。

  • 通过 版本链ReadView 实现非锁定读,解决读写冲突。

测试:

在这里插入图片描述

在测试中我们可以看到,即使是在默认的RR隔离级别下,事务A中依然可以读取到事务B最新提交的内 容,因为在查询语句后面加上了 lock in share mode 共享锁,此时是当前读操作。当然,当我们 加排他锁的时候,也是当前读操作。

2). 快照读(每一次读操作都不加锁)

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据, 不加锁,是非阻塞读。

• Read Committed:每次select,都生成一个快照读。

• Repeatable Read:开启事务后第一个select语句才是快照读的地方。

• Serializable:快照读会退化为当前读。

测试:

在这里插入图片描述

在测试中,我们看到即使事务B提交了数据,事务A中也查询不到。 原因就是因为普通的select是快照 读,而在当前默认的RR隔离级别下,开启事务后第一个select语句才是快照读的地方,后面执行相同 的select语句都是从快照中获取数据,可能不是当前的最新数据,这样也就保证了可重复读。

3). MVCC

全称 Multi-Version Concurrency Control,多版本并发控制。**指维护一个数据的多个版本, 使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。**MVCC的具体实现,还需 要依赖于数据库记录中的三个隐式字段、undo log日志、readView。

接下来,我们再来介绍一下InnoDB引擎的表中涉及到的隐藏字段 、undolog 以及 readview,从 而来介绍一下MVCC的原理。

6.4.2 隐藏字段

介绍

在这里插入图片描述

当我们创建了上面的这张表,我们在查看表结构的时候,就可以显式的看到这三个字段。 实际上除了 这三个字段以外,InnoDB还会自动的给我们添加三个隐藏字段及其含义分别是:

在这里插入图片描述

而上述的前两个字段是肯定会添加的, 是否添加最后一个字段DB_ROW_ID,得看当前表有没有主键, 如果有主键,则不会添加该隐藏字段。

文件名.ibd:独立表空间文件。

  • DB_TRX_ID:最近修改事务ID。
  • DB_ROLL_PTR:指向Undo Log中旧版本数据的(PTR:point是指针的简写)指针。

6.4.3 Undo Log版本链

6.4.3.1 介绍

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。 而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即 被删除。

6.4.3.2 版本链

有一张表原始数据为:

在这里插入图片描述

DB_TRX_ID : 代表最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID,是 自增的。 DB_ROLL_PTR : 由于这条数据是才插入的,没有被更新过,所以该字段值为null。

然后,有四个并发事务同时在访问这张表。

A. 第一步

在这里插入图片描述

当事务2执行第一条修改语句时,会记录undo log日志,记录数据变更之前的样子; 然后更新记录, 并且记录本次操作的事务ID,回滚指针,回滚指针用来指定如果发生回滚,回滚到哪一个版本。

在这里插入图片描述

B.第二步

在这里插入图片描述

当事务3执行第一条修改语句时,也会记录undo log日志,记录数据变更之前的样子; 然后更新记 录,并且记录本次操作的事务ID,回滚指针,回滚指针用来指定如果发生回滚,回滚到哪一个版本。

在这里插入图片描述

C. 第三步

在这里插入图片描述

当事务4执行第一条修改语句时,也会记录undo log日志,记录数据变更之前的样子; 然后更新记 录,并且记录本次操作的事务ID,回滚指针,回滚指针用来指定如果发生回滚,回滚到哪一个版本。

在这里插入图片描述

最终我们发现,不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条 记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

  • 每个行记录的多个版本通过 DB_ROLL_PTR 形成链表。

6.4.4 ReadView(版本链访问规则不用记,了解)

ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务 (未提交的)id。 ReadView中包含了四个核心字段:

在这里插入图片描述

而在readview中就规定了版本链数据的访问规则:

trx_id 代表当前undolog版本链对应事务ID。

在这里插入图片描述

不同的隔离级别,生成ReadView的时机不同:

READ COMMITTED :在事务中每一次执行快照读时生成ReadView。

REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

  • 关键字段m_ids(活跃事务ID列表)、min_trx_id(最小活跃事务ID)、max_trx_id(预分配事务ID)、creator_trx_id(当前事务ID)。
  • 可见性规则:根据事务ID判断数据版本是否可见。

6.4.5 原理分析

  • 快照读(如 SELECT):基于ReadView读取符合条件的历史版本。
  • 当前读(如 SELECT FOR UPDATE):读取最新版本并加锁。

重点总结

1.逻辑存储结构

表空间、段、区、页、行

2.架构

内存结构
磁盘结构

3.事务原理

原子性-undolog
持久性-redolog
一致性-undolog+redolog
隔离性-锁+MVCC

4.MVCC

记录隐藏字段、undolog版本链、readView

思维导图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++《红黑树》

在之前的篇章当中我们已经了解了基于二叉搜索树的AVL树,那么接下来在本篇当中将继续来学习另一种基于二叉搜索树的树状结构——红黑树,在此和之前学习AVL树类似还是通过先了解红黑树是什么以及红黑树的结构特点,接下来在试着实现红黑树的结构…

java实现coze平台鉴权+工作流调用(踩坑记录)

问题偏多建议大家看完文章后再开始实现 OAuth鉴权 https://www.coze.cn/open/docs/developer_guides/preparation https://www.coze.cn/open/docs/developer_guides/oauth_apps OAuth 授权码鉴权 https://www.coze.cn/open/docs/developer_guides/oauth_code 创建OAuth应…

2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)

龙卷风优化算法(Tornado optimizer with Coriolis force)是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”(IF:11.7)的2025年智能优化算法 01.引言 当自然界的狂暴之力,化身数字世界的智慧引擎&…

面试题分享-多线程顺序打印奇偶数

目录 1.题目详情 2.解题思路 2.1.分析题目 2.2.解析思路 3.代码实现 4.运行结果 1.题目详情 昨天刷抖音,遇到一个面试题,描述如下: 请使用两个线程,分别顺序交替打印奇数和偶数,直到10为止。例如有两个线程&#…

QuecPython 网络协议之TCP/UDP协议最祥解析

概述 IP 地址与域名 IP 地址是网络中的主机地址,用于两台网络主机能够互相找到彼此,这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示,如192.168.1.1。 ​ 我们日常访问的网站,其所在的服务器主机都有…

React - LineChart组件编写(用于查看每日流水图表)

一、简单版本 LineChart.tsx // src/component/LineChart/LineChart.tsx import React, {useEffect,useRef,useImperativeHandle,forwardRef,useMemo,useCallback, } from react; import * as echarts from echarts/core; import type { ComposeOption } from echarts/core; …

医学图像分割数据集肺分割数据labelme格式6299张2类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图像分辨率:1024x1024 图片数量(jpg文件个数):6299 标注数量(json文件个数):6299 标注类别数:2 标注类别名称:["leftl…

帕金森病致生活艰难,如何缓解心理负担?

你是否留意到身边有人手部不由自主地颤抖,且肢体变得僵硬,行动也愈发迟缓?这很可能是帕金森病的症状。帕金森病是一种常见的神经系统退行性疾病,多发生于中老年人。​ 静止性震颤往往是帕金森病的首发症状,患者在安静状…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.1自注意力机制(Scaled Dot-Product Attention)的逐行代码实现

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.1 自注意力机制(Scaled Dot-Product Attention)的逐行代码实现1. 自注意力机制的核心原理与数学表达1.1 注意力计算的三元组:`Q, K, V`2. 逐行代码实现与解析2.1 输入嵌入与权重矩阵初始化2.2 完…

机械臂【逆运动学】

回顾正运动学fk: IK: 几何法 代数法 六轴 456轴交再同一点 有解析解 下列公式为正运动学部分结论 a和d是长度 ,theta和alfa是角度 **疑问:alfa00? Z轴互相平行 ** 已知末端要在空间XYZ处如下 绿色项&#x…

IDEA批量替换项目下所有文件中的特定内容

文章目录 1. 问题引入2. 批量替换项目下所有文件中的特定内容2.1 右键项目的根目录,点击在文件中替换2.2 输入要替换的内容 3. 解决替换一整行文本后出现空行的问题4. 增加筛选条件提高匹配的精确度 更多 IDEA 的使用技巧可以查看 IDEA 专栏: IDEA 1. 问…

Ubuntu22.04美化MacOS主题

安装Tweaks 参考Ubuntu 22.04 桌面美化成Mac风格这篇更好点 sudo apt install gnome-tweaks gnome-shell-extensions -y安装macos主题 git clone https://github.com/vinceliuice/WhiteSur-gtk-theme.git # 进到文件目录 ./install.sh -t all -N glassy sudo ./tweaks.sh -g…

基于Python的机器学习入门指南

在当今数字化时代,机器学习(Machine Learning)已经成为科技领域中最热门的话题之一。它不仅改变了我们对数据的理解和处理方式,还在许多行业中得到了广泛应用,如金融、医疗、交通等。Python作为一门强大的编程语言&…

Python前缀和(例题:异或和,求和)

前缀和 前缀和:对于一个长度为n的列表a,前缀和为: sum[i]a[0]a[1]...a[i] 前缀和的性质: 第一条性质用于处理出前缀和: Sum[i]Sum[i-1]a[i] 第二条性质可以在O(l)的时间内求出区间和: a[l]....a[r] S…

统计矩的高阶推广:经验还是理论推导?

矩的发展既是经验总结的结果,也是数学理论推导的产物。研究者们在分析数据、描述物理现象的过程中,发现了低阶矩与日常物理概念(如质心、惯性)之间的紧密联系,而高阶矩的应用往往出现在更复杂的数学体系中,…

安宝特分享|AR智能装备赋能企业效率跃升

AR装备开启智能培训新时代 在智能制造与数字化转型浪潮下,传统培训体系正面临深度重构。安宝特基于工业级AR智能终端打造的培训系统,可助力企业构建智慧培训新生态。 AR技术在不同领域的助力 01远程指导方面 相较于传统视频教学的单向输出模式&#x…

《软件安装与使用教程》— NVIDIA CUDA在Windows的安装教程

《软件安装与使用教程》— NVIDIA CUDA在Windows的安装教程 Installed: - Nsight Monitor Not Installed: - Nsight for Visual Studio 2019 Reason: VS2019 was not found - Nsight for Visual Studio 2017 Reason: VS2017 was not found - Integrated Graphics Frame Debugge…

领域驱动设计(DDD)实践入门

文章目录 1.认识领域驱动设计1.1 简介1.2 发展历史1.3 DDD 的兴起 2.从一个简单案例2.1 转账需求2.2 设计的问题2.3 违反的设计原则 3.使用 DDD 进行重构抽象数据存储层抽象第三方服务抽象中间件封装业务逻辑重构后的架构 4.小结参考文献 1.认识领域驱动设计 1.1 简介 领域驱…

OrangePi 5B 内核开启 CONFIG_CIFS 通过 Samba 挂载 NAS 路径

文章目录 OrangePi 5B 内核开启 CONFIG_CIFS 通过 Samba 挂载 NAS 路径获取 Linux SDK 的源码从 github 下载 orangepi-build编译 linux 内核更新开发板内核上传编译好的 deb 包到开发板登录开发板,卸载旧内核安装新内核重启开发板 Ubuntu & Debian 系统下挂载 …

8662 234的和

8662 234的和 ⭐️难度:中等 🌟考点:模拟、二维前缀和 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int[] a ne…