跳表和Mysql联合索引的最左原则和索引下推的优化
文章目录
- 跳表(Skip List)
- 关键特性
- 跳表的结构示意图
- 跳表的查询效率
- 为什么 MySQL 不使用跳表而使用 B+ 树?
- 跳表的实际应用场景
- 总结
- MySQL 联合索引的最左匹配原则
- 最左匹配原则的规则
- 示例:创建联合索引
- 查询示例及索引使用情况
- 设计联合索引
- MySQL 的索引下推优化(Index Condition Pushdown, ICP)
- 索引下推的工作原理
- 索引下推示例
- 索引下推的优势
- 索引下推的适用场景
- 联合索引和索引下推优化的实际案例
- 总结
- B+树的高度在3层时存储的数据可能已达千万级别,但对于跳表而言同样去维护千万的数据量那么所造成的跳表层数过高而导致的磁盘io次数增多,也就是使用B+树在存储同样的数据下磁盘io次数更少。
跳表(Skip List)
- 跳表(Skip List)是一种 平衡数据结构,它是对链表的一种优化,通过引入多层级的索引结构,提升了对有序链表的查找效率。
- 跳表是一种 概率型数据结构,经常用在 内存中的有序数据存储和检索 中,比如 Redis 的有序集合(ZSET)就使用了跳表。
- 跳表的核心是基于 多层级的链表结构。它在一个有序的单链表基础上,额外增加了多层的索引来跳跃查找数据。
关键特性
- 多层链表:
- 最底层是完整的链表,所有元素按顺序排列。
- 上层是索引层,每一层都是从下层链表中抽取部分元素作为索引。
- 最顶层的索引层可能只包含很少的元素,通常是头尾两个元素。
- 查询效率:每一层索引可以帮助快速跳过多个节点,将查找时间从 O(n) 降低到 O(log n)。
- 动态更新:插入、删除数据时会根据一定的概率来决定是否将新元素加入到索引层,从而动态维护平衡。
跳表的结构示意图
Level 4: 1 -----> -------> 17
Level 3: 1 -----> 9 -----> 17
Level 2: 1 -----> 5 -----> 9 -----> 17
Level 1: 1 -----> 3 -----> 5 -----> 7 -----> 9 -----> 17
- Level 1 是完整的链表,包含所有数据。
- 每一层向上的索引会抽取一部分数据(比如每两个节点抽取一个)。
- 查询时,通过高层索引快速跳过多个节点,从而加速查找。
跳表的查询效率
跳表的查询时间复杂度是 O(log n),原因如下:
- 跳表的层数为 log(n)(近似)。
- 每层的链表查找的节点数量是常数级别的。
为什么 MySQL 不使用跳表而使用 B+ 树?
在 MySQL 中,特别是使用磁盘作为存储设备时,B+ 树比跳表具有明显的优势,主要体现在以下几个方面:
- 磁盘 I/O 的影响
- B+ 树的优势:B+ 树是一种多叉树结构,叶子节点存储实际数据,内部节点存储索引。一个节点的大小通常设置为和磁盘页大小(一般为 4KB)一致,这样一个节点可以存储多个索引值。在树的高度为 3 时,可以容纳数千万级别的数据,查询数据时只需 3 次磁盘 I/O(树的高度)。
- 跳表的劣势:跳表是链表的变种,其多层索引分布在不同的节点上,节点之间通过指针连接。这种结构会导致查询时需要频繁访问多个节点,跳表的每一层访问都可能需要一次磁盘 I/O,导致磁盘访问次数更多。
- 存储效率
- B+ 树:内部节点只存储索引值,而叶子节点存储完整数据。B+ 树利用磁盘页大小来最大化节点的存储容量,能够有效减少存储开销和磁盘访问次数。
- 跳表:跳表需要存储多个索引层的数据,并且每个索引节点需要额外的指针来维护链表结构。相比之下,跳表的存储效率更低。
- 范围查询的性能
- B+ 树的优势:B+ 树的叶子节点通过指针相连,可以高效地支持范围查询(Range Query)。例如,直接从一个节点遍历到下一个节点即可。
- 跳表的劣势:虽然跳表也支持范围查询,但由于链表的结构特点,每次范围查询都可能会带来大量随机的指针访问,性能不如 B+ 树高效。
- 复杂度和成熟度
- B+ 树的成熟度:B+ 树是一种成熟的磁盘存储数据结构,广泛应用于数据库系统,尤其在事务管理、并发控制和磁盘优化方面非常成熟。
- 跳表的复杂度:跳表更多用于 内存场景,而不是面向磁盘优化。因为磁盘访问的开销远高于内存访问,跳表在磁盘场景下无法充分发挥其优势。
- 动态平衡性
- B+ 树的动态平衡:B+ 树通过分裂和合并节点来动态维护平衡,确保树的高度尽量保持最小。
- 跳表的随机性:跳表通过概率算法来决定索引层的节点分布,虽然简单,但它不如 B+ 树的平衡性高效和稳定。
跳表的实际应用场景
跳表不适合磁盘场景,但在 内存中的有序数据管理 场景下非常有用。例如:
- Redis:Redis 的有序集合(ZSET)实现中使用了跳表。跳表在内存中快速、高效,且实现简单,是 Redis 的理想选择。
- 内存数据库:跳表适合用于纯内存数据库场景,数据访问快速,插入、删除效率高。
- 日志系统:在一些高效的日志存储与查询系统中,跳表可以作为索引的一种结构。
总结
- 跳表 是一种简单、高效的内存数据结构,但在磁盘场景下,存储效率和访问性能都不如 B+ 树。
- B+ 树 是一种更适合磁盘的存储结构,具有高效的磁盘 I/O、范围查询能力和动态平衡性能,因此 MySQL 和其他关系型数据库优先选择 B+ 树。
- 跳表更适合用于 内存场景,例如 Redis、内存数据库或其他需要有序数据结构的应用场景。
MySQL 联合索引的最左匹配原则
- 联合索引是指在一个索引中包含多个列,例如
(a, b, c)
这样的多列索引。 - MySQL 的查询优化器在使用联合索引时,会遵循 最左前缀匹配原则,这意味着联合索引的查询必须从最左边的列开始,按顺序逐层匹配。
最左匹配原则的规则
- 从联合索引的最左列开始匹配,只要某一列中断匹配,后续的列将无法继续使用索引。
- 支持部分匹配,例如联合索引
(a, b, c)
中,可以只匹配a
或a, b
,但无法直接从b
或c
开始匹配。
示例:创建联合索引
假设我们有如下表和索引:
CREATE TABLE example (a INT,b INT,c INT,d VARCHAR(50),PRIMARY KEY (a, b, c) -- 联合索引 (a, b, c)
);
查询示例及索引使用情况
-
完全匹配左侧字段:使用整个联合索引
(a, b, c)
。索引命中最优。SELECT * FROM example WHERE a = 1 AND b = 2 AND c = 3;
-
部分匹配左侧字段:使用索引
(a, b)
,未涉及的c
列无法使用索引。SELECT * FROM example WHERE a = 1 AND b = 2;
-
仅匹配最左前缀:使用索引
(a)
,b
和c
无法使用。SELECT * FROM example WHERE a = 1;
-
跳过中间列(不满足最左原则):无法使用索引,因为查询未从最左列
a
开始。SELECT * FROM example WHERE b = 2 AND c = 3;
-
跨列范围查询(部分失效):索引只会用于
(a, b)
,因为范围查询b > 2
导致后续的c
无法使用索引。SELECT * FROM example WHERE a = 1 AND b > 2 AND c = 3;
设计联合索引
设计联合索引时,可以根据查询的使用频率和条件的选择性(唯一性高的列优先)来决定列的顺序。例如:
- 如果查询条件大多是
a
或a, b
,优先设计索引为(a, b, c)
。 - 如果查询条件大多是
b
或b, c
,优先设计索引为(b, c, a)
。
MySQL 的索引下推优化(Index Condition Pushdown, ICP)
- 索引下推 是 MySQL 5.6 引入的一种优化机制,用于减少全表扫描,提高索引的利用效率。
- 它的作用是在使用 联合索引 时,将部分查询条件尽可能下推到存储引擎层处理,减少不必要的数据传输和服务器层的判断开销。
索引下推的工作原理
在没有索引下推优化之前,MySQL 的查询流程如下:
- 存储引擎根据索引查找到匹配的记录。
- 将记录返回给 MySQL 服务器层。
- 在服务器层进行查询条件的过滤。
在索引下推优化开启后:
- 存储引擎层可以根据索引中的列直接对记录进行部分过滤。
- 只有满足部分查询条件的记录才会返回给服务器层,减少数据传输量和服务器层的计算开销。
索引下推示例
- 示例表结构
CREATE TABLE example (id INT PRIMARY KEY,a INT NOT NULL,b INT NOT NULL,c VARCHAR(50),INDEX idx_a_b (a, b)
);
- 查询示例及执行情况
-
无索引下推时(MySQL 5.5 及以下):
SELECT * FROM example WHERE a = 1 AND b > 2;
- 存储引擎会根据
a = 1
找到所有符合条件的记录。 - 然后将这些记录返回给服务器层,再在服务器层判断
b > 2
。 - 如果
a = 1
找到了很多行,但只有很少的行满足b > 2
,则会有大量无用数据被返回给服务器层。
- 存储引擎会根据
-
开启索引下推后(MySQL 5.6 及以上):
SELECT * FROM example WHERE a = 1 AND b > 2;
- 存储引擎会先根据
a = 1
找到符合条件的记录。 - 然后在存储引擎层判断
b > 2
,只将满足条件的记录返回给服务器层。 - 减少了传输和服务器层的计算开销。
- 存储引擎会先根据
索引下推的优势
- 减少数据传输:数据过滤尽量在存储引擎层完成,减少传递给服务器层的数据量。
- 提高查询效率:减少了服务器层的判断和过滤工作,提升了整体查询性能。
- 充分利用索引:即使索引无法完全覆盖查询条件,存储引擎层仍可以利用索引的部分列进行优化。
索引下推的适用场景
- 范围查询: 存储引擎可以通过
a = 1
和b > 2
下推条件,减少不必要的返回行。SELECT * FROM example WHERE a = 1 AND b > 2;
- 带前缀匹配的模糊查询:如果索引中包含列
c
,存储引擎可以直接过滤掉不满足c LIKE 'abc%'
的记录。SELECT * FROM example WHERE a = 1 AND c LIKE 'abc%';
联合索引和索引下推优化的实际案例
假设有如下表和索引:
CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT,product_id INT,order_date DATE,total_amount DECIMAL(10, 2),INDEX idx_user_product_date (user_id, product_id, order_date)
);
执行查询:
SELECT * FROM orders
WHERE user_id = 123 AND product_id > 1000 AND order_date >= '2025-01-01';
优化过程:
-
联合索引使用情况:
user_id = 123
:匹配索引的第一列。product_id > 1000
:匹配索引的第二列。order_date >= '2025-01-01'
:匹配索引的第三列。- 联合索引
(user_id, product_id, order_date)
完全生效。
-
索引下推的作用:
- 存储引擎先通过索引
(user_id, product_id, order_date)
定位记录。 - 然后在存储引擎层过滤掉
product_id > 1000
和order_date >= '2025-01-01'
不符合条件的记录。 - 最终返回满足所有条件的记录到服务器层。
- 存储引擎先通过索引
- 性能对比
- 无索引下推:存储引擎返回大量
user_id = 123
的记录,服务器层需要逐条判断其他条件。 - 有索引下推:存储引擎层直接过滤不必要的数据,显著减少返回记录的数量。
- 无索引下推:存储引擎返回大量
总结
- 联合索引的最左原则:必须从索引的最左列开始,按顺序逐列匹配。中断匹配后,后续列无法使用索引。
- 索引下推优化:将更多的过滤条件下推到存储引擎层,提高索引的利用率。减少数据传输量,提升查询性能。
相关文章:
跳表和Mysql联合索引的最左原则和索引下推的优化
文章目录 跳表(Skip List)关键特性跳表的结构示意图跳表的查询效率为什么 MySQL 不使用跳表而使用 B 树?跳表的实际应用场景 总结 MySQL 联合索引的最左匹配原则最左匹配原则的规则示例:创建联合索引查询示例及索引使用情况设计联…...
Android切换语言不退出App
1.需求 实现用户选择语言(未点击下一步),更新当前界面UI,点击下一步后,更新App的语言,并进行保存。 实现目标: 1.设置App的语言,本地进行保存 2.updateResources更新本地语言配置…...
Unity编程与游戏开发-编程与游戏开发的关系
游戏开发是一个复杂的多领域合作过程,涵盖了从创意构思到最终实现的多个方面。在这个过程中,技术、设计与美术三大核心要素相互交织,缺一不可。在游戏开发的过程中,Unity作为一款强大的跨平台游戏引擎,凭借其高效的开发工具和庞大的社区支持,成为了很多游戏开发者的首选工…...
【Git】问题汇总
在push的时候显示 protocol error: bad line length 8192 我在本地创建了一个gogs服务器,现在正在上传代码,但是出现了上述的这个问题。 解决方法 设置本地http.postBuffer(待验证) 方法一:全局配置 git config --g…...
搭建docker私有化仓库Harbor
Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…...
修改sshd默认配置,提升安全
对于Linux服务器,特别是暴露在公网的服务器,会经常被人扫描、探测和攻击。包括通过ssh访问登录攻击。对此,对默认的sshd配置进行调整,提升安全。 下面以CentOS 7.9为例说明: 一、常见安全措施 以root用户编辑vim /e…...
formik 的使用
礼记有言:独学而无友,则孤陋而寡闻 让我们一起了解更多便捷方法,缩短开发时间去摸鱼,嘿嘿。 框架:react 在写表单的时候,我不太喜欢把验证写的很繁琐,这里讲介绍,验证表单的非常好用…...
【学习笔记】理解深度学习的基础:机器学习
1. 机器学习基础 1.1 机器学习的定义与重要性 定义:深度学习是机器学习的一种特定形式。为了深入理解深度学习,必须牢固掌握机器学习的基本原理。机器学习算法是一种能够从数据中学习的算法,通过经验E在任务T上提高性能度量P(Mi…...
Docker 基础知识
背景 传统的linux的环境部署 命令多步骤多安装版本多使用docker的话,一个命令就可以全部搞定安装linux 之前安装过,所以直接使用的开罩进行复制的如果之前配置过静态地址,需要改成IPV4静态地址访问安装docker 参考连接:https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBk…...
pyqt鸟瞰
QApplication是Qt框架中的一个类,专门用于管理基于QWidget的图形用户界面(GUI)应用程序的控制流和主要设置。QApplication类继承自QGuiApplication,提供了许多与GUI相关的功能,如窗口系统集成、事件处理等。 QAppli…...
Linux syslog 运行机制
Busybox的syslogd认识与使用 syslogd 的基本工作原理: syslogd 是一个系统日志守护进程,它接收来自各种进程和系统服务的日志消息,并根据配置将这些消息存储到不同的日志文件中。 syslogd日志记录器由两个守护进程(klogd&#x…...
ZYNQ初识10(zynq_7010)UART通信实验
基于bi站正点原子讲解视频: 系统框图(基于串口的数据回环)如下: 以下,是串口接收端的波形图,系统时钟和波特率时钟不同,为异步时钟,,需要先延时两拍,将时钟同…...
day38 tcp 并发 ,linux下的IO模型----IO多路复用
TCP 并发 由于tcp协议只能实现一对一的通信模式。为了实现一对多,有以下的的处理方式 1. 多进程 开销大 效率低 2. 多线程 创建线程需要耗时 3. 线程池 多线程模型创建线程耗时问题,提前创建 4. IO多路复用 在不创建进程和线程的前提下,对…...
el-date-picker 禁用一个月前、一个月后(当天之后)的时间 datetimerange
文章目录 功能需求今天是 2025-01-09示例1示例2 代码 Vue2 功能需求 时间范围选择器,最大时间选择尺度为一个月。 今天是 2025-01-09 示例1 选择 2025-01-02 日 禁用未来日期(2025-01-09之后日期) 禁用上月2号(31日之前&#…...
ES6的高阶语法特性
一、模板字符串的高级用法 1.1.模板字符串的嵌套 模板字符串的嵌套允许在一个模板字符串内部再嵌入一个或多个模板字符串。这种嵌套结构在处理复杂数据结构或生成具有层级关系的文本时非常有用。 1. 嵌套示例 假设我们有一个包含多个对象的数组,每个对象都有名称、…...
数据在内存的存储
数据类型介绍 前面我们已经学习了基本的内置类型: char //字符数据类型 1字节 打印%c short //短整型 2字节 打印%hd int //整形 4字节 打印%d long long int //长整型 4/8字节 打印%ld l…...
【微服务】面试题 6、分布式事务
分布式事务面试题讲解 一、问题背景与解决方案概述 因微服务项目涉及远程调用可能引发分布式事务问题,需解决。主流解决方案有阿里 Seata 框架(含 XA、AT、TCC 模式)和 MQ。 二、Seata 框架关键角色 事务协调者(TC)&…...
VMware中Ubuntu如何连接网络?安排!
一、设置NAT模式 1、关闭Ubuntu虚拟机: 确保Ubuntu已经完全关机,而不是挂起或休眠状态。 2、编辑虚拟网络设置: 在VMware主界面点击“编辑”菜单,选择“虚拟网络编辑器”。 如果需要,选择VMnet8 (NAT模式)并点击“更改…...
最近在盘gitlab.0.先review了一下docker
# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上,实例是别的同事搭建的。最近又又又想了解一下,而且已经盘了一些了,所以写写记录一下。因为这个事儿没太多的进度压力,索性写到哪儿算哪儿,只要是新了解到的…...
TCP封装数据帧
void *send_data(void *arg) //这是一个发送数据的线程 {int sockfd init_tcp_cli("192.168.0.148",50000) //传ip和port,port 50000是因为大概前五万都被其它服务所占用,50000后是私人ipif(sockfd < 0){return NULL;}unsigned char …...
基于Springboot+Vue的仓库管理系统
开发一个基于Spring Boot和Vue的仓库管理系统涉及到前端和后端的开发。本文呢,给出一个简单的开发步骤指南,用于指导初入的新手小白如何开始构建这样一个系统,如果**你想直接学习全部内容,可以直接拉到文末哦。** 开始之前呢给小…...
工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理
哈喽~这里是维小帮,提供多个场所的定位管理方案,如需获取工厂人员定位管理系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花 在上一篇文章中,我们初步探讨了工厂人员定位管理系统的需求背景以及定位方…...
机器学习特征重要性之feature_importances_属性与permutation_importance方法
一、feature_importances_属性 在机器学习中,分类和回归算法的 feature_importances_ 属性用于衡量每个特征对模型预测的重要性。这个属性通常在基于树的算法中使用,通过 feature_importances_ 属性,您可以了解哪些特征对模型的预测最为重要…...
Go学习:多重赋值与匿名变量
目录 1. 变量的多重赋值 1.1 基本语法格式 1.2 交换变量值 2. 匿名变量的使用 1. 变量的多重赋值 1.1 基本语法格式 go语言中,可以将多个赋值语句 合并成 一句,比如: a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以…...
解读Linux Bridge中的东西流向与南北流向
解读Linux Bridge中的东西流向与南北流向 在现代云计算和虚拟化环境中,网络流量的管理和优化变得越来越重要。Linux Bridge作为Linux内核提供的一个强大的二层交换机工具,在虚拟化和容器化应用中扮演着至关重要的角色。本文将深入探讨Linux Bridge中的两…...
spring mvn 国际化配置
目录 国际化配置测试测试自定义一个MessageSource类型的beanSpringApplicationUtil工具类MessageUtls工具类配置 国际化原理ResourceBundleMessageSource 国际化配置测试 测试 测试: 自定义一个MessageSource类型的bean import org.springframework.context.Mess…...
Windows下Dll在Unity中使用的一般方式
Windows下Dll在Unity中使用的一般方式 Unity中虽然已经有广泛的库和插件,但是相较于C的库生态而言,还是有一定的差距;因此本篇博文记录Windows下将C函数打包成动态链接库在Unity中使用的一般方法。 环境 Visual Studio 2019 , Uni…...
SQLite PRAGMA
SQLite的PRAGMA命令是一种特殊的命令,用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取,也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下: 要查询当前的PRAGMA值,只需提供该PRAGMA的名字&am…...
Linux:进程控制
1.fork()函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id࿰…...
一些计算机零碎知识随写(25年1月)-1
我原以为世界上有技术的那批人不会那么闲,我错了,被脚本真实了。 今天正隔着画画呢,手机突然弹出几条安全告警通知。 急忙打开服务器,发现问题不简单,直接关服务器重装系统..... 首先,不要认为小网站&…...
spring mvc源码学习笔记之十
前面的文章介绍了用 WebApplicationInitializer 或者 AbstractAnnotationConfigDispatcherServletInitializer 来代替 web.xml 。 我们学 java web 的时候就知道,servlet 容器会自动加载 web.xml。 那么,疑问就来了,WebApplicationInitialize…...
网络安全-安全散列函数,信息摘要SHA-1,MD5原理
安全散列函数 单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要。数据指纹)。还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA 散列函数的要求 散列函数的目的是文件、消息或者其它数据…...
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》 一、MiniGPT-4:小模型撬动大视觉理解(一)项目概览(二)核心亮点(三)上手体验 二、ClipCap-Chinese:中文场景…...
vue封装axios请求
在vue项目中我们发送请求一般是使用axios 我们可以封装axios来避免冗余代码 首先引入axios npm install axios创建环境配置文件 NODE_ENV development VITE_APP_TITLE dev VITE_APP_BASE_API /test VITE_SERVE "http://127.0.0.1"上面是创建dev配置文件 也可以…...
【前端动效】原生js实现拖拽排课效果
目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示,页面左侧有一个包含不同课程(如语文、数学等)的列表,页面右侧…...
Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。
文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载(以Chrome和Edge为例)3 基础使用(以Chrome为例演示)3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…...
AI华佗?港中大、深圳大数据研究院提出医疗推理大模型HuatuoGPT-o1
编辑 | 白菜叶 OpenAI o1 的突破凸显了通过增强推理能力来提高自然语言大模型(LLM)的应用潜力。然而,大多数推理研究都集中在数学任务上,而医学等领域尚未得到充分探索。 医学领域虽然不同于数学,但鉴于医疗保健的高…...
openEuler22.03系统使用Kolla-ansible搭建OpenStack
Kolla-ansible 是一个利用 Ansible 自动化工具来搭建 OpenStack 云平台的开源项目,它通过容器化的方式部署 OpenStack 服务,能够简化安装过程、提高部署效率并增强系统的可维护性。 前置环境准备: 系统:openEuler-22.03-LTS-SP4 配置&…...
uni-app无限级树形组件简单实现
因为项目一些数据需要树形展示,但是官网组件没有。现在简单封装一个组件在app中使用,可以无线嵌套,展开,收缩,获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…...
初学stm32 --- ADC单通道采集
目录 ADC寄存器介绍(F1) ADC控制寄存器 1(ADC_CR1) ADC控制寄存器 2(ADC_CR2) ADC采样时间寄存器1(ADC_SMPR1) ADC采样时间寄存器2(ADC_SMPR2) ADC规则序列寄存器 1(ADC_SQR1) ADC规则序列寄存器 2(ADC_SQR2) ADC规则序列寄存器 3(ADC_SQR3) AD…...
css盒子水平垂直居中
目录 1采用flex弹性布局: 2子绝父相margin:负值: 3.子绝父相margin:auto: 4子绝父相transform: 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接:文字水平垂直居中-CSDN博客 以下为盒子…...
django基于Python的智能停车管理系统
1.系统概述 1.定义:Django 基于 Python 的智能停车管理系统是一个利用 Django 框架构建的软件系统,用于高效地管理停车场的各种事务,包括车辆进出记录、车位预订、收费管理等诸多功能。 2.目的:它的主要目的是提高停车场的运营效…...
Rabbit Rocket kafka 怎么实现消息有序消费和延迟消费的
在消息队列系统中,像 RabbitMQ、RocketMQ 和 Kafka 这样的系统,都支持不同的方式来实现消息的有序消费和延迟消费。下面我们分别探讨这些系统中如何实现这两种需求: 1. RabbitMQ:实现消息有序消费和延迟消费 有序消费࿱…...
Kafka 会丢消息吗?
目录 01 生产者(Producer) 02 消息代理(Broker) 03 消费者(Consumer) 来源:Kafka 会丢消息吗? Kafka 会丢失信息吗? 许多开发人员普遍认为,Kafka 的设计本身就能保证不会丢失消息。然而,Kafka 架构和配置的细微差别会导致消息的丢失。我们需要了解它如何以及何时…...
状态模式详解与应用
状态模式(State Pattern),是一种行为型设计模式。它允许一个对象在其内部状态改变时改变它的行为,使得对象看起来似乎修改了它的类。通过将不同的行为封装在不同的状态类中,状态模式可以避免大量的条件判断语句&#x…...
红队工具使用全解析:揭开网络安全神秘面纱一角
红队工具使用全解析:揭开网络安全神秘面纱一角 B站红队公益课:https://space.bilibili.com/350329294 学习网盘资源链接:https://pan.quark.cn/s/4079487939e8 嘿,各位网络安全爱好者们!在风云变幻的网络安全战场上&am…...
【Spring】Redis缓存+ehcache
文章目录 基于Spring的RedisehcacheRedis 缓存配置Cacheable 注解CacheEvict 注解缓存配置 基于Spring的Redisehcache Redis 缓存配置 在项目中添加 Redis 的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…...
【硬件介绍】Type-C接口详解
一、Type-C接口概述 Type-C接口特点:以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验,避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构:内部上下两排引脚的设计虽然可能不…...
网络传输层TCP协议
传输层TCP协议 1. TCP协议介绍 TCP(Transmission Control Protocol,传输控制协议)是一个要对数据的传输进行详细控制的传输层协议。 TCP 与 UDP 的不同,在于TCP是有连接、可靠、面向字节流的。具体来说,TCP设置了一大…...
Git 基础——《Pro Git》
⭐获取 Git 仓库 获取 Git 仓库有两种方式: 将未进行版本控制的本地目录转换为 Git 仓库。从其他服务器克隆一个已存在的 Git 仓库。 在已存在目录中初始化 Git 仓库 进入目标目录 在 Linux 上:$ cd /home/user/my_project在 macOS 上:$ c…...