【Mysql】详解InnoDB存储引擎以及binlog,redelog,undolog+MVCC
1.InnoDB存储引擎
在Mysql中,InnoDB存储引擎是默认的,也是我们最常用的一个存储引擎,其中分为内存结构和磁盘结构两大部分,整体架构图如下:
1.1Buffer Pool
Buffer pool(缓存区)是Mysql内存的一个主要区域,用于Innodb存储引擎访问表数据的时候,先把数据读取到Buffer pool中,相当于一个内存缓存,加快数据的处理速度。
1.1.2Buffer Pool的存储结构和内存淘汰机制
Buffer Pool中的数据毕竟是有限的,在内存空间满的时候,会淘汰最近最少使用的数据;
首先它分为俩大块区域:
-
New SubList:占用Buffer Pool的5/8的大小
-
Old SubList:占用Buffer Pool的3/8的大小
当有数据进入的时候,会进入New SubList的head位置 ,内部的数据单位是页,以链表的形式连接起来,最后不经常使用的数据随着时间的推移会慢慢的进入Old Sublist中,淘汰Old SubList的tail 区域;
1.2 Change Buffer
Change Buffer是针对操作二级索引(非聚簇索引) 的一个优化,针对DML的一个优化;
如果是操作的是二级索引,对应的数据没有在Buffer Pool中,那么不会立刻写到Buffer Pool中,会写入Change Buffer中做一个缓冲;等到后面,被修改的数据被读取的时候,那么将会把Change Buffer里面的数据合并到Buffer Pool中,这样可以减少磁盘IO次数,提高性能;
如果是一级索引,那么不会触发Change Buffer,直接在Buffer Pool中进行修改;
二级索引修改整体流程:
-
更新一条记录时,当该记录在Buffer Pool缓冲区中时,直接在Buffer Pool中修改对应的页,一次内存操作。(end)
-
如果该记录不在Buffer Pool缓冲区中时,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在Change Buffer中,不去磁盘做IO操作。。
-
当下次查询到该记录时,会将这个记录扔到Buffer Pool,然后Change Buffer会将和这个也有关的操作合并,进行修改。
如果数据到达了Change Buffer,还没来得及到达Buffer Pool,MySQL就宕机了,怎么办?
首先要清楚当一个事务提交之后,会将所有的更改记录记录到redolog中,包括Change Buffer中的数据,后续会根据redolog中的数据进行恢复;
1.3 AHI
AHI(自适应Hsah索引)是InnoDB中优化查询操作的功能,当某些索引值使用的频繁,那么可以建立Hash索引提高查询效率;
AHI功能默认自动开启,会从B+树 O(logn)-》O(1);
1.4 Log Buffer
Log Buffer 是存储写入磁盘上的日志文件一个内存区域,主要针对redo log;也是为了减少磁盘的IO次数,提供性能;
2. redo log
redo log(重做日志):是Innodb存储引擎独有的,当数据库宕机的时候,用来恢复数据(配合binlog),可以恢复近期的数据,保证之前还没有写入到磁盘的数据不会丢失,保证数据的持久性和完整性;
2.1 redo log 是怎么保证数据的完整
在Mysql中,在操作数据的时候,不会立刻落到磁盘中,而是会先放在Buffer Pool中/Change Buffer中,但是会优先放进log Buffer中,写入流程如下:
所有我们只需要知道第四步 log Buffer 是何时落入磁盘的即可;
Log Buffer 刷盘机制:
何时刷入磁盘,一般会根据参数:innodb_flush_log_at_trx_commit 0 1 2 设定
默认为1;
当为0情况:提交事务不会刷盘,只会根据后台提供的一个线程每秒去刷新到os的缓存中;
当为1的情况下:只要提交事务了,那么Log Buffer中的数据一定会在os的内存中,并且后台的线程也会慢慢刷到os的内存中,然后由内存也会强刷到磁盘中
当为2的情况下:提交事务后,Log Buffer中的数据一定为落到os的内存中;但os不会立刻刷到磁盘中,延迟写入;
1
:事务提交后日志会立即刷写到操作系统内存,并强制刷新到磁盘,保证数据的持久性,但会牺牲一定的性能。2
:事务提交后日志会立即刷写到操作系统内存,但不会强制刷新到磁盘,依赖操作系统异步写入磁盘,性能较好,但可能在宕机时丢失数据。0
:事务提交后日志仅写入内存,完全不保证磁盘持久性,性能最好,但风险最大。
3.bin log
bin log 并不是innodb独有的日志,它属于服务层,公共的;像redo log 和 undo log中只存在于Innodb引擎层独有;主要作用用于数据备份,数据恢复,主从同步。保证数据的一致性,完整性;
3.1 bin log的日志存储形式
1.statement:会记录sql语句的原文,如果sql语句中存在例如像now()这样的函数,一旦恢复数据的时候,会按照当前的时间恢复导致数据的不准确
2.row(默认):不仅记录sql语句的原文,还会记录当前行的数据,不会导致恢复数据的不一致,但是记录的东西多了,需要的空间也会大很多,并且同步的时候也会变长;
3.mixed:在statement和row中做一个权衡,由Mysql自行判断,判断是否当前数据会导致不一样的情况下,如果不会使用statement,反正row;
3.2 bin log 是怎么保证数据的完整
与redolog类似,里面有一个binlog cache,在事务提交之后,再刷新到磁盘;
每个线程会分配一个binlog cache空间,无论多大的事务,也会一次性写入binlog cache;
如果事务太大,binlog cache默认大小为32kb,会自动扩容,但不会超过一个最大值,一般情况下也不会超过;
binlog cache写入磁盘步骤:
可以设置sync_binlog的参数,决定它的同步流程:0 1 N
这个不会像redo log 后台有线程会自动提交给os的内存
当为0时:事务提交后,一定会执行write操作,将binlog cache的数据写入os的缓存中,至于os的缓存何时fsync磁盘中,由系统自行控制;
当为1(默认)时,事务提交后,一定会执行write操作和fsync操作,会保证binlog cache的数据一定落入磁盘中;
当为N的时:提交事务后,后执行write操作,但是会放入os的缓存中,必须要为N个事务的时候,才会执行fsync操作同步到磁盘中;这种最坏的结局就是丢失N-1个事务,但是提高效率加,减少io次数;
俩阶段提交(2PC)
什么是俩阶段提交?
redo log 是用来在mysql宕机之后用来恢复数据;而bin log 用作数据备份或者主从同步保证架构的一致性;侧重点不同;
举例:在执行一条更新操作的时候,并且有事务操作时候,redo log 会不断的写入到os的缓存中,而bin log只能在提交事务的时候才会写到os的缓存中 ,并且fsync操作写到磁盘;
如果在此过程中,mysql宕机了,可以会导致redo log 和bin log中的数据造成不一致的情况;
假如此时修改age的时候18为38,redolog 在没提交事务的时候就已经完成了写入,而binlog此时值还为18,那么一旦这时候mysql宕机,binlog数据还是为18;
mysql中重启之后恢复数据,从节点会根据binlog中的文件读取数据 age 为18
而宕机后主节点会根据redolog进行查询数据 age 为38
这时候主从节点数据不同,那么将产生问题;
此时需要2PC解决问题;
2PC执行过程:
将redo log 分为俩个步骤,部署成redo log prepare 和 redo log commit;就是俩阶段提交;
事务未提交的时候,那么redo log将会是prepare状态,而真正提交了的数据,将会是commit状态;
mysql宕机之后,mysql主节点根据redolog进行恢复,那么会比对redo log提交状态,如果是prepare状态,那么也会比对binlog中的数据,如果binlog没有这份数据,那么数据将会被回滚;
![]()
在mysql提交事务的时候出现异常,但是redolog prepare 和binlog 已经修改成功值,那么后续比对的时候一致,就不会出现主从不一致情况;
4 undo log
undo log也是属于innodb存储引擎中的日志;
它是保存了数据的历史记录,一方便事务回滚的时候,可以回到之前的版本,另一方面在MVCC多版本并发控制的时候,在读取快照的时候,需要在undo log文件中读取;
并且mysql中的原子性根据undo log实现,即使数据库宕机,也可以恢复到之前的版本,undo log在没有提交事务的时候,数据就已经在磁盘中;
5. MVCC
MVCC:多版本并发控制,在以前只能进行读读并发操作,一旦设计到读写操作,那么将会阻塞一方,就会导致效率低下;
在MVCC的内部,会根据undo log保存的数据记录的版型信息来实现的;每个事务读取的版本会不一样,在同一个事务中,每个用户只能看见当前事务创建快照前的数据和事务本身提供的数据;
MVCC在RC,RR的隔离级别才会适用到;
当前读:将select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,操作读取的是记录最新的版本,并且还要保证其他事务不能修改当前数据,会对读取的数据加锁
快照读:像不加锁的select就是快照读,是基于并发的性能下,它的实现基于MVCC,在很多情况下,避免了加锁的操作,提供性能,因为其他事务可以进行操作,快照读就读取的不一定是最新版本的数据,可能是历史数据
MVCC根据隐藏字段,undolog,RedaVied三者实现的;
5.1 隐藏字段
InnoDB在每个数据库中的每一行会提供三个字段:
DB_TRX_ID:标记最近修改的事务id,属于递增的;
DB_ROLL_PTR:回滚指针,undolog记录的多个版本之间,通过DB_ROLL_PTR来连接
DB_ROW_ID:如果表中没有主键,那么会这个会作为隐藏主键存在
5.2 undo log的存储结构
假如有一种user表,有id和name字段
现在有事务2进行将张三修改为李四;
1.获取排它锁 2.将旧版本数据放入undo log中 3.修改数据 将 事务id修改为2 将 回滚指针指向旧版本数据 4.释放锁
现在又来了一个事务ID为3,修改这行数据,将李四修改为王五 同理:
5.3 ReadView:
ReadView就是读操作中的可见性判断核心,也就是当前事务能不能读取到undo log中的某行数据或当前行数据。ReadVied内部维护了很多的变量和逻辑;
当开启事务的时候,执行第一个select命令,就会创建一个ReadView 也就是快照;
在当前事务下,用户想读取某行的记录,InnoDB会将DB_TRX_ID和ReadVied中的属性进行比较,才能判断是否可以查找到;
ReadView属性内容:
m_creator_trx_id : 当前事务的id,也就是事务id
m_ids: 创建快照时候,处于活跃事务id的集合、
m_low_limit_id: 如果当前行事务大于这个值,那么数据将会是不可见;它是未分配事务的最小事务id,也就是最大活跃事务+1;
m_up_limit_id: 活动事务集合中最小的id,如果当前行的事务小于这个值,那么数据将会是可见的;
在RC隔离级别下,每次执行select语句,都会创建快照;
在RR隔离级别下,只有第一次执行select语句,会创建快照,后续再查询的时候,都是基于第一次的快照;
ReadView 可见性判断:
就是按照一下逻辑去比对
// id参数,是你想查看的那行数据的事务ID
bool changes_visible(trx_id_t id, const table_name_t& name) const MY_ATTRIBUTE((warn_unused_result)){ut_ad(id > 0);// m_up_limit_id 是活跃事务的最小id,如果当前行的事务ID,小于m_up_limit_id,说明这个事务必然已经提交了,这个数据是可见的。// 如果当前行的事务ID和当前创建ReadView的事务ID相等,说明就是当前事务修改的数据,必然可见。if (id < m_up_limit_id || id == m_creator_trx_id) {return(true);}check_trx_id_sanity(id, name);// 当前行的事务ID,大于了m_low_limit_id,必然不可见。创建Read View的时候,m_low_limit_id这个事务还没有呢。if (id >= m_low_limit_id) {return(false);// 没有活跃事务,并且当前行数据的事务ID,还小于m_low_limit_id,那这个数据必然可见。} else if (m_ids.empty()) {return(true);}const ids_t::value_type* p = m_ids.data();// 如果上述情况都不满足,无法判断可见还是不可见,此时需要拿着当前行的事务ID,以及活跃事务列表开始判断。// 1、如果我发现当前行的事务ID,在活跃事务列表中。此时在Read View来说,这个事务没提交,不可见。// 2、如果我发现当前行的事务ID,不在活跃事务列表中,说明创建Read View时候,你就提交了,可见。return(!std::binary_search(p, p + m_ids.size(), id));
}
当id < m_up_litmit_id 可见id=13的数据
RC隔离级别 每次查询都会创建快照 当第一次查询name为王五
事务14进行了提交事务,那么将name修改成赵六
当第二次查询的时候可以查出name为赵六 满足 14 id < 15 m_up_limit_id
所以RC隔离级别就出现不可重复读的问题
RR隔离级别 只会生成第一次查询的快照 name 为 王五
那么第二次查询的时候 不满足 14 id < 14 m_up_limit_id 条件
也不满足 14 id = 12 creator_id
满足了查询的事务id 在活动列表中 那么就是不可见的
所以查询不出来name为赵六的结果
最终结果 name为王五
相关文章:
【Mysql】详解InnoDB存储引擎以及binlog,redelog,undolog+MVCC
1.InnoDB存储引擎 在Mysql中,InnoDB存储引擎是默认的,也是我们最常用的一个存储引擎,其中分为内存结构和磁盘结构两大部分,整体架构图如下: 1.1Buffer Pool Buffer pool(缓存区)是Mysql内存的一个主要区域࿰…...
面向对象详解和JVM底层内存分析
神速熟悉面向对象 表格结构和类结构 我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。实际上,“表格思维”就是一种典型的面向对象思维。 实际上,互联网上所有的数据本质上都是“表格”。我们在这里…...
C语言指针深入详解(一):内存和地址、指针变量和地址、指针变量类型的意义、指针运算
目录 一、内存和地址 (一)内存 (二)如何理解编址 二、指针变量和地址 (一)取地址操作符(&) (二)指针变量和解引用操作符(*)…...
MATLAB中进行深度学习网络训练的模型评估步骤
文章目录 前言环境配置一、基础性能评估二、高级评估指标三、模型解释与可视化四、交叉验证与模型选择五、部署前的优化 前言 在 MATLAB 中进行深度学习网络训练后的模型评估是确保模型性能和可靠性的关键环节。以下是详细的评估步骤和方法。 环境配置 MATLAB下载安装教程&…...
30、WebAssembly:古代魔法——React 19 性能优化
一、符文编译术(编译优化) 1. 语言选择与量子精简 // Rust编译优化 cargo build --target wasm32-wasi --release 魔法特性: • 选择低运行时开销语言(如Rust/C),编译后文件比Swift小4倍 • --rel…...
Python集合运算:从基础到进阶全解析
Python基础:集合运算进阶 文章目录 Python基础:集合运算进阶一、知识点详解1.1 集合运算(运算符 vs 方法)1.2 集合运算符优先级1.3 集合关系判断方法1.4 方法对比 二、说明示例2.1 权限管理系统2.2 数据去重与差异分析2.3 数学运算…...
【开源Agent框架】Suna架构设计深度解析与应用实践
一、项目基本介绍 Suna是一款全栈开源的通用型AI代理系统,其名称源自日语"砂"的发音,寓意如流沙般渗透到各类数字任务中。项目采用Apache 2.0协议,由Kortix AI团队维护,核心开发者包括Adam Cohen Hillel等三位主要贡献者。 技术架构全景 系统由四大核心组件构…...
C++类与对象--2 对象的初始化和清理
C面向对象来源于生活,每个对象都有初始化设置和销毁前的清理数据的设置。 2.1 构造函数和析构函数 (1)构造函数 初始化对象的成员属性不提供构造函数时,编译器会提供不带参数的默认构造函数,函数实现是空的构造函数不…...
计网| 网际控制报文协议(ICMP)
目录 网际控制报文协议(ICMP) 一、ICMP 基础特性 二、ICMP 报文分类及作用 差错报告报文 询问报文 网际控制报文协议(ICMP) ICMP(Internet Control Message Protocol,网际控制报文协议)是 …...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
printf耗时高的原因
背景:设备升级初始化失败。具体表现为:app在启动dsp后,需在15秒内与其建立连接以确认通信成功,但当前未能在此时间限制内完成连接。 排查过程:通过在初始化过程中添加耗时打印,发现各阶段耗时虽不高&#…...
20250517 我设想一个空间,无限大,空间不与其中物质进行任何作用,甚至这个空间能容纳可以伸缩的空间
1.我设想一个空间,无限大,空间不与其中物质进行任何作用,甚至这个空间能容纳可以伸缩的空间 您设想的这个空间具有一些有趣的特点: 无限大:空间本身没有边界或限制,理论上可以容纳无限多的物质或结构。非…...
GO语言学习(二)
GO语言学习(二) method(方法) 这一节我们介绍一下GO语言的面向对象,之前我们学习了struct结构体,现在我们来解释一下方法method主要是为了简化代码,在计算同类时,使用函数接收方法…...
神经网络与深度学习第六章--循环神经网络(理论)
#第六章-循环神经网络 前馈神经网络的缺点: ①信息的传递是单向的。前馈神经网络可以看作一个复杂的函数,每次的输入都是独立的,即网络的输出只依赖于当前的输入。前馈神经网络是一种静态网络,没有记忆能力,就无法模拟…...
第三十五节:特征检测与描述-ORB 特征
1. 引言:为什么需要ORB? 在计算机视觉领域,特征检测与描述是许多任务(如图像匹配、目标跟踪、三维重建等)的核心基础。传统的算法如SIFT(尺度不变特征变换)和SURF(加速稳健特征)因其优异的性能被广泛应用,但它们存在两个显著问题: 专利限制:SIFT和SURF受专利保护,…...
重庆 ICPC 比赛游记
2025.5.9 比赛前一天晚上,激动地睡不着觉,起来收拾了好多东西。(其实就四本书,剩下的全是零食……关键在于这四本书基本没用。) 2025.5.10 学校丧心病狂的让我们 6:20 到校门口集合坐车(据说是怕赶不上比…...
二进制与十进制互转的方法
附言: 在计算机科学和数字系统中,二进制和十进制是最常见的两种数制。二进制是计算机内部数据存储和处理的基础,而十进制则是我们日常生活中最常用的数制。因此,掌握二进制与十进制之间的转换方法对于计算机学习者和相关领域的从业者来说至关…...
咖啡叶子病害检测数据集VOC+YOLO格式1468张4类别均为单叶子
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1468 标注数量(xml文件个数):1468 标注数量(txt文件个数):1468 …...
JDBC实现模糊、动态与分页查询的详解
文章目录 一. 模糊查询1. Mysql的写法2. JDBC的实现 二. 动态条件查询1. 创建生成动态条件查询sql的方法2. 完整的动态条件查询类以及测试类 三. 分页查询1. 什么是分页查询?2. 分页查询的分类3. MySQL的实现4. JDBC实现4.1. 创建page页4.2. 分页的实现 本章来讲一下…...
golang读、写、复制、创建目录、删除、重命名,文件方法总结
文章目录 一、只读文件二、写入文件三、复制文件四、创建目录五、删除目录/文件五、重命名文件 一、只读文件 file, err : os.Open("./main.go")defer file.Close() //打开文件一定要关闭关闭文件if err ! nil {fmt.Println("文件打开失败", err)}/*方案一…...
信贷域——互联网金融业务
摘要 本文深入探讨了信贷域全托与半托业务的定义、特点、适用场景及注意事项,并分析了互联网金融核心信息流的多个方面,包括资金流、信息流、风险流、合规流、物流、技术流和商流,还阐述了金融系统“断直连”业务的相关内容,以及…...
计算机操作系统概要
不谋万世者,不⾜谋⼀时。不谋全局者 ,足谋⼀域 。 ——陈澹然《寤⾔》《迁都建藩议》 操作系统 一.对文件简单操作的常用基础指令 ls ls 选项 目录或⽂件名:罗列当前⽬录下的⽂件 -l:以长格式显示⽂件和⽬录的详细信息 -a 或 --all&…...
gRPC开发指南:Visual Studio 2022 + Vcpkg + Windows全流程配置
前言 gRPC作为Google开源的高性能RPC框架,在微服务架构中扮演着重要角色。本文将详细介绍在Windows平台下,使用Visual Studio 2022和Vcpkg进行gRPC开发的完整流程,包括环境配置、项目搭建、常见问题解决等实用内容。 环境准备 1. 安装必要组…...
MATLAB安装常见问题及解决办法
MATLAB安装失败 安装MATLAB时可能会遇到失败的情况,通常是由于系统环境不兼容或安装文件损坏。确保系统满足MATLAB的最低要求,并重新下载安装文件。如果问题仍然存在,可以尝试以管理员身份运行安装程序。 许可证激活问题 在激活MATLAB许可证时,可能会遇到激活失败或无法…...
英语学习5.17
attract 👉 前缀:at-(朝向) 👉 含义:吸引(朝某处拉) 例句:The flowers attract bees. (花吸引蜜蜂。) distract 👉 前缀ÿ…...
深入解析 React 的 useEffect:从入门到实战
文章目录 前言一、为什么需要 useEffect?核心作用: 二、useEffect 的基础用法1. 基本语法2. 依赖项数组的作用 三、依赖项数组演示1. 空数组 []:2.无依赖项(空)3.有依赖项 四、清理副作用函数实战案例演示1. 清除定时器…...
Scrapy进阶实践指南:从脚本运行到分布式爬取
Scrapy作为Python生态中最强大的爬虫框架之一,其官方文档的"Common Practices"章节总结了多个高频使用场景的解决方案。本文将深入解析如何通过脚本控制爬虫、多爬虫协同工作、分布式部署策略以及反反爬技巧,帮助开发者突破基础使用限制。 一…...
(面试)TCP、UDP协议
TCP(传输控制协议)和UDP(用户数据报协议)是互联网核心的传输层协议,负责应用程序之间的数据传输。它们在设计目标、特性和适用场景上有显著差异: TCP:面向连接,可靠的,速…...
数据库blog1_信息(数据)的处理与效率提升
🌿信息的处理 🍂实际中离不开信息处理 ● 解决问题的建模 任何对问题的处理都可以看作数据的输入、处理、输出。 eg.一个项目中,用户点击信息由前端接收传递到后端处理后返回结果eg.面对一个问题,我们在搜集信息后做出处理与分析…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(23):受身形
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(23):受身形 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)うけみけい 受身形1、グループ2、グループ3、グループ(2) か ~かどうか1、か2、かどうか3、单词(1)日语(2)日语片假名单词4、相近词练习5、单词…...
kubernetes的Service与服务发现
kubernetes的Service与服务发现 1 Service1.1 Service概念1.2 Service类型1.2.1 ClusterIP1.2.2 NodePort1.2.3 LoadBalancer1.2.4 ExternalName1.2.5 Headless 2 CoreDNS2.1 CoreDNS概念2.2 CoreDNS插件架构2.3 CoreDNS在kubernetes下的工作原理2.4 Pod上的DNS解析策略 3 Ingr…...
python打卡day28
类的简单复习 知识点回顾: 类的定义pass占位语句类的初始化方法类的普通方法类的继承:属性的继承、方法的继承 类就是对属性和方法的封装,一个常见的类的定义包括了: 关键字class类名语法固定符号冒号(:)一个初始化函数__init__(…...
【学习心得】英伟达的诸多显卡性能对比
型号 CUDA核心 显存容量 算力(FP32/TFLOPS) A100 6912 HBM2e/80G 19.49 A800 6912 HBM2e/80G 19.49 H100 14592 HBM3/80G 51.22 H800 14592 HBM3/80G 51.22 T4 4352 GDDR6/16G 8.14 P40 3840 GDDR5/24G 11.76 L40 18176 G…...
使用Pinia持久化插件-persist解决刷新浏览器后数据丢失的问题
文章目录 一、现象二、原因三、解决:使用Pinia持久化插件-persist安装persistpinia中使用persist插件在创建定义状态时配置持久化 四、参考资料 一、现象 登录成功后,能正常看到文章分类的数据,但只要刷新浏览器就提示服务异常 二、原因 P…...
mysql中4种扫描方式和聚簇索引非聚簇索引【爽文一篇】
目录 一 mysql的聚簇索引&非聚簇索引 1.1 数据表 1.2 聚簇索引 1.3 非聚簇索引 1.4 覆盖索引 二 mysql的4种扫描查询 2.1 全表扫描 2.2 索引扫描 2.3 覆盖索引扫描 2.4 回表扫描 2.5 总结 三 mysql的回表查询详解 3.1 回表查询 一 mysql的聚簇索引&非聚簇…...
交流学习 | 江西同为科技有限公司赴海尔总部考察交流
2025年4月8日至9日,江西同为科技有限公司在江西省科技装备商会的带领下,以蔡文君经理为代表,一行人赴山东青岛海尔总部开展两天的考察交流活动。本次考察不仅深入剖析了海尔企业的前沿技术与管理理念,更促进了行业内科技创新、商业…...
AGI大模型(20):混合检索之rank_bm25库来实现词法搜索
1 混合检索简介 混合搜索结合了两种检索信息的方法 词法搜索 (BM25) :这种传统方法根据精确的关键字匹配来检索文档。例如,如果您搜索“cat on the mat”,它将找到包含这些确切单词的文档。 基于嵌入的搜索(密集检索) :这种较新的方法通过比较文档的语义来检索文档。查…...
QT调用Halcon查询所有摄像头名称
QT软件中的测试代码 //获取当前连接的所有设备信息实例HTuple hv_general, hv_ValueList;InfoFramegrabber("DirectShow", "device", &hv_general, &hv_ValueList);qDebug()<<QString::fromUtf8(hv_general.S().Text());//Value list for de…...
16 C 语言布尔类型与 sizeof 运算符详解:布尔类型的三种声明方式、执行时间、赋值规则
1 布尔类型 1.1 布尔类型概述 布尔类型用于表示逻辑上的真(true)和假(false)两种状态,是编程中条件判断和逻辑运算的基础。在 C 语言中,布尔值的表示方式随着标准的发展而不断完善。 1.2 布尔类型的三种声…...
配置ssh服务-ubuntu到Windows拷贝文件方法
背景: 在工作中,需要频繁从ubuntu到Windows拷贝文件,但有时间总是无法拷出,每次重启虚拟机又比较麻烦并且效率较低。可以使用scp服务进行拷贝,不仅稳定而且高效,现将配置过程进行梳理,以供大家参…...
使用ts-node搭建typescript运行环境
目录 首先安装好node.js 安装typescript 安装ts-node 创建一个typescript文件 使用ts-node运行typescript文件 首先安装好node.js 安装typescript npm install typescript4.7.4 -g 安装ts-node npm install ts-nodev10.8.1 -g 创建一个typescript文件 文件名为app.ts&a…...
如何深入学习MATLAB的高级应用?
文章目录 要深入学习 MATLAB 的高级应用,需要在掌握基础语法后,系统性地学习特定领域的工具箱和算法,并通过实战项目提升能力。以下是分阶段的学习路径和资源推荐: 一、深化核心技能 高级矩阵运算与线性代数 matlab % 稀疏矩阵处…...
英汉 “语言” 初印象:符号背后的文化底色
英汉 “语言” 初印象:符号背后的文化底色 原始尺寸更换图片 在生活里,我们每天都会进行各式各样的交流,或许不曾留意,汉语和英语这两种极具代表性的语言,从最简单的问候语中就能展现出它们独特的文化内…...
C语言_编译全攻略_从原理到实战的深度解析
在 C 语言开发中,编译是连接源代码与可执行程序的关键桥梁。理解编译过程不仅能提升开发效率,更能帮助我们定位内存泄漏、性能瓶颈等深层次问题。本文将从编译原理出发,结合 GCC 工具链,带你掌握 C 语言编译的核心技术。 一、编译流程底层原理 1. 编译四阶段详解 预处理…...
AGI大模型(21):混合检索之混合搜索
为了执行混合搜索,我们结合了 BM25 和密集检索的结果。每种方法的分数均经过标准化和加权以获得最佳总体结果 1 代码 先编写 BM25搜索的代码,再编写密集检索的代码,最后进行混合。 from rank_bm25 import BM25Okapi from nltk.tokenize import word_tokenize import jieb…...
Vue3学习(组合式API——ref模版引用与defineExpose编译宏函数)
目录 一、ref模版引用。 (1)基本介绍。 (2)核心基本步骤。(以获取DOM、组件为例) (3)案例:获取dom对象演示。 <1>需求:点击按钮,让输入框聚焦。 (4&…...
Zephyr OS 中的 FIFO 接口应用介绍
目录 概述 1 FIFO的接口函数 1.1 K_FIFO_DEFINE函数 1.2 k_fifo_init函数 1.3 k_fifo_put函数 1.4 k_fifo_get 函数 1.5 k_fifo_is_empty 函数 2 应用验证 2.1 UART中使用FIFO范例 2.2 生产-消费类型范例 3 注意事项 3.1 内存管理 3.2 线程安全边界 概述 Zephy…...
前端基础之CSS
基本语法规范 引入方式 1.内部引入 <style>p{color:blue ;font-size:30px;}</style> 2.行级引入 <p style "color : green ;font-size : 40px;">hello ,wyx</p><p>hello , wyx1</p><h1>hello , wyx2</h1> 3.外…...
【Linux网络】DNS与ICMP
DNS(Domain Name System) DNS是一整套从域名映射到IP的系统。 DNS背景 TCP/IP使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆。 于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的…...
第二十七天打卡
一些函数 for i in range(2, 10000):if is_prime(i):print(i) if ...: 这是 Python 里的条件判断语句,当 is_prime(i) 的返回值为 True 时,就会执行 if 语句块里的代码。 func.__name__ 的作用 func.__name__ 是 Python 中函数对象的一个特殊属性&am…...