原来count(*)就是我们系统的接口性能变差100倍的真凶…

别再瞎猜SQL为啥慢了!手把手教你用StarRocks的Profile揪出性能真凶 本文详细介绍了如何利用StarRocks的Profile功能精准定位SQL性能瓶颈。通过配置Profile采集环境、解读关键指标如时间分布、内存使用和数据流异常,并结合实际案例演示优化技巧,帮助运维人员快速诊断和解决慢查询问题,提升数据库性能。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:苏三说技术

cd20df043ba617bd3b0f05fa4d1154c3.jpeg


前言

最近我在公司优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。

我们使用的数据库是Mysql8,使用的存储引擎是Innodb。这次优化除了优化索引之外,更多的是在优化count(*)。

通常情况下,分页接口一般会查询两次数据库,第一次是获取具体数据,第二次是获取总的记录行数,然后把结果整合之后,再返回。

查询具体数据的sql,比如是这样的:`

select id,name from user limit 1,20;

它没有性能问题。

但另外一条使用count(*)查询总记录行数的sql,例如:

select count(*) from user;

却存在性能差的问题。

为什么会出现这种情况呢?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

1 count(*)为什么性能差?

在Mysql中,count(*)的作用是统计表中记录的总行数。

而count(*)的性能跟存储引擎有直接关系,并非所有的存储引擎,count(*)的性能都很差。

在Mysql中使用最多的存储引擎是:innodb和myisam。

在myisam中会把总行数保存到磁盘上,使用count(*)时,只需要返回那个数据即可,无需额外的计算,所以执行效率很高。

而innodb则不同,由于它支持事务,有MVCC(即多版本并发控制)的存在,在同一个时间点的不同事务中,同一条查询sql,返回的记录行数可能是不确定的。

在innodb使用count(*)时,需要从存储引擎中一行行的读出数据,然后累加起来,所以执行效率很低。

如果表中数据量小还好,一旦表中数据量很大,innodb存储引擎使用count(*)统计数据时,性能就会很差。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

2 如何优化count(*)性能?

从上面得知,既然count(*)存在性能问题,那么我们该如何优化呢?

我们可以从以下几个方面着手。

2.1 增加redis缓存

对于简单的count(*),比如:统计浏览总次数或者浏览总人数,我们可以直接将接口使用redis缓存起来,没必要实时统计。

当用户打开指定页面时,在缓存中每次都设置成count = count+1即可。

用户第一次访问页面时,redis中的count值设置成1。用户以后每访问一次页面,都让count加1,最后重新设置到redis中。f8638d94a4dfd000d03adb3c27f7f901.png这样在需要展示数量的地方,从redis中查出count值返回即可。

该场景无需从数据埋点表中使用count(*)实时统计数据,性能将会得到极大的提升。

不过在高并发的情况下,可能会存在缓存和数据库的数据不一致的问题。

但对于统计浏览总次数或者浏览总人数这种业务场景,对数据的准确性要求并不高,容忍数据不一致的情况存在。

2.2 加二级缓存

对于有些业务场景,新增数据很少,大部分是统计数量操作,而且查询条件很多。这时候使用传统的count(*)实时统计数据,性能肯定不会好。

假如在页面中可以通过id、name、状态、时间、来源等,一个或多个条件,统计品牌数量。

这种情况下用户的组合条件比较多,增加联合索引也没用,用户可以选择其中一个或者多个查询条件,有时候联合索引也会失效,只能尽量满足用户使用频率最高的条件增加索引。

也就是有些组合条件可以走索引,有些组合条件没法走索引,这些没法走索引的场景,该如何优化呢?

答:使用二级缓存。

二级缓存其实就是内存缓存。

我们可以使用caffine或者guava实现二级缓存的功能。

目前SpringBoot已经集成了caffine,使用起来非常方便。

只需在需要增加二级缓存的查询方法中,使用@Cacheable注解即可。

@Cacheable(value = "brand", , keyGenerator = "cacheKeyGenerator")
   public BrandModel getBrand(Condition condition) {
       return getBrandByCondition(condition);
   }

然后自定义cacheKeyGenerator,用于指定缓存的key。

public class CacheKeyGenerator implements KeyGenerator {
    @Override
    public Object generate(Object target, Method method, Object... params) {
        return target.getClass().getSimpleName() + UNDERLINE
                + method.getName() + ","
                + StringUtils.arrayToDelimitedString(params, ",");
    }
}

这个key是由各个条件组合而成。

这样通过某个条件组合查询出品牌的数据之后,会把结果缓存到内存中,设置过期时间为5分钟。

后面用户在5分钟内,使用相同的条件,重新查询数据时,可以直接从二级缓存中查出数据,直接返回了。

这样能够极大的提示count(*)的查询效率。

但是如果使用二级缓存,可能存在不同的服务器上,数据不一样的情况。我们需要根据实际业务场景来选择,没法适用于所有业务场景。

2.3 多线程执行

不知道你有没有做过这样的需求:统计有效订单有多少,无效订单有多少。

这种情况一般需要写两条sql,统计有效订单的sql如下:

select count(*) from order where status=1;

统计无效订单的sql如下:

select count(*) from order where status=0;

但如果在一个接口中,同步执行这两条sql效率会非常低。

这时候,可以改成成一条sql:

select count(*),status from order
group by status;

使用group by关键字分组统计相同status的数量,只会产生两条记录,一条记录是有效订单数量,另外一条记录是无效订单数量。

但有个问题:status字段只有1和0两个值,重复度很高,区分度非常低,不能走索引,会全表扫描,效率也不高。

还有其他的解决方案不?

答:使用多线程处理。

我们可以使用CompleteFuture使用两个线程异步调用统计有效订单的sql和统计无效订单的sql,最后汇总数据,这样能够提升查询接口的性能。

2.4 减少join的表

大部分的情况下,使用count(*)是为了实时统计总数量的。

但如果表本身的数据量不多,但join的表太多,也可能会影响count(*)的效率。

比如在查询商品信息时,需要根据商品名称、单位、品牌、分类等信息查询数据。

这时候写一条sql可以查出想要的数据,比如下面这样的:

select count(*)
from product p
inner join unit u on p.unit_id = u.id
inner join brand b on p.brand_id = b.id
inner join category c on p.category_id = c.id
where p.name='测试商品' and u.id=123 and b.id=124 and c.id=125;

使用product表去join了unit、brand和category这三张表。

其实这些查询条件,在product表中都能查询出数据,没必要join额外的表。

我们可以把sql改成这样:

select count(*)
from product
where name='测试商品' and unit_id=123 and brand_id=124 and category_id=125;

在count(*)时只查product单表即可,去掉多余的表join,让查询效率可以提升不少。

2.5 改成ClickHouse

有些时候,join的表实在太多,没法去掉多余的join,该怎么办呢?

比如上面的例子中,查询商品信息时,需要根据商品名称、单位名称、品牌名称、分类名称等信息查询数据。

这时候根据product单表是没法查询出数据的,必须要去join:unit、brand和category这三张表,这时候该如何优化呢?

答:可以将数据保存到ClickHouse。

ClickHouse是基于列存储的数据库,不支持事务,查询性能非常高,号称查询十几亿的数据,能够秒级返回。

为了避免对业务代码的嵌入性,可以使用Canal监听Mysql的binlog日志。当product表有数据新增时,需要同时查询出单位、品牌和分类的数据,生成一个新的结果集,保存到ClickHouse当中。

查询数据时,从ClickHouse当中查询,这样使用count(*)的查询效率能够提升N倍。

需要特别提醒一下:使用ClickHouse时,新增数据不要太频繁,尽量批量插入数据。

其实如果查询条件非常多,使用ClickHouse也不是特别合适,这时候可以改成ElasticSearch,不过它跟Mysql一样,存在深分页问题。

3 count的各种用法性能对比

既然说到count(*),就不能不说一下count家族的其他成员,比如:count(1)、count(id)、count(普通索引列)、count(未加索引列)。

那么它们有什么区别呢?

  • count(*) :它会获取所有行的数据,不做任何处理,行数加1。

  • count(1):它会获取所有行的数据,每行固定值1,也是行数加1。

  • count(id):id代表主键,它需要从所有行的数据中解析出id字段,其中id肯定都不为NULL,行数加1。

  • count(普通索引列):它需要从所有行的数据中解析出普通索引列,然后判断是否为NULL,如果不是NULL,则行数+1。

  • count(未加索引列):它会全表扫描获取所有数据,解析中未加索引列,然后判断是否为NULL,如果不是NULL,则行数+1。

由此,最后count的性能从高到低是:

count(*) ≈ count(1) > count(id) > count(普通索引列) > count(未加索引列)

所以,其实count(*)是最快的。

意不意外,惊不惊喜?

千万别跟select * 搞混了。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

d091fd06542edc3086cb4023add05d9e.png

已在知识星球更新源码解析如下:

6563bd103e6d44354b6eb90b4dced980.jpeg

5717578f25d716c00c21744c145f27d7.jpeg

147c30891f3a7bb52c41d9af950f2131.jpeg

54b6a68d2d4089a8f9d3e3347ec76b90.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
SQL Server分页性能优化:告别ROW_NUMBER()全排序陷阱 分页是数据库最常见也最易被低估的性能瓶颈。其本质是数据集上的有序游标访问,核心原理在于避免全量排序与无效数据丢弃。传统ROW_NUMBER()分页因强制全集编号和确定性排序,在SQL Server中极易引发TempDB暴涨、内存压力、结果漂移等连锁风险;而OFFSET/FETCH或键集分页通过游标驱动、索引流式扫描,显著降低I/O与CPU开销。技术价值体现在高并发下响应恒定、锁持有时间缩短、统计信息鲁棒性增强。典型应用于BI报表、订单中心、日志查询等需深度翻页的OLTP/HTAP场景。本文聚焦SQL Ser 阅读详情

相关推荐

英伟达14万H100小时大模型训练工程全解析

大模型分布式训练是AI工程落地的核心瓶颈,其本质是计算、通信与内存的协同优化问题。基于混合精度、梯度同步机制与数据管道设计,现代千卡训练需在FP8/BF16精度权衡、ring-allreduce通信调度、动态稀疏门控等关键技术上实现精细控制。英伟达此次开源不仅提供模型权重,更系统披露了14万H100小时级训练中验证的工业级实践:包括NTK-aware RoPE位置编码、自适应稀疏门控(Adaptive Sparse Gating)和增量式checkpoint压缩等关键方案。这些技术显著提升长序列推理效率、降

anheku1562的博客 445

接口耗时打印并统计

1.可以利用Tomcat的access-log日志,让其打印出http请求的每次耗时。可以在 config/server.xml里Host标签下配置tomcat访问日志格式 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"               prefix="localhos...

weixin_34161032的博客 2513

N-Queen问题的Python遗传算法实战:从崩溃调试到100皇后求解

遗传算法(GA)是一种基于自然选择机制的全局优化方法,其核心在于编码设计、适应度函数构建与进化算子协同。在实际工程中,GA并非黑箱流程,而是高度依赖问题建模——例如N-Queen问题采用一维数组编码可天然规避行冲突,并将适应度计算压缩至O(n²);而1/(q+0.001)型适应度函数则通过非线性放大确保选择压力,避免轮盘赌失效。这类实操细节直接决定算法能否收敛。本文聚焦Python环境下的GA落地,覆盖种群初始化策略、冲突驱动变异、Top-2选择机制及学习曲线诊断等关键技术点,适用于调度优化、组合规划等真实

aodanchui1057的博客 451

SpringCloud Alibaba-Sentinel 实现熔断与限流

在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了问题,调用这个服务救护出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪。由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的”雪崩效应“。雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽。..................

dingd1234的博客 1209

springboot记录api的访问次数

springboot入门工程,可是开始计数,终止计数,清空计数.只保存最近一分钟以内的访问次数

[捷稀 JCG Q30 Pro 刷机说明] 以刷入openwrt24.10为例

摘要: 本文详细介绍了捷稀JCG Q30 Pro路由器刷入OpenWrt 24.10系统的步骤。通过先刷入OpenWrt 23.05过渡固件,再升级Uboot,最后通过TFTP加载工厂镜像完成刷机。关键步骤包括解锁分区、刷写Uboot、进入恢复模式及配置网络。文章还提供了无线设置、Tailscale内网穿透等进阶命令,并附参考文档和固件下载链接。适用于有一定技术基础的玩家,需注意操作风险,严格按流程执行。

贤时间 7148

java 监控redis api_使用redis实时统计API调用次数,通用,不管你是php,java,python还是其他语言都可以...

关于统计API调用次数,一直都没有比较通用的方案,那么今天我来给一个解决方案,从应用层解决,不需要开发人员去做(即使去做也不一定比这个好,别觉得哥狂妄).好了也不屁话这么多,开正题了.0x1cd redis-4.0**version**/deps/hiredismakemake installgit clone https://github.com/limithit/ngx_dynamic_lim...

weixin_36131079的博客 847

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文提供了一份可直接用于生产环境的PHP SM4国密加密算法集成实战指南。文章详细解析了SM4算法核心,对比了ECB与CBC工作模式,并给出了包含完整代码、密钥管理、数据填充及性能优化的解决方案,帮助开发者快速、安全地在PHP项目中集成国密加密算法。

2a4s6d8f0g的博客 342

如何记录应用的接口访问信息(调用次数,最长时间、最短时间、平均时间等等)

已经重写了,代码在这:https://github.com/xjs1919/ezprofiler,主要使用以下方式实现: (1)通过实现BeanPostProcessor,做Controller扫描 (2)通过EnableProfiler这个注解,加载内部的Controller (3)通过自定义HandlerMapping,添加对内部Controller的访问 使用起来很简单,只需要3步:......

若鱼的专栏 2万+

四款办公Agent实测对比:WorkBuddy、千问办公、库库AI、豆包工作怎么选

AI Agent是一种能感知环境、自主决策并执行动作的智能系统,其核心在于工具调用、状态管理与错误恢复构成的执行闭环。在办公场景中,任务边界清晰、容错率高、重复性强,使Agent成为最容易落地的方向。通过调用本地文件、脚本或办公套件,Agent能自动完成文件批量处理、文档摘要、会议纪要等重复劳动,显著提升工作效率。目前WorkBuddy、千问办公、库库AI、豆包工作等产品分别从本地操作、办公套件嵌入、知识处理、轻量助手等路线切入,用户可根据自身场景选择。

weixin_29052717的博客 525

通过电源模块降低电源噪声的3种方法

电源噪声是一种常见且不受欢迎的电气现象。如果不降低噪声,其会对敏感的医疗、测试测量、航空航天和国防系统的应用性能产生不利影响。当今的高精度模拟信号链系统需要直流/直流开关稳压器产生稳压电源轨,为低噪声应用中的模数转换器(ADC)、数模转换器(DAC)、现场可编程门阵列(FPGA)及其子系统供电。尽管直流/直流开关稳压器具有高工作效率,它们的开关操作会导致较大的不连续电流,从而产生较高的输入和输出电压纹波、频率尖峰和宽带噪声。

qq_43416206的博客 1427

Spring Aop 高级应用之记录接口调用的次数

本文的主要目的: 记录每个URL是何时被调用的 应用场景:可以进行持久化存储,用于后期分期,每个接口的使用情况,对项目进行深度分析 实现步骤 前提:本文使用SpringBoot2.0.3 文末有源码地址,还有惊喜奉送! 一.定义日志记录对象 package com.javayh.nacos.common.aop.flow; import lombok.Builder; import lomb...

杨海吉 4480

ABAP Channels 实战:在 ABAP 7.40 中用 WebSocket 打造实时双向通信

本文详细介绍了SAP ABAP 7.40引入的ABAP Channels通信框架,包含AMC(ABAP Messaging Channels)和APC(ABAP Push Channels)两部分。AMC作为应用服务器内部的消息总线,支持发布/订阅模式,可实现跨会话实时通信;APC基于WebSocket协议,用于浏览器等客户端与ABAP服务器的双向实时交互。文章通过一个乒乓球游戏案例展示了ABAP Channels的实时协作能力,并详细解析了AMC的配置方法、消息发送与接收的代码实现,帮助开发者理解如何利用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

MySQL性能调优实战:如何用processlist揪出慢查询背后的‘真凶‘

本文深入实战,详解如何利用MySQL的SHOW PROCESSLIST和information_schema.processlist进行性能调优。通过分析连接状态与执行时间,快速定位慢查询、锁等待及连接泄露等性能瓶颈,并提供从应急排查到趋势分析的系统性方法,帮助DBA高效恢复服务并预防问题。

k8s6orchestrator的博客 784

多模型机器学习生存预测分析:AUC比较、生存分层与SHAP解释

本文研究了多种机器学习模型在心力衰竭患者生存预测中的应用。通过比较逻辑回归、随机森林、XGBoost、LightGBM和梯度提升机五种模型的AUC表现,选择最优预测模型。基于最优模型的预测概率对患者进行风险分层,并使用Kaplan-Meier生存分析和log-rank检验验证分层的有效性。最后采用SHAP方法解释模型决策过程,识别关键预测因素。研究提供了从模型构建、评估到解释的完整技术流程,为临床预后预测提供了可复现的分析框架。

AI的内部世界的博客 157

谷歌A2A协议入门指南:附简易Python代码示例

继"关税"之后,当下最热门的词汇当属AI智能体——这种基于人工智能的软件能够执行复杂任务、实现工作流自动化并提升生产效率。但迄今为止,大多数智能体都处于各自为政的状态,难以顺畅协作。就像团队执行重大项目时,成员之间却无法交流!对于技术人员而言,一个可能遇到的典型场景是:假设你需要协调四个不同的AI服务——处理用户查询的Gemini智能体、在向量数据库进行搜索的AI应用、基于Claude的摘要生成器,以及运行专业领域逻辑的Python智能体。

独立开发,substack顶级编辑 800

Nginx无报错接口偶发超时:分层排查与性能优化实战

在分布式系统架构中,网络通信与系统性能是保障服务稳定性的核心要素。其原理涉及从网络协议栈到应用服务的全链路协同,技术价值在于通过系统性观测与调优,提升服务可用性与响应效率。应用场景广泛覆盖高并发Web服务、微服务网关及API代理等场景。本文聚焦Nginx反向代理环境下,上游接口偶发超时的典型故障,通过分析TCP重传机制与连接跟踪表(nf_conntrack)的工作原理,结合网络抓包与系统资源监控手段,构建从网络层到应用层的立体化排查体系,为处理无明确错误日志的隐蔽性能问题提供工程实践方案。

weixin_34116110的博客 343

【DRAM存储器一】基本存储单元、阵列结构、读写原理

详述DRAM存储器存储单元、存储阵列结构和读写原理

highman110的博客 7258

20260603.记一次 Doris FE “幽灵卡死”引发的惨案:从表象到真凶的追凶实录

复盘这次惊魂事件,最大的教训不是参数配错了,而是我们对现代数据库 CBO(Cost-Based Optimizer)优化器及其配套机制的理解过于粗浅。在传统的认知里,数据库只要建好索引、配好内存就能跑。但现代的 OLAP 引擎(如 Doris),由于要在几百亿数据中快速选择是用 Hash Join 还是 Broadcast Join,极度依赖于底层的统计信息(NDV、Min/Max、Null Count)。

weixin_50205217的博客 330

WINCC7.3破解文件

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

别再只会jmap了!手把手教你用MAT揪出Java内存泄漏的‘真凶’(附实战OOM分析)

本文深入探讨了如何使用MAT(Memory Analyzer Tool)高效诊断Java内存泄漏问题,提供了从堆转储获取到高级分析的完整实战指南。通过Leak Suspects报告、支配树分析和OQL查询等核心功能,帮助开发者精准定位内存泄漏源头,并给出优化建议和避坑指南,提升Java应用的内存管理效率。

weixin_30673611的博客 429

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SQL性能突降与CPU飙升:系统性排查六步法与实战解决方案

最近在技术社区看到一个高频面试题:“线上有一条SQL,昨天跑50毫秒,今天突然跑了5秒,数据库CPU直接飙到90%,你怎么排查?” 这几乎是每个后端和DBA工程师的噩梦场景。性能的断崖式下跌,往往意味着线上服务即将告急,排查过程不仅考验技术功底,更考验系统化思维和应急处理能力。本文将从一个资深开发者的视角,完整拆解这类问题的系统性排查思路、实战工具链和根治方案,无论你是正在准备面试,还是实际工作中遇到了类似问题,都能从中找到清晰的行动路径。 1. 问题背景与核心挑战 一条SQL语句的执行时间从毫秒级骤增到秒

weixin_33802505的博客 451

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

N皇后问题的遗传算法实战:从100×100求解到工业级优化

遗传算法(GA)是一种基于自然选择机制的全局优化方法,核心在于编码、适应度评估、选择、变异等环节的协同设计。其原理并非简单模拟进化,而是通过种群迭代在高维离散解空间中高效探索可行域,尤其适用于组合优化、约束满足等梯度失效场景。技术价值体现在无需导数、鲁棒性强、易于并行,且可通过领域知识定制算子提升收敛性与合法性保障。典型应用场景包括排班调度、物流路径规划、VLSI布局及本文聚焦的N皇后问题——当N=100时,解空间达100!量级,传统搜索完全失效。本文基于真实工程复盘,深度解析列交换变异、一维编码优化、动态

cqwf95925的博客 373

老旧电脑硬件升级全指南:从性能评估到DIY安装的实用方案

《老旧电脑升级指南:低成本焕发新活力》 摘要:针对电脑卡顿问题,本文提供了一套系统化的升级方案,帮助用户以远低于换新机的成本提升性能。通过任务管理器、CPU-Z等工具精准诊断瓶颈(CPU/内存/存储/显卡),并根据办公、游戏、创作三大场景推荐针对性升级策略。重点介绍了内存扩容、机械硬盘换SSD、CPU/显卡升级的具体操作步骤和兼容性要点,提供2024年高性价比硬件推荐清单。文章还包含预算500-4000元的不同场景升级方案,以及AI辅助决策方法。最后强调升级的环保价值,合理升级可延长电脑寿命3-5年,减少电

zzywxc787的博客 2263
上一篇: Java 8 Stream 之 collect() 的奇技淫巧
下一篇: 熟读,理解,背诵,融会贯通!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值