一直傻傻分不清 count(*) count(id) count(1) 这次终于整明白了

MySQL八股文核心考点:索引、事务与锁的底层原理与面试串讲 在数据库后端开发中,索引、事务与锁是保障数据一致性与查询性能的核心概念。B+树索引结构通过减少磁盘IO优化查询,MVCC多版本并发控制实现读写不互斥,redo/undo log保障事务持久性与原子性。理解这些原理,不仅能解决慢SQL、死锁等工程问题,也是应对MySQL面试的基本功。本文从面试官视角梳理MySQL高频考点,串讲索引、事务隔离级别、锁机制及查询优化方法,帮助开发者建立体系化认知。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

4ca4a697185e79357a18d27b1b8de073.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、ERP、CRM、AI 大模型等等功能:

  • Boot 多模块架构:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 微服务架构:https://gitee.com/zhijiantianya/yudao-cloud

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

【国内首批】支持 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 双版本 

来源:江南一点雨


声明:以下讨论基于 InnoDB 存储引擎,MyISAM 因为情况特殊我在文末会单独说一下。

先说结论:这几个性能差别不大。

1.实践

我准备了一张有 100W 条数据的表,表结构如下:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

可以看到,有一个主键索引。

我们来用两种方式统计一下表中的记录数,如下:

可以看到,两条 SQL 的执行效率其实差不多,都是 0.14s。

再来看另外两个统计:

id 是主键,username 以及 address 则是普通字段。

可以看出,用 id 来统计,也有一丢丢优势。这里因为测试数据样板比较小,所以效果不明显,小伙伴们可以加大测试数据量,那么这种差异会更加明显。

那么到底是什么原因造成的这种差异,接下来我们就来简单分析一下。

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

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

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

2. explain 分析

我们先用 explain 来看下这几个 SQL 不同的执行计划:

可以看到,前三个统计方式的执行计划是一样的,后面两个是一样的。

我这里和大家比较下 explain 中的不同项:

  • type:前三个的 type 值为 index,表示全索引扫描,就是把整个索引过一遍就行(注意是索引不是整个表);后两个的 type 值为 all,表示全表扫描,即不会使用索引。

  • key:这个表示 MySQL 决定采用哪个索引来优化对该表的访问,PRIMARY 表示利用主键索引,NULL 表示不用索引。

  • key_len:这个表示 MySQL 使用的键长度,因为我们的主键类型是 INT 且非空,所以值为 4。

  • Extra:这个中的 Using index 表示优化器只需要通过访问索引就可以获取到需要的数据(不需要回表)。

通过 explain 我们其实也能大概看出来前三种统计方式的执行效率是要高一些的(因为用到了索引),而后面两种的统计效率相对来说要低一些的(没用索引,需要全表扫描)。

仅有上面的分析还不够,我们再来从原理角度来分析一下。

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

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

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

3. 原理分析

3.1 主键索引与普通索引

在开始原理分析以前,我想先带领大家看一下 B+ 树,这对于我们理解接下来的内容有重要作用。

大家都知道,InnoDB 中索引的存储结构都是 B+ 树(至于什么是 B+ 树,和 B 树有什么区别,这个本文就不讨论了,这两个单独都能整出来一篇文章),主键索引和普通索引的存储又有所不同,如下图表示主键索引:

可以看到,在主键索引中,叶子结点保存了每一行的数据。

而在普通索引中,叶子结点保存的是主键值,当我们使用普通索引去搜索数据的时候,先在叶子结点中找到主键,再拿着主键去主键索引中查找数据,相当于做了两次查找,这也就是我们平常所说的回表操作。

3.2 原理分析

不知道小伙伴们有没有注意过,我们学习 MySQL 的时候,count 函数是归在聚合函数那一类的,就是 avg、sum 等,count 函数和这些归在一起,说明它也是一个聚合函数。

既然是聚合函数,那么就需要对返回的结果集进行一行行的判断,这里就涉及到一个问题,返回的结果是啥?我们分别来看:

对于 select count(1) from user; 这个查询来说,InnoDB 引擎会去找到一个最小的索引树去遍历(不一定是主键索引),但是不会读取数据,而是读到一个叶子节点,就返回 1,最后将结果累加。

对于 select count(id) from user; 这个查询来说,InnoDB 引擎会遍历整个主键索引,然后读取 id 并返回,不过因为 id 是主键,就在 B+ 树的叶子节点上,所以这个过程不会涉及到随机 IO(并不需要回表等操作去数据页拿数据),性能也是 OK 的。

对于 select count(username) from user; 这个查询来说,InnoDB 引擎会遍历整张表做全表扫描,读取每一行的 username 字段并返回,如果 username 在定义时候设置了 not null,那么直接统计 username 的个数;如果 username 在定义的时候没有设置 not null,那么就先判断一下 username 是否为空,然后再统计。

最后再来说说 select count(*) from user; ,这个 SQL 的特殊之处在于它被 MySQL 优化过,当 MySQL 看到 count(*) 就知道你是想统计总记录数,就会去找到一个最小的索引树去遍历,然后统计记录数。

因为主键索引(聚集索引)的叶子节点是数据,而普通索引的叶子节点则是主键值,所以普通索引的索引树要小一些。然而在上文的案例中,我们只有主键索引,所以最终使用的就是主键索引。

现在,如果我修改上面的表,为 username 字段也添加索引,然后我们再来看 explain select count(*) from user; 的执行计划:

可以看到,此时使用的索引就是 username 索引了,和我们前面的分析结果是一致的。

从上面的描述中我们就可以看出,第一个查询性能最高,第二个次之(因为需要读取 id 并返回),第三个最差(因为需要全表扫描),第四个的查询性能则接近第一个。

4. MyISAM 呢?

可能有小伙伴知道,MyISAM 引擎中的 select count(*) from user; 操作执行起来是非常快的,那是因为 MyISAM 把表中的行数直接存在磁盘中了,需要的时候直接读取出来就行了,所以非常快。

MyISAM 引擎之所以这样做,主要是因为它是不支持事务的,所以它的统计实际上就非常容易,添加一行记录一行就行了。

而我们常用的 InnoDB 却不能这样做!为啥?因为 InnoDB 支持事务!为了支持事务,InnoDB 引入了 MVCC 多版本并发控制,所以在数据读取的时候可能会有脏读、幻读以及不可重复读等问题。

所以,InnoDB 需要将每一行数据拿出来,判断该行数据对当前会话是否可见,如果可见,就统计该行数据,否则不予统计。

当然,MySQL 中的 MVCC 实际上是一个非常宏大的话题,以后有空了再和大家详细介绍 MVCC。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

c1896bc7554d0c55dc18ff54194cb656.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

dc28439357228a43e867fa15883cef13.png

f4c1bc266611dc19964394b5377a538e.pngb1c41f4b3fb6f71398a540491bbbac23.pngda243b9528fe4743578143ea0b82155f.png5d2f4862bf0fc1d53245becbb549c4b8.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Java后端面试避坑指南:从HashMap到Redis实战,谢飞机的三轮技术面复盘 在Java后端技术栈中,理解核心原理远比背诵结论重要。从HashMap的底层数据结构与负载因子设计,到并发编程中CountDownLatch与CyclicBarrier的差异,再到Redis库存扣减的increment()陷阱,每一处都体现着源码级认知的价值。MySQL隔离级别与索引设计决定了系统稳定性,而动态代理与锁升级机制则是框架原理的基石。无论是准备大厂面试还是提升工程实践能力,把握这些基础概念、原理及其适用边界,能够帮助开发者避开常见雷区。本文通过一位后端工程师的真实面试经历,拆解Java基础、Re 阅读详情

相关推荐

C++静态变量深度解析:从内存原理到工程实践

在C++编程中,理解变量的存储类别、作用域和生命周期是构建高效、安全程序的基础。从内存布局的角度看,程序运行时数据主要存储在栈、堆和全局/静态存储区等不同区域,这直接决定了变量的初始化时机、可见性和生存周期。静态变量作为一种特殊的存储类别,其核心价值在于它能够在程序的整个生命周期内持久保存数据,同时通过控制链接性来限制作用域,从而有效避免全局命名空间污染,提升代码的模块化与封装性。这一特性使其在实现函数状态保持、管理类级别共享数据以及构建单例模式等场景中具有不可替代的作用。本文聚焦于C++中静态变量的内存机

weixin_30892763的博客 381

MySQL count(*)性能优化:从索引原理到工程方案

在数据库性能优化中,COUNT(*)查询看似简单,却常成为高并发场景下的性能瓶颈。本文从InnoDB存储引擎的MVCC机制出发,解释COUNT(*)为何无法像MyISAM那样直接返回总行数,必须逐行判断事务可见性,从而引发全索引扫描。通过对比COUNT(*)、COUNT(1)、COUNT(字段)的执行计划差异,说明如何正确选择索引与写法。针对大表统计,文章给出定时统计、计数表、多桶计数器等工程方案,并结合真实案例分享隐式类型转换导致的慢查询事故。适合MySQL DBA、后端开发者阅读,帮助系统化解决COUN

weixin_33393017的博客 268

apm软件仿真+QGC地面站 环境搭建

本教程使用场景:apm软件仿真运行于虚拟机 ubuntu环境。qgc地面站位于windows 系统。两个环境在同一台电脑上。 一.apm仿真环境搭建 1.安装vm虚拟机及ubuntu 18。 2.ubuntu下 下载Ardupilot 飞控源码 并配置环境。 下载源码: git clone https://github.com/ArduPilot/ardupilot cd ardupilot git submodule update --init --recursive 配置所需运行的环境:

qthello 6111

C++ this_thread完全指南:get_id、sleep_for、sleep_until与yield的工程实践

在现代C++多线程开发中,线程自身状态控制常被忽视,却直接影响任务调度与性能稳定性。std::this_thread作为标准库提供的线程上下文接口,通过get_id、sleep_for、sleep_until和yield四个函数,为开发者提供了跨平台的线程控制能力。从线程唯一标识的获取,到相对延时与绝对定时的区别,再到主动让出CPU的忙等待策略,每个函数的语义和边界都值得深入理解。正确使用sleep_until配合steady_clock,可避免周期任务中的时间漂移;合理运用sleep_for与yield,

weixin_30984001的博客 242

告别图像畸变:手把手教你用HALCON的`gen_image_to_world_plane_map`做高精度视觉测量

本文详细解析了HALCON的`gen_image_to_world_plane_map`算子在工业视觉测量中的应用,通过精确的几何变换消除透视畸变,提升测量精度。文章涵盖相机标定、世界坐标系建立、实战应用及性能优化,适用于液晶屏质检、金属板检测等场景,帮助工程师实现高精度视觉测量。

weixin_28718487的博客 424

RISC-V V向量指令集学习笔记——访存指令

RISC-V V向量指令集学习笔记——访存指令

qq_41724469的博客 5136

sql 余数_SQL自学常见6个易错难点解析

有没有小伙伴跟我一样在自学SQL,自学数据分析 一起学我自学SQL在:http://xuesql.cn6个易错难点(节约大家的时间写在最前面)关于 year % 2 = 0 这类奇怪算式,有没有?left join 和 right join,左连接右连接左连接右连接,绕晕有吗?group by为什么要加 sum 有没有?a = (select x form table) 括号里又有个SQL什么意思...

weixin_39724362的博客 325

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1891

MySQL函数高阶避坑指南:从字符、日期到窗口函数的实战经验

SQL查询中的函数使用直接影响数据准确性与查询性能,尤其在字符串处理、日期边界、聚合分组和空值判断等场景下,稍有不慎便可能导致线上数据事故。本文从基础概念出发,解析CHAR_LENGTH与LENGTH的字节差异、CONCAT与GROUP_CONCAT的拼接陷阱、DATEDIFF与TIMESTAMPDIFF的边界逻辑,以及ONLY_FULL_GROUP_BY和窗口函数的执行原理。结合真实业务案例,说明如何规避NULL值带来的隐式错误,并利用COALESCE、CASE WHEN等函数提升计算稳定性。同时,介绍R

weixin_30444111的博客 114

创新实训项目博客:基于LoRA的医疗大模型高效微调实战

预训练大语言模型(LLMs)虽然具备了广泛的知识和一定的通用能力,但在特定领域(如医疗)或特定任务(如遵循特定指令格式进行思考链推理)上,其表现往往不尽如人意。微调(Fine-tuning)能够使模型学习到特定领域的数据分布和任务模式,从而在目标任务上获得更好的性能,使其更贴合实际应用需求。使用Unsloth框架加载并以4-bit量化模型。基于数据集,构建了包含明确思考链引导的训练Prompt。配置了LoRA参数,并使用SFTTrainer在单张T4 GPU上对模型进行了高效微调。

m0_73556916的博客 1291

使用Python爬虫抓取公共交通网站的时刻表

Python爬虫是一种通过自动化方式从网页中抓取数据的程序。爬虫通过模拟用户请求,获取网站的HTML页面内容,并通过解析这些HTML内容,提取出我们需要的信息。requests:用于向网站发送HTTP请求并获取响应。:用于解析HTML文档,提取数据。Selenium:用于处理动态加载的网页,模拟浏览器操作。pandas:用于数据处理和分析,方便存储和操作抓取到的数据。本文介绍了如何使用Python爬虫抓取公共交通网站的时刻表,并提取其中的关键信息。我们使用了requestsSelenium和。

2201_76125261的博客 1120

Java LinkedList深度解析:从双向链表原理到实战场景选型

链表作为一种基础的数据结构,通过节点间的引用连接实现动态数据存储,其核心原理在于非连续的内存分配和高效的节点操作。在Java集合框架中,LinkedList基于双向链表实现,每个节点包含数据与前驱、后继引用,这使得其在已知节点位置的插入与删除操作上具有O(1)的时间复杂度优势,尤其适合频繁增删的场景。从技术价值看,理解链表与数组(如ArrayList)的根本差异,是进行数据结构选型、优化程序性能的关键。在实际工程中,LinkedList不仅可作为List使用,还能作为Deque实现栈、队列等功能,常用于需要

weixin_34279184的博客 404

Vue 2 核心语法符号全解析:从 {{}}、:、@ 到 $ 的实战指南

在前端开发中,数据绑定与事件处理是构建交互式界面的基础。Vue.js 作为一款流行的渐进式框架,通过一套简洁的模板语法,将数据与视图进行声明式绑定,其核心在于响应式系统与指令系统。理解这些语法背后的原理,能极大提升开发效率与代码可维护性。Vue 2 通过 `{{}}` 实现文本插值,`:` 作为 `v-bind` 的缩写用于动态属性绑定,`@` 作为 `v-on` 的缩写用于事件监听,`.` 用于添加事件或 `v-model` 的修饰符,`#` 是 `v-slot` 的缩写用于作用域插槽,而以 `$` 开头

weixin_33875839的博客 375

【CANoe示例分析】0002_SOMEIPDemo

该工程由Vector官方提供,作为仿真SOME/IP节点的示例。Demo中介绍了两种仿真SOME/IP节点的方法,一种是基于arxml数据库的仿真,另一种是没有数据库(arxml、fibex)的仿真。无论是哪种形式的仿真,如果想要通过CAPL程序接收或者发送SOME/IP信息,都需要添加交互层的信息,这些信息可以通过添加DLL文件实现,DLL文件路径在CANoe安装目录下的Exec32文件中。

jasonj333 3519

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

选择集在CAD二次开发中的完整实践:从交互到事务防坑指南

在CAD二次开发中,选择集(SelectionSet)是连接用户操作与程序逻辑的关键环节。它并非简单的实体数组,而是一套由AutoCAD主导的模态交互协议,通过ObjectId引用对象,并需结合事务(Transaction)确保数据安全。掌握选择集,意味着能实现批量修改图层、条件筛选、拾取定位等高效交互功能,是构建专业AutoCAD插件(ObjectARX)的必备技能。本文从核心API、过滤条件到高频疑难排查,系统梳理了选择集开发全链路,帮助开发者避开常见陷阱,提升工程效率。

weixin_34008933的博客 457

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

3款开源Web端ER图设计工具对比与实践指南

在数据库设计中,ER图是梳理实体关系、保障数据模型清晰度的核心手段。传统桌面绘图工具存在安装繁琐、协作不便等问题,而Web端开源工具凭借免安装、跨平台、易分享的优势,正成为数据库建模的新趋势。这类工具的核心原理是将表结构、字段约束与关系转化为可视化图形,再通过导出功能生成建表SQL或文档,从而打通从设计到落地的完整链路。它们既能服务课程设计、快速原型等轻量场景,也能支撑长期项目的文档演进。当团队需要协同评审或持续维护数据模型时,选择合适的开源工具能显著提升效率。本文分别介绍diagrams.net、WWW

weixin_33862993的博客 432

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

存储过程造数:MySQL 10万条测试数据的性能优化实战

在数据库开发与测试中,构造大量真实模拟数据是验证系统稳定性的关键环节。存储过程作为数据库内置的编程能力,可通过循环与事务机制高效批量生成记录,其核心原理是合并多次插入为分批提交,显著降低刷盘与日志开销。这种技术广泛应用于接口压测、报表统计、分库分表验证等场景,能够快速产出不重复且符合业务分布的数据。以MySQL为例,通过优化提交频率、调整日志参数、合理设计数据表达式,可将插入10万条数据的耗时从数十秒压缩到秒级。本文从基础语法出发,结合性能瓶颈分析,提供了一套可直接落地的造数方案与面试级设计思路。

weixin_29913663的博客 85

MySQL索引优化21个实战技巧:避开索引失效坑,查询性能立竿见影

数据库查询性能优化的核心在于索引的高效利用,但很多开发者常常陷入“建了索引却不生效”的困境。索引本质上是一种以空间换时间的树形结构,它的设计、字段顺序、以及查询语句的写法,都会直接影响优化器的成本决策。实际业务中,通过EXPLAIN分析执行计划、理解联合索引的最左前缀原则、利用覆盖索引减少回表、警惕隐式类型转换导致索引失效,这些都是提升查询性能的关键路径。无论是高频订单查询、深分页翻页,还是高并发写入场景,合理的索引设计都能显著降低扫描行数与IO开销。本文沉淀了21个源自真实踩坑经验的MySQL索引优化技巧

weixin_31569671的博客 285

Linux驱动中的并发与竞争处理

并发就是多个“用户”同时访问同一个共享资源,比如你们公司有一台打印机,你们公司的所有人都可以使用。现在小李和小王要同时使用这一台打印机,都要打印一份文件。小李要打印的文件内容如下:小王要打印的内容如下:这两份文档肯定是各自打印出来的,不能相互影响。当两个人同时打印的话如果打印机不做处理的话可能会出现小李的文档打印了一行,然后开始打印小王的文档,这样打印出来的文档就错乱了,可能会出现如下的错误文档内容:可以看出,小王打印出来的文档中电话号码错误了,变成小李的了,这是绝对不允许的。

qq_28576837的博客 1447

Redisson 实战精讲:从分布式锁到序列化,Java 分布式编程的完整指南

在分布式系统架构中,并发控制与数据一致性是绕不开的核心挑战。当单机锁无法满足多实例部署的互斥需求时,基于 Redis 的分布式锁成为首选方案。然而,原生 SETNX 命令在锁过期、续期、重入以及主从切换等场景下存在诸多隐患,手写一套生产级锁代价极高。Redisson 作为 Java 分布式编程的工具箱,不仅封装了 RLock 分布式锁,内置看门狗自动续期机制,还提供 RMap、RSet、RRateLimiter、RBloomFilter 等丰富的分布式数据结构与服务。通过 Lua 脚本保证原子性,Redis

weixin_34174322的博客 264

网口温湿度记录仪长连接断线排查与心跳机制设计实战

在物联网与动环监控场景中,设备与服务器之间普遍采用TCP长连接来保证数据实时性。然而长连接静默空闲时,极易被路径上的NAT会话老化、防火墙超时等机制悄悄回收,导致设备看似在线、数据却中断的“假活”现象。理解TCP keepalive与应用层心跳的区别是关键:前者只能探测系统级可达性,后者才能在数据通路失效前主动保活并携带设备状态。心跳报文设计需短小可解析,参数配置要综合考虑链路老化时间、超时与重连退避策略。以温湿度记录仪项目为例,结合Netty服务端读空闲检测与嵌入式客户端定时心跳,可系统性地解决周期性断线

weixin_34343308的博客 345

自学习状态机如何智能退出?串口联动与兜底设计解析

在嵌入式系统与设备固件设计中,自学习功能的自动退出机制不仅是时间控制问题,更是状态管理问题。传统定时器方案只关注“时间到”,却忽略串口链路、数据流与学习进度等关键状态,容易导致误退出或数据丢失。通过引入状态机建模,将退出条件挂载于串口活动状态之上,结合会话生命周期拆解与多重缺席判定,可实现不丢、可续、可重入的智能兜底。该设计适用于无人值守采集、上位机协议交互及带自学习功能的自动化产线,帮助系统在交互缺席时自主决策:有进度则继续,无交互且无进展才安全退出。断点续训与异常恢复机制进一步保障了数据的完整性与模型的

weixin_33896726的博客 317

AI Agent开发实战:从核心原理到框架选型与本地部署

智能体(AI Agent)已成为大模型应用落地的关键形态,它以大语言模型为大脑,通过目标拆解、工具调用和环境感知实现自主决策,彻底解决了传统模型“只会说不会做”的知行分离问题。从技术原理看,Agent的核心是一个感知-规划-行动-观察的循环,配合短期工作记忆与长期存储,以及ReAct等推理框架,构成了完整的行动闭环。其技术价值在于将模型能力转化为生产力,可广泛应用于自动化办公、代码生成、信息检索等真实场景。当前主流Agent框架各有侧重,如LangChain、AutoGen适合复杂流程编排,而本地部署方案则

weixin_34409357的博客 945
上一篇: 工作中最常用的 8 种设计模式
下一篇: DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值