MySQL高频八股——索引
大家好,我是钢板兽!
今天来更新MySQL高频八股的最后一篇文章,包括很多内容:索引分类、最左匹配原则、范围查询使联合索引失效、索引下推、给联合查询加索引、索引失效情况。
在MySQL的第一篇八股文章,我写了MySQL的索引结构B+树,今天来重新学习一下索引。索引类似于书的目录,可以加快查询数据的定位速度,而无需遍历整个数据表。
1 索引分类
如果要将索引分类,会有很多分法:按字段特性分类、按底层数据结构分类、按数据存储方式分类。
(1)按字段特性分类
- 主键索引(PRIMARY KEY):表的主键字段上自动创建的索引,具有唯一性。每个表只能有一个主键索引,且不能为空(NOT NULL)。
- 唯一索引(UNIQUE INDEX):某个字段(或字段组合)的值在表中是唯一的,但允许
NULL
(多个NULL
视为不同值),适用于邮箱、身份证等唯一性字段。 - 普通索引(INDEX):最基本的索引类型,没有唯一性限制,主要用于加速查询。
- 联合索引(INDEX):由多个字段组合而成的索引,可加速多个字段的查询。
- 全文索引(FULLTEXT INDEX):用于文本字段的全文搜索,支持自然语言查询。
- 空间索引(SPATIAL INDEX):用于 地理信息数据,支持空间查询。
括号里的英文是创建索引要用的字段,比如要创建一个唯一索引:
CREATE UNIQUE INDEX unique_name ON students(name);
(2)按底层结构分类
按照索引的底层结构分类,其实在《MySQL高频八股—— MySQL的存储引擎及索引结构》这篇文章已经讲过了,我在文章里写了B+树作为索引的底层结构,相对于红黑树、哈希表等数据结构的优点。
这里简单介绍一下索引按照底层结构的分类。
- B+树索引:MySQL默认的索引类型,支持范围查询和排序操作。
- 哈希索引(Hash Index):仅支持等值查询。
- R-Tree索引:用于空间数据,支持地理信息查询。
(3)按数据存储方式分类
-
聚簇索引:数据和索引存储在一起,索引的非叶子节点存储主键,而叶子节点直接存储整行数据。
只有主键索引是聚簇索引。适用于主键查询,避免额外回表。
回表是指回到原始表中根据主键去取完整数据。
-
非聚簇索引:索引和数据分开存储,索引的非叶子节点存储索引列的值,而叶子节点存储的只是主键的地址(指向数据行的主键值)。
查询非主键索引时,需要回表查询(即先查索引,再查主键)。
我觉得有必要深入了解一下聚簇索引,这有助于帮助我们明白MySQL中索引是怎么“起效”的。
聚簇索引在带来很多方便(由于无需回表所以查询主键很快,适合范围查询)的同时,也带来了一些缺点。
(1)插入数据会导致页分裂或和磁盘碎片化
由于聚簇索引的数据存储顺序与索引顺序一致,新插入的数据必须按照索引的顺序存放。如果新插入的数据的主键值是随机的(如 UUID、无序的整数),则新数据可能需要插入到 B+ 树的中间位置,而不是直接追加到末尾。这会导致页分裂(Page Split),MySQL 需要拆分已有数据页,以腾出空间放入新数据。频繁的页分裂会导致磁盘碎片化,数据分散存储,影响查询性能。
解决方案:使用自增主键,避免使用 UUID 或无序主键。
(2)主键变更代价高
在聚簇索引中,数据的物理存储顺序是按照主键排序的。如果更新了主键的值,MySQL 需要删除原来的数据行,插入一条新的数据行,重新组织 B+ 树索引结构。
解决方案:尽量避免更新主键字段,可以使用代理键(如 AUTO_INCREMENT 自增 ID),而不是业务字段作为主键。
2 联合索引的使用
刚才在索引的分类已经提到联合索引,联合索引是指一个索引包含多个字段。对于联合索引 (a, b, c)
,能够在多个列上进行索引查找,从而加速查询。
我们要知道的一点是,被索引的列会自动进行排序,包括单列索引和联合索引,只是联合索引的排序要复杂一些,会按照a、b、c依次排序。
这就意味着,(a,b,c)联合索引,是先按 a 排序,在 a 相同的情况再按 b 排序,在 b 相同的情况再按c排序。所以,b和c是全局无序,局部相对有序的。因此,联合索引的使用要遵循最左匹配原则。
如上图所示,索引 a 数据是全局有序的,而索引 b 数据是全局无序的,局部有序的(12,7 8,2,3,8,10,5,3),在同样的 a 数据情况下,索引 b 的数据是有序的。
2.1 最左匹配原则
联合索引的顺序非常关键,MySQL 会根据索引中字段的顺序,从左到右依次匹配查询条件中的字段。如果查询条件符合索引中的最左字段,则 MySQL 会使用该字段的索引来过滤数据。
假设有一个联合索引 (a, b, c)
。
- 如果查询条件中包括
a
,MySQL 会使用索引中a
的部分。 - 如果查询条件中同时包含
a
和b
,MySQL 会利用索引中(a, b)
部分。 - 如果查询条件中包含
a
、b
和c
,MySQL 会完全利用索引(a, b, c)
来加速查询。 - 如果查询条件是
a = 1 AND c = 1
,MySQL 只会利用a
的部分使用索引,而不会使用(a, c)
。
2.2 为什么范围查询会使联合索引失效
推荐阅读文章:https://blog.51cto.com/zhangxueliang/12684318。
范围查询是指查询条件中包含了某种不等式,比如 a > 1
、a <= 5
或 a BETWEEN 1 AND 10
等。
来看一个范围查询的例子:
SELECT * FROM table WHERE a > 1 AND b = 2
(a,b)联合索引的B+树结构如下图(还是刚才那张表),我们刚才说过:当 a 数据相同时,b数据有序。
但是现在 a 数据是一个范围,而不是一个定值,所有 大于1 的 a 数据相对应的 b 数据自然就是无序的了,所以联合索引就失效了,只有 a 可以用到联合索引。
同样的,其他范围查询a <= 5
或 a BETWEEN 1 AND 10
等也会使联合查询失效。
2.3 索引下推
索引下推(Index Condition PushDown,ICP)是 MySQL 5.6 版本后引入的优化功能。
索引下推是把本应该在 server 层进行筛选的条件,下推到存储引擎层来进行筛选判断,允许存储引擎在使用索引时,就直接执行查询条件的部分判断,减少回表的次数,提高查询效率。
例如,如果有一个查询条件 zipcode > '431200' AND month = 3
,使用联合索引 (zipcode, month)
。
根据前面的范围查询会使联合索引失效,我们知道,zipcode > '431200'
会让联合索引失效,而在MySQL5.6版本之后,索引下推的引入使得查询可以走联合索引。
-
在没有索引下推的情况下,存储引擎会首先用最左前缀索引查找
zipcode > '431200'
的所有记录,然后逐一进行回表扫描,去聚簇索引找到完整的行记录返回给server层,最后server层再筛选非前缀条件month = 3
的记录。 -
但在索引下推优化后,存储引擎 会在查找到
zipcode > '431200'
的所有记录后,直接筛选month = 3
的记录,符合所有条件的数据才会被一一回表扫描。
索引下推通过大幅减少需要访问的数据页数量,来提高查询性能。
当然索引下推的生效也是有要求的(只能存在联合索引里),具体可以阅读这篇文章:https://blog.csdn.net/qq_42672839/article/details/134733197。
2.4 怎么给联合查询加索引
在实际的数据库设计中,以下是一些常见的查询场景和如何添加索引的例子:
-
查询:
SELECT * FROM table WHERE a > 1 AND b = 2;
为
(b, a)
创建联合索引。b = 2
是等值查询,b
在索引中排在最左侧,能够快速定位数据。索引(b, a)
会首先利用b = 2
来定位符合条件的记录,然后再根据a > 1
来进一步筛选数据。 -
查询:
SELECT * FROM table WHERE a = 1 ORDER BY b;
- 解决方案:为
(a, b)
创建联合索引。a = 1
是等值查询,首先会利用a = 1
进行过滤,然后直接利用索引对b
进行排序,MySQL 就不需要额外的排序操作,直接返回已经排序好的结果,
- 解决方案:为
-
查询:
SELECT * FROM table WHERE a > 1 ORDER BY b;
- 解决方案:仅在
a
列上建立索引即可。a > 1
是范围查询,在使用联合索引时,如果a
是范围查询,那么b
列的顺序就不再有意义,MySQL 会忽略b
的排序优化。
- 解决方案:仅在
-
查询:
SELECT * FROM table WHERE a = 1 AND b = 2 AND c > 3 ORDER BY c;
- 解决方案:为
(a, b, c)
创建联合索引。a = 1
和b = 2
都是等值查询,MySQL 会首先使用这两列的索引进行过滤,而c > 3
是范围查询,虽然c
的顺序不再被保持,但在索引中进行筛选仍然能够大幅提升查询效率。
- 解决方案:为
3 索引失效情况
索引失效是 MySQL 查询优化时常见的问题,当索引无法被有效使用时,查询性能可能会大幅下降。
(1)不满足最左匹配原则
联合索引(复合索引) 必须按照索引字段的最左前缀开始匹配,否则索引无法有效使用,这点已经在上文讲过了。
(2)使用 SELECT *
SELECT * FROM employees WHERE name = 'Alice';
因为 SELECT *
需要所有字段,而索引 name
只包含部分字段,所以 MySQL 无法仅使用索引完成查询,必须回表。
所以最好使用索引覆盖查询(只查询索引列),避免回表:
SELECT name FROM employees WHERE name = 'Alice';
(3)索引列上有计算
SELECT * FROM employees WHERE salary / 2 = 5000;
MySQL 无法直接使用 salary
的索引,因为 salary / 2
需要计算,索引列的值无法直接匹配。
所以要改写查询,让索引列保持原值:
SELECT * FROM employees WHERE salary = 5000 * 2;
(4)索引列使用了函数
SELECT * FROM employees WHERE UPPER(name) = 'ALICE';
UPPER(name)
使 name
索引失效,因为索引存储的是 name
的原始值。
所以我们要避免对索引列使用函数,或者在业务层实现函数的功能。
(5)字段类型不同
索引列和查询条件的数据类型不一致,可能导致隐式类型转换,进而导致索引失效。
表的字段如下:
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),salary INT
);
执行语句:
SELECT * FROM employees WHERE salary = '10000';
salary
是 INT
类型,而 '10000'
是 VARCHAR
,导致 MySQL 进行隐式转换。
应当保持查询类型与索引列类型一致:
SELECT * FROM employees WHERE salary = 10000;
(6) LIKE
左边包含 %
SELECT * FROM employees WHERE name LIKE '%Alice%';
LIKE '%keyword'
不能使用 B+Tree 索引,因为 MySQL 无法确定字符串的开头,必须进行全表扫描。
所以我们要避免前导 %
,可以使用后导 %
。
SELECT * FROM employees WHERE name LIKE 'Alice%';
或者使用 全文索引(FULLTEXT INDEX):
CREATE FULLTEXT INDEX idx_name ON employees(name);
(7)列对比
SELECT * FROM employees WHERE age = salary;
索引只能用于变量和常量对比。age
和 salary
都是变量,导致索引失效。
(8)OR
关键字
如果OR 连接的查询条件中,某个条件未使用索引,整个查询就会索引失效。
SELECT * FROM employees WHERE name = 'Alice' OR salary = 10000;
只有name
和 salary
都是索引时,索引才会生效,否则不会生效。
我们可以使用 UNION ALL
代替 OR
,让每个查询使用索引:
SELECT * FROM employees WHERE name = 'Alice'
UNION ALL
SELECT * FROM employees WHERE salary = 10000;
(9)NOT IN
和 NOT EXISTS
MySQL 无法高效排除索引范围,导致索引失效,所以NOT IN
和 NOT EXISTS
会导致 MySQL 无法使用索引,必须执行全表扫描。
SELECT * FROM employees WHERE salary NOT IN (10000, 20000);
(10)ORDER BY
可能导致索引失效
索引必须匹配 ORDER BY
的顺序,否则索引可能无法使用。
SELECT * FROM employees ORDER BY salary DESC, name ASC;
salary
和 name
排序方向不一致,索引可能无法使用。
这篇文章到这里就结束啦,欢迎留言你对索引的见解。如果这篇文章对你有帮助,欢迎点赞、转发、留言!
相关文章:
MySQL高频八股——索引
大家好,我是钢板兽! 今天来更新MySQL高频八股的最后一篇文章,包括很多内容:索引分类、最左匹配原则、范围查询使联合索引失效、索引下推、给联合查询加索引、索引失效情况。 在MySQL的第一篇八股文章,我写了MySQL的索…...
二分查找(java)
文章目录 1. 基本原理2. 步骤3.练习 1. 基本原理 二分查找(Binary Search)是一种基于分治思想的高效搜索算法,核心逻辑是通过不断缩小搜索区间来定位目标值。其前提是数据必须为有序数组,时间复杂度为 O(log n)。 2. 步骤 1.…...
2025_0321_生活记录
刚刚写完待会儿早上要汇报的文档,看了一眼时间,现在已经是凌晨2点多了。一直说要早睡,但是一直都没做到。。。算了,不苛求自己了。 昨天是春分,春分秋分,昼夜平分。不知不觉就到春天了,但房间里…...
【LangChain入门 6 Chain组件】单链和多链
一、单链 1.1 LCEL的语法 | 为关键字,使用 | 作为链接符号 from langchain_core.output_parsers import StrOutputParser from langchain_ollama import ChatOllama llm ChatOllama( model"deepseek-r1:7b") parser StrOutputParser() # 加了这段后&…...
决策树基础
决策树 定义 从根节点开始,也就是拥有全部的数据,找一个维度对根节点开始划分, 划分后希望数据整体的信息熵是最小的, 针对划分出来的两个节点,我们继续重复刚才的划分方式寻找信息熵最小的维度和阈值。 递归这个…...
MATLAB+Arduino控制小车直行+转向
1 硬件 两轮车arduino板子 硬件连接 注意:电机连线。 这个小车的电机电流小,可以用arduino板子直接驱动,如果是大电流的,需要你自带电池,供电用用你的电池(如移动电源),控制信号&…...
【uni-app】引用公共组件
目录 一、建立公共组件 1.1新建vue文件 1.2编写公共文件代码 1.3使用 注意事项 一、建立公共组件 1.1新建vue文件 在公共组件文件目录下新建所需要的功能文件 1.2编写公共文件代码 按需求写对应功能的代码 1.3使用 在需要使用的文件下引用公共组件 注意事项 想要使用s…...
六西格玛遇上Python:统计学的高效实践场
在当今数据驱动的时代,数据分析和可视化工具成为了各行业优化流程、提升质量的关键手段。六西格玛(Six Sigma)作为一种以数据为基础、追求完美质量的管理理念,其实施依赖于一系列基础工具的灵活运用。而Python,凭借其强…...
虚幻基础:UI
文章目录 控件蓝图可以装载其他控件蓝图可以安装其他蓝图接口 填充:相对于父组件填充水平框尺寸—填充—0.5:改变填充的尺寸填充—0.5:改变与父组件的距离 锚点:相对于父组件的控件坐标系原点,屏幕比例改变时ÿ…...
事件、页面跳转、wxml语法——微信小程序学习笔记
1. 事件 1.1 事件绑定 <!--pages/infoPage/infoPage.wxml--><button type"primary" bind:tap"childrenClicked">子按钮</button> // pages/infoPage/infoPage.jsPage({childrenClicked(){console.log("childrenClicked")} …...
关于kafka的一些知识总结
Kafka 1. 基本知识 1.1 前置知识 topic表示一个类型/业务的数据的组为方便扩展,提高吞吐率,一个topic分为多个partition。配合分区的设计,提出消费者组的概念,每个消费者并行消费,同时,一个分区的数据&a…...
系统架构书单推荐(一)领域驱动设计与面向对象
本文主要是个人在学习过程中所涉猎的一些经典书籍,有些已经阅读完,有些还在阅读中。于我而言,希望追求软件系统设计相关的原则、方法、思想、本质的东西,并希望通过不断的学习、实践和积累,提升自身的知识和认知。希望…...
JS—原型与原型链:2分钟掌握原型链
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–原型三–原型链 二. 原型 什么是原型? 每个JavaScript对象都有一个原型,这个原型也是一个对象。比方说 function Person(name) {this.name name; } let person new Person(&quo…...
微软产品的专有名词和官方视频教程
Legend/Acronyms (D) Microsoft Documentation (V) Video (B) Blog (S) Site (IG)<...
OpenCV旋转估计(5)图像拼接的一个函数waveCorrect()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 waveCorrect 是OpenCV中用于图像拼接的一个函数,特别适用于全景图拼接过程中校正波浪形失真(Wave Correction)…...
基于3DMax与Vray引擎的轻量级室内场景渲染实践
欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…...
项目日记 -云备份 -服务器配置信息模块
博客主页:【夜泉_ly】 本文专栏:【项目日记-云备份】 欢迎点赞👍收藏⭐关注❤️ 代码已上传 gitee 目录 前言配置信息文件文件配置类getInstance 获得实例readConfigFile 读取配置信息文件 测试 #mermaid-svg-ewlCpjdOf0q0VTLI {font-family:…...
Linux冯诺依曼体系与计算机系统架构认知(8)
文章目录 前言一、冯诺依曼体系冯•诺依曼体系结构推导内存提高冯•诺依曼体系结构效率的方法你用QQ和朋友聊天时数据的流动过程与冯•诺依曼体系结构相关的一些知识 二、计算机层次结构分析操作系统(Operator System)驱动层的作用与意义系统调用接口(system call)用户操作接口…...
23.linux下电脑健康检查
电脑健康检查 硬盘 工具 sudo apt-get install smartmontools检查命令 sudo smartctl -a /dev/sdb1输出结果 # smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.8.0-52-generic] (local build) # Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools…...
使用HAI来打通DeepSeek的任督二脉
一、什么是HAI HAI是一款专注于AI与科学计算领域的云服务产品,旨在为开发者、企业及科研人员提供高效、易用的算力支持与全栈解决方案。主要使用场景为: AI作画,AI对话/写作、AI开发/测试。 二、开通HAI 选择CPU算力 16核32GB,这…...
.NET 10 新的 JsonIgnoreCondition
Intro 之前提了一个 api 建议为 JsonIgnore 添加两个扩展,WhenReading 和 WhenWriting,主要的一个用例是 WhenReading 我们的 Api Response 里有一个字段非常的大,不需要在 response 里包含,但是从 json 里反序列化时时需要地所以不能简单地直接忽略,在使用 Newtonsoft.J…...
数据结构——哈夫曼编码、哈夫曼树
1 哈夫曼树、哈夫曼编码 定义 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 层,叶结点到根结点的路径长度为叶结点的层数&…...
MySQL 调优:查询慢除了索引还能因为什么?
文章目录 情况一:连接数过小情况二:Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么?MySQL 查询慢,我们一般也会想到是因为索引,但除了索引还有哪些原因会导致数据库查询变慢呢? 以下以 MySQL 中一条 S…...
数据库锁机制
一、数据库锁的分类 数据库锁机制根据不同的维度可分为多种类型: 按锁的粒度划分: 行级锁(Row-Level Lock):锁定单行数据,粒度最细,并发度高,如InnoDB引擎的行锁。表级锁(Table-Level Lock):锁定整张表,并发度低,如MyISAM引擎的表锁。页级锁(Page-Level Lock):…...
计算机二级web易错点(6)-选择题
在软件或系统的三层架构中,三层分别为表示层、逻辑层(业务逻辑层)和数据访问层。表示层主要负责与用户交互,展示数据和接收用户输入;逻辑层处于中间位置,负责处理业务逻辑,对表示层传来的请求进…...
深入理解 lt; 和 gt;:HTML 实体转义的核心指南!!!
🛡️ 深入理解 < 和 >:HTML 实体转义的核心指南 🛡️ 在编程和文档编写中,< 和 > 符号无处不在,但它们也是引发语法错误、安全漏洞和渲染混乱的头号元凶!🔥 本文将聚焦 <&#…...
windows环境下NER Python项目环境配置(内含真的从头安的perl配置)
注意 本文是基于完整项目的环境配置,即本身可运行项目你拿来用 其中有一些其他问题,知道的忽略即可 导入pycharm基本包怎么下就不说了(这个都问?给你一拳o(`ω*)o) 看perl跳转第5条 1.predict报错多个设备…...
Redis + 布隆过滤器解决缓存穿透问题
Redis 布隆过滤器解决缓存穿透问题 1. Redis 布隆过滤器解决缓存穿透问题 📌 什么是缓存穿透? 缓存穿透指的是查询的数据既不在缓存,也不在数据库,导致每次查询都直接访问数据库,增加数据库压力。 例如࿱…...
2025年3月 CCF GESP C++ 二级 真题解析
1. 单选题(每题2分,共30分) 第1题 试题:2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人,入了全球票房榜。下面关于DeepSeek与《哪吒2》的描述成立的是( )。 A. 《哪吒2》是一…...
回顾Python基础语法,辨析和C++等的不同~
由于很多院校的计科尤其软工专业在本科期间会设置大量有关不同编程语言的语法基础课,虽然整体来看大同小异,但还是有些细节在不同语言有所差异:比如分号在C和Java必须加,Python和JavaScript则不必,而在Matlab中加入则不…...
ubuntu设置开机自动运行应用
系统版本:Ubuntu 24.04.1 LTS桌面版 按招网上的资料显示,当前版本主要的实现方式有以下两种, 方式1:通过图形界面的【启动应用程序】设置开机自启动;方式2:配置为服务实现开机自启动。 但是在我的电脑上方…...
2024年MathorCup数学建模D题量子计算在矿山设备配置及运营中的建模应用解题文档与程序
2024年第十四届MathorCup高校数学建模挑战赛 D题 量子计算在矿山设备配置及运营中的建模应用 原题再现: 随着智能技术的发展,智慧矿山的概念越来越受到重视。越来越多的设备供应商正在向智慧矿山整体解决方案供应商转型,是否具备提供整体解…...
MCU vs SoC
MCU(Microcontroller Unit,单片机)和SoC(System on Chip,片上系统)是两种不同的芯片类型,尽管它们都实现了高度集成,但在设计目标、功能复杂性和应用场景上存在显著差异。以下是两者…...
我的uniapp自定义模板
uniapp自定义模板 如有纰漏请谅解,以官方文档为准后面这段时间我会学习小程序开发的知识,会持续更新可以查看我的github,后续我会上传我的uniapp相关练习代码有兴趣的话可以浏览我的个人网站,我会在上面持续更新内容,…...
JVM 类加载器之间的层次关系,以及类加载的委托机制
JVM 类加载器之间存在一种层次关系,通常被称为双亲委派模型 (Parent Delegation Model)。这种层次关系和委托机制是 Java 类加载机制的核心,对于保证 Java 程序的安全性和避免类冲突至关重要。 1. 类加载器的层次关系: JVM 中的类加载器(Cl…...
吞吐与时延的博弈,超发与冗余的交换
做传输协议加速,大家默认激进超发原则,却认为冗余双发不道德,其实这两个是一回事,它们本质上是一种 “矩” 内的交换,就像力和力臂交换但乘积不变一样,成本是固定的。 人们更能原谅激进超发是因为人们对吞…...
Jackson使用ObjectNode对象实现JSON对象数据(一):增、删、改、查
Jackson 是一款高性能的 Java JSON 处理库,广泛应用于 Java 对象的序列化(转为JSON)与反序列化(JSON转为对象)。作为 Spring MVC 默认的JSON解析器,其核心优势包括高性能、灵活性和丰富的功能支持。 Jackson 库中 ObjectNode 是操作 JSON 对象的核心类,…...
【递归、搜索和回溯算法】专题三 :穷举VS暴搜VS深搜VS回溯VS剪枝
回溯算法 回溯算法是一种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。 基本思想:从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到钱一个状态,再按照其他的…...
Ubuntu如何部署AI-Sphere-Butler(metahuman-stream)
环境: Ubuntu 20.04、22.04 Python3.10 Pytorch 1.12 CUDA 11.3 问题描述: Ubuntu如何部署AI-Sphere-Butler(metahuman-stream(LiveTalking)) 解决方案: 一、部署 本次部署以云服务器&a…...
基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手
基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手 一、准备工作:组装你的"数码工具箱" 1. 安装基础工具(Python环境) 操作步骤: 访问Python官网下载安装包安装时务必勾选Add Python to…...
SpringBoot分布式定时任务实战:告别重复执行的烦恼
场景再现:你刚部署完基于SpringBoot的集群服务,凌晨3点突然收到监控告警——优惠券发放量超出预算两倍!检查日志发现,两个节点同时执行了定时任务。这种分布式环境下的定时任务难题,该如何彻底解决? 本文将…...
第十二章 | Solidity 智能合约前后端集成实战
📚 第十二章 | Solidity 智能合约前后端集成实战 ——链上合约 前端钱包 用户交互,打造完整 DApp! 这章我们正式进入 DApp 全栈开发领域! 用 Ethers.js React/Vue 完成前端和合约交互完整的「前端发起交易 → 钱包签名 → 链上…...
sqlite3数据库(文件)损坏恢复方法
问题描述 实时控制系统在运行过程中,我使用DB Browser for SQLite工具写sqlite数据库操作,工具异常退出,再次使用此工具打开数据文件时,数据文件打不开,报错:invalid rootpage,如何处理? 解决…...
正则艺术:深入探讨高级语法——零宽断言与反向引用实战
正则艺术:深入探讨高级语法——零宽断言与反向引用实战 在 Python 这门语言中,正则表达式无疑是一把神奇的钥匙。它不仅能够轻松实现字符串匹配、替换和拆分,更在数据清洗、日志分析、爬虫开发等场景中大放异彩。作为一名拥有多年实战与教学经验的 Python 程序专家,今天我…...
python——UI自动化(1) selenium之介绍和环境配置
一、selenium介绍 selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测…...
专题|Python贝叶斯网络BN动态推理因果建模:MLE/Bayes、有向无环图DAG可视化分析呼吸疾病、汽车效能数据2实例合集
原文链接:https://tecdat.cn/?p41199 作为数据科学家,我们始终在探索能够有效处理复杂系统不确定性的建模工具。本专题合集系统性地解构了贝叶斯网络(BN)这一概率图模型在当代数据分析中的创新应用,通过开源工具bnlea…...
MQ,RabbitMQ,MQ的好处,RabbitMQ的原理和核心组件,工作模式
1.MQ MQ全称 Message Queue(消息队列),是在消息的传输过程中 保存消息的容器。它是应用程序和应用程序之间的通信方法 1.1 为什么使用MQ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理࿰…...
STM32__红外避障模块的使用
目录 一、红外避障模块 概述 二、直接读取OUT引脚电平 三、使用中断方式触发 一、红外避障模块 概述 引脚解释: VCC接3.3V 或 5.0VGND接开发板的GNDOUT数字量输出(0或1); 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 产品特点: …...
第三天 开始Unity Shader的学习之旅之第二天的补充
Unity Shader的学习笔记 第三天 开始Unity Shader的学习之旅之第二天的补充 文章目录 Unity Shader的学习笔记前言一、Unity 提供的内置文件和变量1. 内置的包含文件2. UnityCG.cginc中的常用结构体 二、Unity 提供的Cg/HLSL语义1. 从应用阶段传递模型数据给顶点着色器时Unity…...
文献分享: ColXTR——将ColBERTv2的优化引入ColXTR
1. ColXTR \textbf{1. ColXTR} 1. ColXTR原理 1.1. ColBERTv2 \textbf{1.1. ColBERTv2} 1.1. ColBERTv2概述 1.1.1. \textbf{1.1.1. } 1.1.1. 训练优化 1️⃣难负样本生成 初筛:基于 BM-25 \text{BM-25} BM-25找到可能的负样本重排:使用 KL \text{KL} KL…...