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

深入解析 MySQL 8 C++ 源码:二级索引回表操作

在数据库系统中,索引是优化查询性能的关键技术之一。MySQL 的 InnoDB 存储引擎支持多种索引类型,其中二级索引(非聚簇索引)和聚簇索引(主键索引)是最常见的两种。然而,由于二级索引的叶子节点只包含索引列和主键值,而完整的行数据存储在聚簇索引中,因此在查询中涉及二级索引时,可能需要执行回表操作(Row Lookup),即通过主键值从聚簇索引中获取完整的行数据。本文将从 MySQL 8 的 C++ 源码角度,深入解析二级索引的回表操作。

一、什么是二级索引回表?

在 InnoDB 中,表的数据是按照聚簇索引(主键索引)组织的,这意味着每行数据都存储在聚簇索引的叶子节点中。而二级索引则只包含索引列和对应的主键值。当查询涉及二级索引时,InnoDB 可以通过二级索引快速定位到主键值,但为了获取完整的行数据,还需要通过主键值回表到聚簇索引中。

例如,假设有一个表 t,主键为 id,并有一个二级索引 idx_name

sql复制

CREATE TABLE t (id INT PRIMARY KEY,name VARCHAR(50),age INT,INDEX idx_name (name)
);

当执行以下查询时:

sql复制

SELECT * FROM t WHERE name = 'Alice';

InnoDB 首先会通过二级索引 idx_name 查找到满足条件的记录,获取其主键值 id,然后通过主键值回表到聚簇索引中获取完整的行数据。

二、MySQL 8 中的回表操作实现

在 MySQL 8 的 InnoDB 源码中,回表操作的核心逻辑由函数 Row_sel_get_clust_rec_for_mysql::operator() 实现。以下是从源码角度对回表操作的详细解析。

1. 函数签名

cpp复制

[[nodiscard]] dberr_t Row_sel_get_clust_rec_for_mysql::operator()(row_prebuilt_t *prebuilt, dict_index_t *sec_index, const rec_t *rec,que_thr_t *thr, const rec_t **out_rec, ulint **offsets,mem_heap_t **offset_heap, const dtuple_t **vrow, mtr_t *mtr,lob::undo_vers_t *lob_undo);
  • prebuilt:预构建的结构体,包含表和索引信息。

  • sec_index:二级索引。

  • rec:当前二级索引记录。

  • thr:查询线程。

  • out_rec:输出参数,存储找到的聚簇索引记录。

  • offsets:记录的偏移数组。

  • offset_heap:内存堆,用于分配临时内存。

  • vrow:虚拟列数据(如果需要)。

  • mtr:Mini-transaction,用于管理事务。

  • lob_undo:LOB(大对象)的 undo 版本信息。

2. 构建聚簇索引的搜索条件

回表操作的第一步是从二级索引记录中提取主键值,并构建用于搜索聚簇索引的条件:

cpp复制

row_build_row_ref_in_tuple(prebuilt->clust_ref, rec, sec_index, *offsets);
  • prebuilt->clust_ref:存储主键值的元组。

  • rec:当前二级索引记录。

  • sec_index:二级索引。

  • *offsets:二级索引记录的偏移数组。

3. 打开聚簇索引的游标

接下来,使用主键值在聚簇索引中搜索对应的记录:

cpp复制

prebuilt->clust_pcur->open_no_init(clust_index, prebuilt->clust_ref,PAGE_CUR_LE, BTR_SEARCH_LEAF, 0, mtr,UT_LOCATION_HERE);
  • clust_index:表的聚簇索引。

  • prebuilt->clust_ref:主键值。

  • PAGE_CUR_LE:搜索模式(小于等于)。

  • mtr:Mini-transaction。

4. 获取聚簇索引记录

通过游标获取聚簇索引中的记录:

cpp复制

clust_rec = prebuilt->clust_pcur->get_rec();

如果未找到匹配的记录,或者记录被删除,则会返回错误。

5. 锁定记录(如果需要)

在事务隔离级别较高时,需要对聚簇索引记录加锁:

cpp复制

if (prebuilt->select_lock_type != LOCK_NONE) {err = lock_clust_rec_read_check_and_lock(lock_duration_t::REGULAR, prebuilt->clust_pcur->get_block(), clust_rec,clust_index, *offsets, prebuilt->select_mode,static_cast<lock_mode>(prebuilt->select_lock_type), LOCK_REC_NOT_GAP,thr);
}

6. 获取记录的旧版本(如果需要)

如果当前事务隔离级别不允许读取未提交的数据,则需要获取记录的旧版本:

cpp复制

if (trx->isolation_level > TRX_ISO_READ_UNCOMMITTED &&!lock_clust_rec_cons_read_sees(clust_rec, clust_index, *offsets,trx_get_read_view(trx))) {err = row_sel_build_prev_vers_for_mysql(trx->read_view, clust_index, prebuilt, clust_rec, offsets,offset_heap, &old_vers, vrow, mtr, lob_undo);
}

7. 检查二级索引记录是否对应聚簇索引记录

在某些情况下,二级索引记录可能被删除,或者事务隔离级别较低,需要验证二级索引记录是否确实对应聚簇索引记录:

cpp复制

if (clust_rec &&(old_vers || trx->isolation_level <= TRX_ISO_READ_UNCOMMITTED ||dict_index_is_spatial(sec_index) ||rec_get_deleted_flag(rec, dict_table_is_comp(sec_index->table)))) {err = row_sel_sec_rec_is_for_clust_rec(rec, sec_index, clust_rec,clust_index, thr, rec_equal);
}

8. 返回结果

最终,通过 out_rec 返回找到的聚簇索引记录:

cpp复制

*out_rec = clust_rec;

三、回表操作的性能影响

回表操作虽然可以获取完整的行数据,但也带来了额外的性能开销。每次回表都需要访问聚簇索引,这可能导致额外的 I/O 操作,尤其是在二级索引和聚簇索引存储在不同位置时。因此,减少回表操作的次数是优化查询性能的关键之一。

以下是一些优化建议:

  1. 选择合适的索引:尽量使用覆盖索引(Covering Index),即查询的所有列都包含在索引中,从而避免回表操作。

  2. 减少索引列的冗余:避免在二级索引中包含过多列,以减少回表的频率。

  3. 调整事务隔离级别:在允许的情况下,使用较低的事务隔离级别(如 READ UNCOMMITTEDREAD COMMITTED),可以减少回表操作的复杂性。

四、总结

二级索引回表是 MySQL InnoDB 存储引擎中的一种重要机制,用于从二级索引记录中获取完整的行数据。通过 MySQL 8 的 C++ 源码,我们可以深入了解回表操作的实现细节,包括构建搜索条件、锁定记录、获取旧版本记录等关键步骤。虽然回表操作可以提高查询的灵活性,但也需要注意其对性能的影响,并通过合理的索引设计和事务隔离级别调整来优化查询性能。

##gdb调试堆栈

#0  Row_sel_get_clust_rec_for_mysql::operator() (this=0x7ec32c5fa7e0, prebuilt=0x7ec23c0820c8, sec_index=0x7ec32b476cf8, rec=0x7ec319344baa "", thr=0x7ec23c0837b0,out_rec=0x7ec32c5fa6e0, offsets=0x7ec32c5fa6f8, offset_heap=0x7ec32c5fa6f0, vrow=0x0, mtr=0x7ec32c5fb030, lob_undo=0x7ec23c0822e0)at /home/yym/mysql8/mysql-8.1.0/storage/innobase/row/row0sel.cc:3352
#1  0x00006225275e0280 in row_search_mvcc (buf=0x7ec23c06dab0 "\351?\200\377\255\003", mode=PAGE_CUR_GE, prebuilt=0x7ec23c0820c8, match_mode=1, direction=0)at /home/yym/mysql8/mysql-8.1.0/storage/innobase/row/row0sel.cc:5415
#2  0x00006225272faf93 in ha_innobase::index_read (this=0x7ec23c06c3e0, buf=0x7ec23c06dab0 "\351?\200\377\255\003", key_ptr=0x7ec23c0e26e0 "\003", key_len=202,find_flag=HA_READ_KEY_EXACT) at /home/yym/mysql8/mysql-8.1.0/storage/innobase/handler/ha_innodb.cc:10267
#3  0x0000622525e2ff5e in handler::index_read_map (this=0x7ec23c06c3e0, buf=0x7ec23c06dab0 "\351?\200\377\255\003", key=0x7ec23c0e26e0 "\003", keypart_map=18446744073709551615,find_flag=HA_READ_KEY_EXACT) at /home/yym/mysql8/mysql-8.1.0/sql/handler.h:5452
#4  0x0000622525e1b2eb in handler::ha_index_read_map (this=0x7ec23c06c3e0, buf=0x7ec23c06dab0 "\351?\200\377\255\003", key=0x7ec23c0e26e0 "\003",keypart_map=18446744073709551615, find_flag=HA_READ_KEY_EXACT) at /home/yym/mysql8/mysql-8.1.0/sql/handler.cc:3245
#5  0x0000622527132682 in dd::Raw_table::find_record (this=0x7ec23c025f00, key=..., r=std::unique_ptr<dd::Raw_record> = {...})at /home/yym/mysql8/mysql-8.1.0/sql/dd/impl/raw/raw_table.cc:79
#6  0x0000622527116ef3 in dd::cache::Storage_adapter::get<dd::Item_name_key, dd::Abstract_table> (thd=0x7ec23c001050, key=..., isolation=ISO_READ_COMMITTED,bypass_core_registry=false, object=0x7ec32c5fb940) at /home/yym/mysql8/mysql-8.1.0/sql/dd/impl/cache/storage_adapter.cc:181
#7  0x0000622527111061 in dd::cache::Shared_dictionary_cache::get_uncached<dd::Item_name_key, dd::Abstract_table> (this=0x62252af37a00 <dd::cache::Shared_dictionary_cache::instance()::s_cache>, thd=0x7ec23c001050, key=..., isolation=ISO_READ_COMMITTED, object=0x7ec32c5fb940)at /home/yym/mysql8/mysql-8.1.0/sql/dd/impl/cache/shared_dictionary_cache.cc:113
#8  0x0000622527110de8 in dd::cache::Shared_dictionary_cache::get<dd::Item_name_key, dd::Abstract_table> (this=0x62252af37a00 <dd::cache::Shared_dictionary_cache::instance()::s_cache>, thd=0x7ec23c001050, key=..., element=0x7ec32c5fb9a8)at /home/yym/mysql8/mysql-8.1.0/sql/dd/impl/cache/shared_dictionary_cache.cc:98
#9  0x0000622527022d40 in dd::cache::Dictionary_client::acquire<dd::Item_name_key, dd::Abstract_table> (this=0x7ec23c004fb0, key=..., object=0x7ec32c5fba38,local_committed=0x7ec32c5fba2d, local_uncommitted=0x7ec32c5fba2e) at /home/yym/mysql8/mysql-8.1.0/sql/dd/impl/cache/dictionary_client.cc:913
#10 0x0000622527001f63 in dd::cache::Dictionary_client::acquire<dd::Abstract_table> (this=0x7ec23c004fb0, schema_name="performance_schema", object_name="session_variables",object=0x7ec32c5fbb78) at /home/yym/mysql8/mysql-8.1.0/sql/dd/impl/cache/dictionary_client.cc:1382
#11 0x00006225258b54ab in get_table_share (thd=0x7ec23c001050, db=0x7ec23c19df60 "performance_schema", table_name=0x7ec23c19df78 "session_variables",key=0x7ec23c1a09df "performance_schema", key_length=37, open_view=true, open_secondary=false) at /home/yym/mysql8/mysql-8.1.0/sql/sql_base.cc:802
#12 0x00006225258b5ca2 in get_table_share_with_discover (thd=0x7ec23c001050, table_list=0x7ec23c1a05e0, key=0x7ec23c1a09df "performance_schema", key_length=37,open_secondary=false, error=0x7ec32c5fbd9c) at /home/yym/mysql8/mysql-8.1.0/sql/sql_base.cc:922
#13 0x00006225258bbb7d in open_table (thd=0x7ec23c001050, table_list=0x7ec23c1a05e0, ot_ctx=0x7ec32c5fc270) at /home/yym/mysql8/mysql-8.1.0/sql/sql_base.cc:3247
#14 0x00006225258c0208 in open_and_process_table (thd=0x7ec23c001050, lex=0x7ec23c004630, tables=0x7ec23c1a05e0, counter=0x7ec23c004688, prelocking_strategy=0x7ec32c5fc2f8,has_prelocking_list=false, ot_ctx=0x7ec32c5fc270) at /home/yym/mysql8/mysql-8.1.0/sql/sql_base.cc:5090
#15 0x00006225258c1d82 in open_tables (thd=0x7ec23c001050, start=0x7ec32c5fc2e0, counter=0x7ec23c004688, flags=0, prelocking_strategy=0x7ec32c5fc2f8)at /home/yym/mysql8/mysql-8.1.0/sql/sql_base.cc:5912
#16 0x00006225258c39df in open_tables_for_query (thd=0x7ec23c001050, tables=0x7ec23c2cb1c8, flags=0) at /home/yym/mysql8/mysql-8.1.0/sql/sql_base.cc:6795
#17 0x0000622525a7f0c3 in Sql_cmd_dml::prepare (this=0x7ec23c19d728, thd=0x7ec23c001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_select.cc:540
#18 0x0000622525a7fbb8 in Sql_cmd_dml::execute (this=0x7ec23c19d728, thd=0x7ec23c001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_select.cc:718
#19 0x0000622525a99285 in Sql_cmd_show::execute (this=0x7ec23c19d728, thd=0x7ec23c001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_show.cc:213
#20 0x00006225259f2841 in mysql_execute_command (thd=0x7ec23c001050, first_level=true) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:4797
#21 0x00006225259f4cb3 in dispatch_sql_command (thd=0x7ec23c001050, parser_state=0x7ec32c5fd9f0) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:5447
#22 0x00006225259ea0d7 in dispatch_command (thd=0x7ec23c001050, com_data=0x7ec32c5fe340, command=COM_QUERY) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:2112
#23 0x00006225259e7f77 in do_command (thd=0x7ec23c001050) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:1459
#24 0x0000622525c3f835 in handle_connection (arg=0x62255f6a4f40) at /home/yym/mysql8/mysql-8.1.0/sql/conn_handler/connection_handler_per_thread.cc:303
#25 0x0000622527b7ebdc in pfs_spawn_thread (arg=0x62255f694920) at /home/yym/mysql8/mysql-8.1.0/storage/perfschema/pfs.cc:3043
#26 0x00007ec33a694ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#27 0x00007ec33a726850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

 

相关文章:

深入解析 MySQL 8 C++ 源码:二级索引回表操作

在数据库系统中&#xff0c;索引是优化查询性能的关键技术之一。MySQL 的 InnoDB 存储引擎支持多种索引类型&#xff0c;其中二级索引&#xff08;非聚簇索引&#xff09;和聚簇索引&#xff08;主键索引&#xff09;是最常见的两种。然而&#xff0c;由于二级索引的叶子节点只…...

MySQL如何解决幻读?

目录 一、什么是幻读&#xff1f; 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因&#xff1f; 1.4?读已提交&#xff08;Read Committed&#xff09; 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5?可重…...

RabbitMQ的脑裂(网络分区)问题

问题描述&#xff1a; Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data 一、什么是MQ脑裂&#xff1f; 网络分区 如果另一个节点在一段时间内&#xff08;默认为 60 秒&#xff09;无法与其联系&#xff0…...

【网络安全 | 漏洞挖掘】价值$40000:从路径遍历升级至RCE

未经许可,不得转载。 文章目录 路径遍历RCE路径遍历 在进行目标侦查和端口扫描时,我发现了一个使用 8443 端口的子域名:http://admin.target.com:8443。许多人可能会忽略返回 404 的子域名,但我并没有。 对 http://admin.target.com:8443/FUZZ 进行模糊测试时,我发现了一…...

程函方程的详细推导

以下是基于非均匀介质弹性波方程&#xff08;无纵波假设&#xff09;推导程函方程的详细过程&#xff0c;完整考虑纵波&#xff08;P 波&#xff09;和横波&#xff08;S 波&#xff09;的耦合效应&#xff1a;...

AD(Altium Designer)三种方法导入图片

目录 1、脚本方式导入图片 1.1 准备脚本文件和导入图片 1.2 运行脚本 1.3 导入文件 1.4 选中文件 2.5 运行 2.6 导入图片 2.7 选择图片 2.8 转换 2.9 退出 2.10 联合 2.11 确认 2.12 调整大小 2.13 复制 2.14 粘贴 2、图片直接导入图片 2.1点击放置 2.2 图片…...

fpga助教面试题

第一题 module sfp_pwm( input wire clk, //clk is 200M input wire rst_n, input wire clk_10M_i, input wire PPS_i, output reg pwm ) reg [6:0] cunt ;always (posedge clk ) beginif(!rst_n)cunt<0;else if(cunt19) //200M是10M的20倍cunt<0;elsecunt<cunt1;…...

问题记录汇总

记录一些问题 如何分析错误帧问题-CSDN博客...

安全问答—安全的基本架构

前言 将一些安全相关的问答进行整理汇总和陈述&#xff0c;形成一些以问答呈现的东西&#xff0c;加入一些自己的理解&#xff0c;欢迎路过的各位大佬进行讨论和论述。很多内容都会从甲方的安全认知去进行阐述。 1.安全存在的目的&#xff1f; 为了支持组织的目标、使命和宗…...

玩客云 IP查找

1.玩客云使用静态IP在不同网段路由器下不能使用&#xff0c;动态不好找IP地址 1.1使用python3 实现自动获取发送 import requests import os import socket# 从环境变量获取 PushPlus 的 token 和群组编码 PUSH_PLUS_TOKEN os.getenv("PUSH_PLUS_TOKEN") PUSH_PLU…...

鸿蒙与跨端迁移的重要性

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是由华为公司开发的一款面向未来的全场景分布式操作系统。它旨在提供一个统一的平台&#xff0c;支持各种设备之间的无缝协作和数据共享&#xff0c;从而为用户提供更加连贯和高效的体验。在鸿蒙的生态系统中&#xff0c;跨端迁移…...

MATLAB学习之旅:从入门到基础实践

在当今科技飞速发展的时代,MATLAB作为一款强大的数学软件,犹如一把神奇的钥匙,能够打开众多领域的大门。无论是工程计算、数据分析,还是算法开发、可视化呈现,MATLAB都展现出了无与伦比的魅力。今天,就让我们踏上这段奇妙的MATLAB学习之旅,从最基础的部分开始,逐步探索…...

【队列】循环队列(Circular Queue)详解

文章目录 一、循环队列简介二、循环队列的判空和判满三、循环队列的实现leetcode 622. 设计循环队列 一、循环队列简介 在实际开发中&#xff0c;队列是一种常用的数据结构&#xff0c;而循环队列&#xff08;Circular Queue&#xff09;则一般是一种基于数组实现的队列&#x…...

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言&#xff08;官网是&#xff1a;https://open.bigmodel.cn&#xff09;的案例&#xff0c;回答响应流式输出显示&#xff0c;这里使用的是免费模型&#xff0c;需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...

【JavaEE进阶】MyBatis入门

目录 &#x1f334;前言 &#x1f332;什么是MyBatis? &#x1f333;准备工作 &#x1f6a9;创建工程 &#x1f6a9;配置数据库连接字符串 &#x1f6a9;数据准备 &#x1f6a9;编写持久层代码 &#x1f343;单元测试 &#x1f334;前言 在应⽤分层学习时,我们了解到…...

网络安全:防范NetBIOS漏洞的攻击

稍微懂点电脑知识的朋友都知道&#xff0c;NetBIOS 是计算机局域网领域流行的一种传输方式&#xff0c;但你是否还知道&#xff0c;对于连接互联网的机器来讲&#xff0c;NetBIOS是一大隐患。 漏洞描述 NetBIOS(Network Basic Input Output System&#xff0c;网络基本输入输…...

【OS安装与使用】part3-ubuntu安装Nvidia显卡驱动+CUDA 12.4

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 更改镜像源2.2.2 安装NVIDIA显卡驱动&#xff1a;nvidia-550&#xff08;1&#xff09;查询显卡ID&#xff08;2&#xff09;PCI ID Repository查询显卡型号&#xff08;3&#xf…...

如何在本地和服务器新建Redis用户和密码

文章目录 一. Redis安装二. 新建Redis用户&#xff0c;测试连接2.1 本地数据库2.2 线上数据库2.2.1 安装和配置2.2.2 测试连接 三. 配置四. 分布式 一. Redis安装 Redis安装 可以设置开机自动启动&#xff0c;也可以在去查看系统服务&#xff0c;按[win R]&#xff0c;输入命…...

使用SHOW PROCESSLIST和SHOW ENGINE INNODB STATUS排查mysql锁等待问题

现象&#xff1a; mysql 查某表一直不能结束&#xff0c;查别的表没有问题。已知之前刚刚alter此表想把它的一个字段长度增长&#xff0c;但是这个操作一直没有结束。现在应该怎么办? 方案: 使用 SHOW PROCESSLIST; 查看当前所有活动的SQL线程&#xff0c;找出是否有长时间…...

探索HarmonyOS的UI开发新境界:从基础到进阶的深度解析

在科技日新月异的今天&#xff0c;操作系统作为连接硬件与软件的桥梁&#xff0c;其重要性不言而喻。HarmonyOS&#xff0c;作为华为自主研发的分布式全场景操作系统&#xff0c;正以其独特的分布式技术架构和一次开发多端部署的能力&#xff0c;引领着操作系统的新潮流。本文将…...

Android 动态加入Activity 时 manifest 注册报错解决。使用manifestPlaceholders 占位

需求如下&#xff1a; 项目 测试demo 有多个渠道&#xff0c;部分渠道包含支付功能&#xff0c;在主测试代码外&#xff0c;需要一个单独 Activity 调用测试代码。 MainActivityPayActivity渠道A包含不包含渠道B包含包含 因为支付功能需要引入对应的 moudule&#xff0c;因此…...

OpenCV(1):简介、安装、入门案例、基础模块

1 OpenCV 简介 OpenCV 是一个功能强大、应用广泛的计算机视觉库&#xff0c;它为开发人员提供了丰富的工具和算法&#xff0c;可以帮助他们快速构建各种视觉应用。随着计算机视觉技术的不断发展&#xff0c;OpenCV 也将会继续发挥重要的作用。OpenCV 提供了大量的计算机视觉算法…...

Linux-GlusterFS操作子卷

文章目录 分布式卷添加卷分布式卷删除子卷删除总卷 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年02月20日19点30分 分布式卷添加卷 Node1上进行操作 扩容 #服务器端 gluster volu…...

kettle从入门到精通 第九十二课 ETL之kettle 使用Kettle的Carte对外发布读写接口

场景&#xff1a;使用kettle实现将查询结果返回给客户端&#xff0c;也就是说kettle暴露查询接口供外围系统调用。前提必须是使用carte服务才可以提供接口供外部系统调用。具体实操方法如下&#xff1a; 1、设计转换 根据具体需求设计转换&#xff0c;主要用到的步骤有获取变…...

【精调】LLaMA-Factory 快速开始1: Meta-Llama-3.1-8B-Instruct

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml llamafactory-cli chat examples/inference/llama3_lora_sft.yaml llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml模型下载 git clone https://www.modelscope.cn/LLM-Research/Meta-Lla…...

数据库加密全解析:从传输到存储的安全实践

title: 数据库加密全解析:从传输到存储的安全实践 date: 2025/2/17 updated: 2025/2/17 author: cmdragon excerpt: 数据加密是数据库安全的最后一道物理防线。传输层SSL/TLS配置、存储加密技术及加密函数实战应用,覆盖MySQL、PostgreSQL、Oracle等主流数据库的20+生产级加密…...

PHP+Apache+MySQL安装(Windows)

一、安装教程 参考链接1 参考链接2 二、问题描述 PHP安装目录下找不到php8apache2_4.dll PHP安装包下载错误 Apache Service Monitor: request operation has failed! 定位问题&#xff1a; 查看【事件查看器】 解决问题 安装或更新与PHP版本相对应的Visual C Redistribu…...

alt+tab切换导致linux桌面卡死的急救方案

环境 debian12 gnome43.9 解决办法 观察状态栏&#xff0c;其实系统是没有完全死机的&#xff0c;而且gnome也可能没有完全死机。 1. alt f4 关闭桌面上的程序&#xff0c;因为这个方案是我刚刚看到的&#xff0c;所以不确定能不能用&#xff0c;比起重启系统&#xff0c;…...

Mysql基础语句

一、 MySQL语句 在熟悉安装及访问 MySQL 数据库以后&#xff0c; 接下来将学习使用 MySQL 数据库的基本操作&#xff0c;这也是在服务器运维工作中不可或缺的知识。 本节中的所有数据库语句均在“MySQL>”操作环境中执行 MySQL 是一套数据库管理系统&#xff0c;在每台 MySQ…...

网络通信基础:端口、协议和七层模型详解,网络安全零基础入门到精通实战教程!

一、端口和协议的概念 1.在网络技术中&#xff0c;端口(Port) 大致有两种意思&#xff1a; 一是物理意义上的端口&#xff0c;比如&#xff0c;ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口&#xff0c;如RJ-45端口、SC端口等等。 二是逻辑意义上的端口&…...

【力扣Hot 100】栈2

5. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: !https://assets.leetcode.com/uploads/2021/01/04/histogram.jpg …...

1. Linux下 MySQL 的详细安装与使用

1. Linux下 MySQL 的详细安装与使用 文章目录 1. Linux下 MySQL 的详细安装与使用1. Linux 下安装 MySQL8.0 的详细安装步骤&#xff1a;2. Linxu 当中的MySQL 设置远程登录3. 最后&#xff1a; 1. Linux 下安装 MySQL8.0 的详细安装步骤&#xff1a; 查看是否安装过MySQL&…...

Idea24.3 如何设置Git忽略某一个文件

文章目录 左上角找到commit选中你要忽略的文件 右键New Changelist给这个文件夹名称和描述 点击ok将要忽略的文件添加到这个文件夹 左上角找到commit 选中你要忽略的文件 右键New Changelist 给这个文件夹名称和描述 点击ok 将要忽略的文件添加到这个文件夹...

2025-02-20 学习记录--C/C++-PTA 7-27 冒泡法排序

一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ /** * 冒泡法实现升序 */#include <stdio.h>int main() {int N, // 整数个数 6K, // 扫描遍数 2num, // 待排序的整数 2 3 5 1 6 4numArr[100], // 待排序的整数合集 2 3 5 1…...

如何修改Windows系统Ollama模型存储位置

默认情况下&#xff0c;Ollama 模型会存储在 C 盘用户目录下的 .ollama/models 文件夹中&#xff0c;这会占用大量 C 盘空间&#xff0c;增加C盘“爆红”的几率。所以&#xff0c;我们就需要修改Ollama的模型存储位置 Ollama提供了一个环境变量参数可以修改Ollama的默认存在位…...

【Python爬虫(26)】Python爬虫进阶:数据清洗与预处理的魔法秘籍

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

NPM如何更换淘宝镜像——Node.js国内镜像配置教程

在国内使用 npm 安装 Node.js 包时&#xff0c;由于网络环境的原因&#xff0c;下载速度可能非常慢。为了解决这个问题&#xff0c;很多开发者会选择使用淘宝镜像&#xff08;现在由 npmmirror.com 维护&#xff09;。本文将带你一步一步完成更换 npm 源为淘宝镜像的配置&#…...

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车&#xff0c;搭载5.0 L发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;接通空调开关后&#xff0c;有时出风忽大忽小&#xff0c;有时不出风&#xff0c;有时要等2 min左右才出风&#xff1b;有时两三天出现一次&#xff0c;…...

pytorch3d安装记录

官方安装教程&#xff1a; https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md 通过pip 或conda 可以很容易安装上预编译好的包&#xff0c; 安装过程不会报错&#xff0c; 但是使用的时候就会报各种错误 &#xff0c;原因是预编译好的包跟自己的环境不一定…...

服务器通过 ollama 运行deepseek r1

1、服务器环境简介 56核 CPU64G 内存无显卡已安装 Ollama 2、下载模型与配置 正常可以通过 ollama pull 或 ollama run 命令直接下载&#xff0c;但通常会遇到连接超时、找不到网址等总理。因此&#xff0c;可以使用国内的模型站进行下载&#xff0c;在这里使用魔塔查找模型…...

ollama stream“:True django如何返回数据

在使用 Django 框架开发 Web 应用时&#xff0c;如果你想要通过 Ollama 流式返回数据&#xff0c;你可以通过 Django 的 HttpResponse 或者 StreamingHttpResponse 来实现。Ollama 主要用于处理文本生成任务&#xff0c;如聊天机器人、自动完成等&#xff0c;通常这些任务会产生…...

RabbitMQ 消息队列

1. 消息队列是什么&#xff1f; 当用户注册成功后&#xff0c;就发送邮件。当邮件发送成功了&#xff0c;接口才会提示注册成功信息。但由于发送邮件&#xff0c;依赖于其他厂商的服务&#xff0c;有可能他们的接口会非常耗时。那么用户就一直要等着邮件发送成功了&#xff0c;…...

idea从远程gitee拉取项目

文章目录 从gitee上面拿到项目地址填写远程地址,并且设置项目保存位置拉取成功 从gitee上面拿到项目地址 填写远程地址,并且设置项目保存位置 拉取成功...

PHP集成软件用哪个比较好?

在Windows环境下&#xff0c;使用PHP时&#xff0c;通常需要一个集成开发环境&#xff08;IDE&#xff09;或者集成软件来简化开发和调试过程。以下是几款常用且推荐的PHP集成软件&#xff0c;每款都有其特点&#xff0c;可以根据需求进行选择&#xff1a; 1. XAMPP 特点&…...

Es的text和keyword类型以及如何修改类型

昨天同事触发定时任务发现es相关服务报了一个序列化问题&#xff0c; 今天早上捕获异常将异常堆栈全部打出来看&#xff0c;才发现是聚合的字段不是keyword类型的问题。 到kibbna命令行执行也是一样的错误 使用 /_mapping查看索引的字段类型&#xff0c;才发现userUniqueid是te…...

【找工作】C++和算法复习(自用)

文章目录 C头文件自定义排序函数stl 算法数据结构树状数组 数学 自用随便记录 C 排序 stl 头文件 全能头文件&#xff1a; #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }stl 枚举map map&…...

Python VsCode DeepSeek接入

Python VsCode DeepSeek接入 创建API key 首先进入DeepSeek官网&#xff0c;https://www.deepseek.com/ 点击左侧“API Keys”&#xff0c;创建API key&#xff0c;输出名称为“AI” 点击“创建"&#xff0c;将API key保存&#xff0c;复制在其它地方。 在VsCode中下载…...

开放表格式和对象存储架构指南

比较 Apache Iceberg、Delta Lake 和 Apache Hudi&#xff0c;并了解如何为您的数据湖仓一体选择合适的开放表格式。开放表格式和对象存储正在重新定义组织构建其数据系统的方式&#xff0c;为可扩展、高效且面向未来的数据湖仓一体奠定了基础。通过利用对象存储的独特优势&…...

Netty入门详解

引言 Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能网络服务器和客户端。它提供了一组丰富的 API&#xff0c;使得开发人员能够轻松地处理各种网络协议&#xff0c;如 TCP、UDP 等&#xff0c;并且支持多种编解码方式&a…...

我国首条大型无人机城际低空物流航线成功首航

首航震撼开场&#xff1a;羊肉 “飞” 越 540 公里 在夜色的笼罩下&#xff0c;榆阳马合通用机场的跑道上&#xff0c;一架大型固定翼无人机蓄势待发&#xff0c;机身被灯光照亮&#xff0c;宛如一只即将展翅翱翔的钢铁巨鸟。它的货舱里&#xff0c;满满装载着新鲜的榆林羊肉&a…...