一文读懂 PG18 EXPLAIN 新字段:Index Searches

CentOS Stream 9中安装MySQL的详细步骤 本文详细介绍了在CentOS Stream 9系统中如何进行MySQL的在线安装、离线安装以及忘记密码的恢复操作。通过阅读本文,您将能够了解并掌握在CentOS Stream 9上安装MySQL的步骤,以及在遇到忘记密码的情况下的解决方案。 阅读详情

在 PostgreSQL 18 中,你会在 EXPLAIN ANALYZE 的输出结果中看到 “Index Searches”(索引搜索次数)相关行。如果你和我一样好奇这些行到底是什么意思,那这篇文章就是为你准备的。

标准情况

标准情况是 “Index Searches: 1”,表示对索引进行一次遍历。如果所需数据都集中在索引的同一区域,这种情况可能非常高效。但如果所需条目并非集中存储,那么扫描过程中会包含大量不满足查询条件的条目,效率就会很低。后面会详细说明这一点!

当索引搜索次数大于 1 时是什么情况

在 Postgres 17 中,有一项不错的优化,允许“让 btree 索引更高效地查找一组值,例如 IN 子句提供的值”。这项优化基于 Postgres 9.2 中“让 btree 原生处理 ScalarArrayOpExpr 子句”以及更早时针对(仅限)位图索引扫描的优化成果。

文档中提供了一个示例,位图索引扫描的结果显示索引被搜索了 4 次,IN 列表中的每个值对应一次搜索。以下是 PostgreSQL 18 中的输出结果,能看到 Index Searches 字段:

EXPLAIN ANALYZE
SELECT * FROM tenk1 WHERE thousand IN (1, 500, 700, 999);
                                                            QUERY PLAN
-------------------------------------------------------------------​---------------------------------------------------------------
 Bitmap Heap Scan on tenk1  (cost=9.45..73.44 rows=40 width=244) (actual time=0.012..0.028 rows=40.00 loops=1)
   Recheck Cond: (thousand = ANY (''::integer[]))
   Heap Blocks: exact=39
   Buffers: shared hit=47
   ->  Bitmap Index Scan on tenk1_thous_tenthous  (cost=0.00..9.44 rows=40 width=0) (actual time=0.009..0.009 rows=40.00 loops=1)
         Index Cond: (thousand = ANY (''::integer[]))
         Index Searches: 4
         Buffers: shared hit=8
 Planning Time: 0.029 ms
 Execution Time: 0.034 ms

在这种情况下,一次索引搜索(针对同一个索引)需要扫描更多的缓冲区,因为它还需要扫描包含 1 到 999 之间未列出的其他 995 个值的页面。

在此之前,我们无法从 EXPLAIN ANALYZE 的输出结果中确定是否使用了该优化。我们只能通过一些线索推测,比如执行时间缩短、缓冲区使用减少,但无法获得明确的索引搜索次数。不过,你可以在几个系统视图中查看相关数据,例如 pg_stat_user_indexes 表中的 idx_scan 列会统计这些单独的索引搜索次数。

在 PostgreSQL 18 中,除了在 EXPLAIN 输出中添加索引搜索次数字段外,还新增了对 btree 树索引 “跳跃扫描”(skip scans)的支持。

文档中同样提供了一个清晰的示例,仅索引扫描的结果显示索引被搜索了 3 次,范围条件中的每个值对应一次搜索:

EXPLAIN ANALYZE
SELECT four, unique1 FROM tenk1 WHERE four BETWEEN 1 AND 3
AND unique1 = 42;
                                                              QUERY PLAN
-------------------------------------------------------------------​---------------------------------------------------------------
 Index Only Scan using tenk1_four_unique1_idx on tenk1  (cost=0.29..6.90 rows=1 width=8) (actual time=0.006..0.007 rows=1.00 loops=1)
   Index Cond: ((four >= 1) AND (four <= 3) AND (unique1 = 42))
   Heap Fetches: 0
   Index Searches: 3
   Buffers: shared hit=7
 Planning Time: 0.029 ms
 Execution Time: 0.012 ms

请注意,尽管 1、2 和 3 是列 “four” 的连续值,但它们对应的 unique1=42 的记录在按 (“four", “unique1”) 这个顺序建立的索引中,(极大概率)不会互相靠近。因此,使用 3 次单独的索引下降(descent)来获取它们,会比一次性扫描整个索引高效得多。多次下降的开销远远低于“扫描大量 unique1 <> 42 的无用元组”所带来的低效。当然,如果下降次数变得非常多,这种优势就会减弱。因此,当第一列中的值相对较少,且 WHERE 条件非常严格时,这种优化效果最为显著。

我特别喜欢这类优化 —— 它们无需我们做任何改动,就能利用现有索引加速已有的查询!

增加索引搜索是好是坏?

一般来说,最高效的扫描是对最优索引进行一次遍历,这样能最大限度地减少缓冲区读取次数。

但是,为每个查询都建立最优索引的做法并不理想,因为每增加一个索引都会带来一定的代价。这些代价包括(但不限于)写入放大、丢失热点更新(针对之前未建立索引的列)以及共享缓冲区空间竞争加剧。

因此,如果您正在优化一个重要的查询,并且愿意为其创建和维护索引,那么 “索引搜索次数> 1” 可能意味着存在更优的解决方案。

一个简单的例子

以下是我认为最简单的演示方法:

CREATE TABLE example (
   integer_field bigint NOT NULL,
   boolean_field bool NOT NULL);

INSERT INTO example (integer_field, boolean_field)
   SELECT random () * 10_000,
          random () < 0.5
   FROM   generate_series(1, 100_000);

CREATE INDEX bool_int_idx
   ON example (boolean_field, integer_field);

VACUUM ANALYZE example;

因此,我们创建了一个包含两列的表,插入了 10 万行数据。其中一列的基数很低(布尔值均匀分布),另一列的基数高得多(0 到 10k 之间的随机整数)。

我们在两列上都添加了索引,布尔列排在前(列的顺序很重要)。最后,我们运行了 VACUUM ANALYZE 命令来更新可见性映射并收集统计信息。

如果我们现在运行一个仅根据索引中的第二列进行筛选的查询,我们预计在 Postgres 18 中使用跳跃扫描会得到一个效率更高的查询计划。

如果先在 Postgres 17 上运行,我们会得到以下查询计划:

EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS)
SELECT boolean_field FROM example WHERE integer_field = 5432;
                                                              QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using bool_int_idx on public.example  (cost=0.29..1422.39 rows=10 width=1) (actual time=0.579..1.931 rows=18 loops=1)
   Output: boolean_field
   Index Cond: (example.integer_field = 5432)
   Heap Fetches: 0
   Buffers: shared hit=168
 Planning Time: 0.197 ms
 Execution Time: 1.976 ms

虽然我们执行的是仅索引扫描,但请注意,它读取了 168 个缓冲区,却只返回了 18 行。它实际上是在扫描我们的整个索引(168 * 8KB = 1344KB)。

SELECT pg_size_pretty(pg_indexes_size('example'));

 pg_size_pretty
----------------
 1344 kB

如果我们在 Postgres 18 上运行同样的操作,会得到以下查询计划:

EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS)
SELECT boolean_field FROM example WHERE integer_field = 5432;
                                                              QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using bool_int_idx on public.example  (cost=0.29..13.04 rows=10 width=1) (actual time=0.230..0.274 rows=5.00 loops=1)
   Output: boolean_field
   Index Cond: (example.integer_field = 5432)
   Heap Fetches: 0
   Index Searches: 4
   Buffers: shared hit=9
 Planning Time: 0.240 ms
 Execution Time: 0.323 ms

有三点需要注意:

  • 缓冲区使用量大幅减少,从 168 个降至 9 个
  • 执行时间更短(得益于更少的缓冲区读取)
  • 索引搜索次数:4

这是一项很棒的优化,能更高效地利用索引!

等等,为什么会有四次索引搜索?可能你和我一样,原本以为只有两次,TRUE 和 FALSE 各一次。我一开始也百思不得其解,最后在性能邮件列表里提问。感谢 Peter Geoghegan 的解答。原来,在一般情况下,边界条件和 NULL 值(当然!)总是需要考虑的,所以当无法排除这些情况时,就会产生一到两次额外的索引搜索。

由于我知道这些优化非常灵活,我想知道是否可以通过显式筛选“仅”包含 TRUE 或 FALSE 的值来进行两次索引搜索:

EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS)
SELECT boolean_field FROM example WHERE integer_field = 5432
AND boolean_field IN (true, false);
                                                              QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using bool_int_idx on public.example  (cost=0.29..8.79 rows=10 width=1) (actual time=0.060..0.077 rows=12.00 loops=1)
   Output: boolean_field
   Index Cond: ((example.boolean_field = ANY (''::boolean[])) AND (example.integer_field = 5432))
   Heap Fetches: 0
   Index Searches: 2
   Buffers: shared hit=5
 Planning Time: 0.265 ms
 Execution Time: 0.115 ms

搞定!现在我们只进行了两次索引搜索,这正是我们所期望的。这使得缓冲区读取次数更少(仅 5 次),执行速度也更快。这得益于 Postgres 17 的优化工作。但是修改查询并非总是可行,如果我们认为原始查询对我们的工作负载至关重要,我们很乐意为其添加一个最优索引。这样能做得更好吗?

CREATE INDEX int_bool_idx ON example (integer_field, boolean_field);

EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS)
SELECT boolean_field FROM example WHERE integer_field = 5432;
                                                              QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using int_bool_idx on public.example  (cost=0.29..4.47 rows=10 width=1) (actual time=0.042..0.047 rows=12.00 loops=1)
   Output: boolean_field
   Index Cond: (example.integer_field = 5432)
   Heap Fetches: 0
   Index Searches: 1
   Buffers: shared hit=3
 Planning Time: 0.179 ms
 Execution Time: 0.078 ms

由于我们新索引的列顺序颠倒了,相关的元组现在位于同一位置,这意味着扫描可以高效地执行一次索引下降(索引搜索:1),从而产生最少的缓冲区读取(3),并因此实现最快的执行速度。

以下是我尝试用可视化方式展现列的顺序如何影响条目的共存位置:
在这里插入图片描述

最后,这里是通过 pgMustard 保存和可视化的最后四个查询计划。

我们是否已开始使用索引搜索来获取提示信息?

到目前为止,我们还没有直接将索引搜索次数用于 pgMustard 的优化建议中。但在某些有帮助的场景下,会在 “操作详情” 中显示该字段。

当索引扫描效率特别低时,如果缓冲区读取次数远多于返回的行数,您仍然会看到“读取效率”提示;如果 Postgres 报告说很大比例的行正在被过滤,您仍然会看到“索引效率”提示。

一旦我们了解到实际应用中这类问题的常见程度,以及优化潜力的大小,可能会添加更具体的相关建议!

一些实用建议

首先,如果你在优化重要查询时发现 “索引搜索次数> 1”,可能存在更适合该查询的索引定义。

我的主要建议是,仍然要关注所有常规事项,例如筛选行、缓冲区和计时。

如果您认为某些不太重要(或优化程度较低)的查询可能会受益于这些改进,请考虑升级到(或至少测试)Postgres 18。

如果你愿意,现在或许可以减少索引的数量。可以先扩大搜索范围,查找冗余/重叠的索引,包括那些列相同但顺序不同的索引。这样或许可以删除一两个索引,而对读取延迟的影响在可接受的范围内。

作者:Michael Christofides

原文链接:

https://www.pgmustard.com/blog/what-do-index-searches-in-explain-mean

使用Verilog实现QR分解——嵌入式 [设计与代码] 通过Verilog的硬件描述语言,我们可以将QR分解算法实现为硬件电路,并在嵌入式系统中高效地运行。本文将介绍如何使用Verilog设计并实现QR分解算法,该算法用于将一个矩阵分解为正交矩阵Q和上三角矩阵R。具体而言,QR分解通过对矩阵的列进行正交化处理,得到正交矩阵Q,并将对应的正交化结果存储在上三角矩阵R中。该算法通过将矩阵分解为两个部分,正交矩阵Q和上三角矩阵R,实现了对矩阵的分解和变换。模块,该模块接收待分解矩阵A,并输出正交矩阵Q和上三角矩阵R。下面给出了使用Verilog实现QR分解的源代码。 阅读详情

相关推荐

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 236

PostgreSQL 18发布,带来了令人兴奋的改进!

PostgreSQL 18 的发布确实带来了不少令人兴奋的改进,主要集中在​​性能、开发灵活性和数据管理​​等方面

IT邦德 1652

MacOS上VScode配置PlatformIO Core的疑难杂症与提速实战

本文详细解析了在MacOS上使用VScode配置PlatformIO Core时遇到的安装卡死、新建项目缓慢等常见问题,并提供了官方脚本安装、网络优化、命令行预下载等实用解决方案。通过环境变量配置和镜像源加速,大幅提升开发效率,特别适合ESP32等嵌入式开发场景。

weixin_42567046的博客 220

PostgreSQL 18 新特性深度解读与结构化说明

自动”是主旋律:从自连接消除到索引优化、VACUUM 行为,减少人工干预。“细致”是升级点:监控、统计、日志、约束、权限等均做了细粒度强化。“性能”是核心诉求:异步 I/O、NUMA 感知、SIMD 优化,硬件资源利用最大化。“安全与可扩展”并重:OAuth、TLS1.3、物化视图、流/逻辑复制全方位升级。“开发友好”更进一步:生成列、虚拟列、丰富的数据类型/函数、工具链改进,极大提升开发效率。PostgreSQL 18 不仅是功能升级,更是体系化进化。

IT技术学习与工作笔记分享 1816

简单初识 Material Point Method(MPM)

简单初识 Material Point Method(MPM):先介绍了Lagrangian和Eulerian,并简单介绍了MPM Method

qq_45776432的博客 7366

python 成语接龙-连接数据库

from xpinyin import Pinyin import pymysql while 1: conn = pymysql.connect( host='localhost', #本地连接 user='root', #数据库账户名 password='password', #数据库密码 db='dic',

Hero2902的博客 598

华象新闻 | PostgreSQL 18 Beta 1、17.5、16.9、15.13、14.18、13.21 发布

2025 年 5 月 8 日,PostgreSQL 全球开发小组宣布,的第一个预览版本开放下载。同时,针对目前所有支持中的 PostgreSQL 版本进行更新,包括。PostgreSQL 13 将于 2025 年 11 月 13 日发布最后一个版本,建议将生产环境中运行的 PostgreSQL 13 进行大版本升级。

少安事务所 2517

仿真每日一练 | 有限元模态分析详解

结构的振动一直是工业领域产品分析的重点,在振动的仿真分析中,模态分析是其最基本的分析类型,通过研究结构的固有频率和振型对产品的设计提供指导。2.2、在interaction模块,通过special->Spring,在各点之间分别创建弹簧单元,弹簧刚度为1000。2.1、在interaction模块,创建两个RP点,与两侧RP点各间隔100大小,如图3所示;其中M、K、C均为n*n的矩阵,s、x、v为n*1的矢量,n为系统自由度数量。3、在Assembly模块创建装配体,两点之间的距离为100,如图2所示;

ansysxuexizhe的博客 1655

PostgreSQL 18 全面解析:200+新特性开启数据库新纪元

🚀 一、大规模数据处理:性能与效率的双重突破 🔹 虚拟列:智能计算,存储零负担 概念图示: 技术优势:应用场景:优化对比: 使用场景: 核心价值:迁移流程示意图: 关键特性:认证演进: OAUTHBearer/SASL优势:功能对比: 应用价值:UUID版本对比: 技术优势: 架构价值: ⚠️ 六、重要变更:升级必读指南 🔴 安全警告:MD5密码正式弃用 迁移建议:初始化变更: 编译选项清理: 📈 七、升级策略与建议 升级前检查清单 兼容性验证性能评估回滚准备 🎯 总结:Postgre

IT技术学习与工作笔记分享 1213

Silvaco TCAD仿真例库——肖特基二极管反向击穿特性(案例)

本文详细介绍了使用Silvaco TCAD仿真例库分析肖特基二极管反向击穿特性的完整流程。通过搭建带保护环的器件结构,配置关键物理模型,并执行反向偏压扫描,深入探讨了雪崩击穿机制、电场分布及设计参数(如漂移区浓度、保护环)对击穿电压的影响,为功率半导体设计与可靠性分析提供了实用的虚拟实验方法。

weixin_29165465的博客 388

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

PG 18beta1 真正的AIO来了 | 发展历程&实践测试

AIO发展历程及其在18的实践测试表现

多米爸比的专栏 1108

# YOLOv11-seg改进系列 | 引入CVPR MetaFormer的C3k2_PoolingFormerCGLU模块,池化Token混合+CGLU门控MLP

本文引入 CVPR 2022 论文(MetaFormer/PoolFormer)提出的 MetaFormer 元架构设计,以Pooling Token 混合器 + ConvolutionalGLU(CGLU)MLP构成,将其封装为,用于替换 YOLOv11-seg 的 C3k2 块。对比维度C3k2(基线)C3k2_PoolingFormerCGLU(本文)参数量(n scale)2.46M≈2.49M9.6≈9.69.7(+1.0%)架构范式单阶段卷积MetaFormer 双阶段。

qq_44224801的博客 844

PG18安装pgAdmin的web版本

升级python版本预先安装epel源安装pip3如果因为网络或其他原因无法使用 EPEL 源,可以使用 pip 官方提供的安装脚本,这种方式通用性很强运行脚本安装pip验证验证PG18的环境变量设置好没有创建专用用户和虚拟环境。

weixin_55963561的博客 94

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

无需安装!PostgreSQL 18 Windows 便携部署方案

在 Windows 环境中使用 PostgreSQL 的常见做法是并进行配置。该方式操作简便,可自动完成依赖组件和系统服务的部署。然而,对于无需 PostgreSQL 持续运行、需要在多个版本之间灵活切换,或希望具备可复制至任意计算机并直接运行的便携式环境的场景,本文将介绍一种更灵活的实现方案。该方案仅适用于个人开发环境。在未进行安全加固的情况下,不应将其用于共享或生产部署等场景。

IvorySQL的博客 1231

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

oracle linux 10 +pg18 源码安装要点

oracle linux 10 + pg18

cqsztech的博客 832

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

升PG18后,我少用了一套向量库

很多 AI 应用需要的不是更炫的向量系统,而是能和业务数据长在一起的检索能力。我的争议性判断是:未来三年,80% 的企业内部 RAG 不需要先上专用向量库,先把 PostgreSQL 18 + pgvector 用对,收益更大。你们项目里的向量检索,是已经拆成独立向量库了,还是还压在 PostgreSQL 里?真正踩坑的是性能、召回,还是运维复杂度?

qq_34115308的博客 161

PostgreSQL 18 深度实战:异步I/O引擎+UUIDv7+虚拟生成列

当大多数团队还在为MySQL的"能跑就行"和MongoDB的"文档随意"纠结时,PostgreSQL已经悄悄把数据库内核的底层I/O模型重写了一遍。PostgreSQL 18不是又一个"加几个语法糖"的小版本,它是自9.6并行查询以来,对单机数据库内核改动最激进的一次——全新的异步I/O子系统、原生UUIDv7、虚拟生成列,每一项都直指生产环境里那些让人半夜爬起来救火的真实痛点。

yonggeit的博客 261

PG18之插件使用大全(简单用例)

一,pg_buffercache。1.2 数据库加载模块。1.4 相关sql查询。1.1 编译安装模块。

weixin_55963561的博客 134

PostgreSQL 18 异步 I/O 子系统技术解读与源码剖析

PostgreSQL 18 的异步 I/O 子系统,是数据库引擎与现代硬件深度融合的里程碑。它以事件驱动、批量处理、多队列并发等高级编程范式为核心,实现了传统数据库难以企及的 I/O 吞吐。开发与运维人员应充分理解其主流程、源码实现、调优参数及监控手段,结合自身业务场景灵活应用,最大化数据库系统的性能与可靠性。口诀速记:构队列、投操作、主线程忙、等回调、查事件、回调用、错降级。理解其然,更知其所以然,方能在现代数据密集型业务中游刃有余。

IT技术学习与工作笔记分享 1375

【PGCCC】Postgres 18 Beta 版发布:您应该了解的 7 个功能

Postgres 18 Beta 1刚刚发布。与之前的主要版本一样,此 Beta 版本包含所有计划正式发布的功能的预览版。您可以阅读发行说明来了解完整的更新列表,但我们将在本文中重点介绍一些更新亮点。

PGCCC的博客 966

Ubuntu 修复 FinalShell 任务栏齿轮图标

FinalShell 可以正常启动,但任务栏显示默认齿轮图标。本次环境为 Ubuntu、X11,图标文件存在且有效。最终通过在用户级.desktop文件中加入,重新启动并固定应用,成功解决。st是本次实际测得的窗口标识。其他版本或安装方式应先测量,不要直接套用。

To be a better man 203

fast-lio2复现跑avia数据集

本文详细介绍了在Windows WSL2中安装Ubuntu 22.04并配置ROS2 Humble环境的全过程,涵盖系统初始化、ROS2安装、Livox雷达驱动编译及FAST-LIO2 ROS2版本的构建与验证。通过完整数据集回放与建图测试,成功实现点云地图生成与轨迹记录,并利用evo工具完成轨迹分析与可视化。最终输出包括累积点云地图、位姿轨迹及实验配置文件,为后续精度评估与复现提供基准。

chase_my_dream的博客 334

【T113】SDK Tina5.0 V1.2 使用记录(一)基本使用,初次编译等

SDK名称发行方其他描述全志官方tina2.0,仅支持 openwrt全志官方tina5.0 v1.2,支持 openwrt, buildroot百问网非官方,支持buildroot,用于开发板100ask_t113-pro。

似水流年 115

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 118

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 196
上一篇: 活动预告|IvorySQL 诚邀您参加2025开放原子开发者大会
下一篇: 2025 开放原子开发者大会回顾|IvorySQL 内核实现原理
IvorySQL
博客等级 码龄5年 745粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值