MySQL调优核心:深入解析redo log落盘机制与架构分工

做MySQL调优这几年,接触过不少慢查询、死锁、主从延迟的案例,最后几乎都绕回两个底层问题:MySQL整体架构是如何分工的,以及redo log到底在什么时机落盘。很多人把索引优化、SQL改写玩得很溜,但一遇到“磁盘IO突然飙高”“数据库崩溃后恢复很慢”“从库追不上主库”这类问题,就开始抓瞎。说白了,架构和日志机制才是MySQL性能问题的底层答案。这篇就把这两个东西串起来聊透,重点讲讲redo log的落盘机制,以及它如何影响性能和数据安全。

这篇内容适合已经熟悉SQL写法、知道InnoDB和索引基本概念的读者。如果你刚接触MySQL,建议先补充一下基础,再回来看这篇;如果你已经在生产环境摸爬滚打过一阵子,那这篇正好能把一些“知其然不知其所以然”的点补上。

1. 先建立全局观:一条SQL在MySQL里到底经历了什么

1.1 连接管理与线程分配

当你通过客户端发起一条SQL,MySQL首先要做的是身份验证和连接建立。这里涉及两个容易忽略的点:连接方式(TCP/IP、Unix Socket、命名管道)和线程模型。

MySQL对每个连接默认分配一个线程,早期版本是“一个连接一个线程”,连接数一多,线程切换开销就很明显。8.0版本引入了线程池插件,但默认并没有全开。实际生产里,我更建议先控制好max_connections,同时配合wait_timeout、interactive_timeout,避免大量空闲连接长期占用线程资源。曾经遇到过某业务高峰期连接数直接打到2000,数据库CPU没爆但是线程上下文切换飙到吓人,后来发现是应用侧连接池配置过大、龄期回收又太慢,属于典型的不看架构导致的“假资源耗尽”。

连接建立之后,MySQL Server层会拿到SQL字符串,开始进入解析、优化、执行这条流水线。

1.2 解析、优化与执行:从字符串到执行计划

MySQL的Server层大致包含以下几块:

  • 查询缓存:8.0已经直接移除了这个模块,之前版本也建议关闭,因为缓存失效粒度太粗,只要表有更新,整表缓存全部失效,写多读少场景反而拖累性能。
  • 解析器:对SQL做词法分析和语法分析,生成语法树。这里如果SQL写错,会直接报语法错误。
  • 优化器:根据语法树生成执行计划,决定用哪个索引、以什么顺序关联表。这里有个高频问题:优化器选错索引。根本原因是统计信息失真、或者优化器基于成本估算选出来的执行路径不符合实际数据分布。解决办法通常是analyze table更新统计信息,或者用force index、改写SQL引导优化器。

优化器生成执行计划之后,交由执行器去调用存储引擎接口,一行一行取数据。注意,Server层不直接碰数据文件,所有数据读取、修改都是通过存储引擎API完成的。这就引出了MySQL最核心的架构分层:Server层与存储引擎层解耦。

1.3 Server层与存储引擎层的分工

MySQL的架构特色就是插件式存储引擎。Server层负责连接管理、SQL解析、优化、内置函数、权限校验这些通用逻辑;存储引擎层负责数据存储、索引维护、事务、锁、崩溃恢复这些物理实现。

同一张表,底层可以用InnoDB、MyISAM、Memory等不同引擎,SQL写起来没什么差别,但行为差异非常大。比如MyISAM不支持事务、不支持行锁、崩溃恢复只能靠repair;而InnoDB具备事务ACID、行级锁、崩溃恢复能力。

在实际生产里,绝大多数场景都应该选InnoDB。MyISAM只有在极特殊只读、且能容忍损坏风险的场景下才会被考虑。随着MySQL版本迭代,系统表都已经改用了InnoDB,MyISAM更多是历史包袱。

理解这个分层很关键,因为redo log就是InnoDB引擎内部的东西,Server层的binlog又是另一套日志体系。两条日志链路单独看都不复杂,但放在一起,牵涉到事务提交、主从复制、崩溃恢复时,就容易搞混。

2. InnoDB的底层架构:redo log到底在哪个环节登场

2.1 Buffer Pool:数据在内存里的中转站

InnoDB的性能核心,就是Buffer Pool。它是一块内存区域,用于缓存数据页和索引页。读操作优先读Buffer Pool,写操作也是先改Buffer Pool里的页,这些被修改但还没写回磁盘的页称为“脏页”。

这里要理解一个关键矛盾:如果每次修改都直接同步写回磁盘,性能会差到没法用。因为磁盘随机写入的延迟是微秒到毫秒级的,而内存操作是纳秒级的,两者差着几个数量级。Buffer Pool的意义就是尽可能把磁盘操作变成内存操作。

但这也带来一个问题:内存是易失的,如果数据只改了Buffer Pool而没落盘,一旦MySQL崩溃,这些修改就会丢失。于是,redo log登场了。

准确说,redo log是InnoDB用来保证“崩溃后不丢已提交事务”的关键手段。它的思想是:数据不必立刻写回磁盘,但修改过程的日志必须先落盘。这就是WAL(Write-Ahead Logging)机制。

2.2 日志三兄弟:binlog、redo log、undo log各管什么

很多初学者把binlog、redo log、undo log混为一谈,其实三者的职责有明确边界:

  • redo log:InnoDB引擎层日志,记录“物理修改”,比如“把某个数据页的第X个偏移量改成某个值”。主要用于崩溃恢复,保证事务持久性。
  • undo log:InnoDB引擎层日志,记录“反操作”,用于事务回滚和MVCC多版本控制。它保证的是原子性和隔离性。
  • binlog:MySQL Server层日志,记录逻辑操作,比如“执行了某条SQL”。主要用于主从复制、时间点恢复。

这三份日志的写入时机和协作方式,直接决定了数据安全等级和性能表现。下面重点展开redo log。

2.3 WAL机制:先写日志再改数据,到底为什么

WAL的核心思想是:在事务提交时,不需要把修改的数据页刷到磁盘,但必须把redo log刷到磁盘。因为redo log是顺序写入,相比数据页的随机写入,速度快得多。

你可以这样理解:数据页好比一本书的内容页,redo log好比书的修改目录。每次修改内容时,你不需要立刻把整本重抄一遍,只需要在目录里记录“第几页第几行改成了什么”。哪怕后来整本书都烧了,只要目录还在,你还可以照着目录把内容重新写回去。

而且顺序写磁盘的速度,远快于随机写磁盘。机械硬盘上顺序写可以达到百兆级别,随机写可能只有几兆;即便是SSD,顺序写的延迟也显著更好。所以WAL的本质,是用“日志的顺序写”换来“数据页随机写的延迟摊销”。

但WAL并不是无限延迟刷脏页,Buffer Pool的脏页最终还是要刷回磁盘,否则内存会被写满。这就涉及刷脏策略,后面结合checkpoint一起讲。

3. redo log落盘机制拆解:从产生到真正落盘

3.1 redo log的文件组织与LSN

redo log不是单个文件,而是一组日志文件,默认在数据目录下以ib_logfile0、ib_logfile1命名。8.0.30之后,可以通过innodb_redo_log_capacity参数控制总容量,之前的版本则用innodb_log_file_size乘以innodb_log_files_in_group来决定总大小。

redo log采用循环写入方式。文件组被当作一个环形空间,写满之后会覆盖最旧的部分。那“最旧的部分”能不能被覆盖?不能,必须保证覆盖之前,这些日志对应的数据已经刷回磁盘。这个“安全覆盖点”就是checkpoint LSN。

日志记录里有几个关键名词:

  • LSN:Log Sequence Number,日志序列号。它单调递增,相当于日志的“坐标”。每个数据页、每条日志记录、每个checkpoint都有自己的LSN。
  • flushed_to_disk_lsn:已经刷到磁盘的redo log位置。
  • write_lsn:已经写入log buffer的位置。
  • checkpoint_lsn:可以安全覆盖的日志位置。

理解LSN,很多问题就通了。比如你查看show engine innodb status,会看到LOG一栏,里面有一堆LSN值,看懂它们,就能判断redo log的使用和落盘状态。

用户可以通过如下语句查看redo log状态(MySQL 8.0.30之后):

SHOW ENGINE INNODB STATUS;

重点看LOG部分:

Log sequence number: 25828676029 Log flushed up to: 25828674718 Pages flushed up to: 25828629318 Last checkpoint at: 25828601410

四个值分别代表:当前最大LSN、已刷盘LSN、已刷脏页对应LSN、最近checkpoint位置。它们的差值,就是衡量“日志落后”和“脏页压力”的有效指标。

3.2 日志写入路径:从内存到磁盘中间发生了什么

redo log的生成路径分两个阶段:

  1. 事务执行过程中,每产生一条修改,InnoDB会先把对应redo log写入内存中的log buffer。
  2. 事务提交时,根据配置决定是否把log buffer中的日志写入操作系统的page cache,再fsync刷到磁盘。

注意,写入log buffer本身不是落盘,只是内存拷贝。真正落盘要经过两个步骤:

  • write:把log buffer里的日志复制到操作系统内核缓冲区。
  • fsync:把内核缓冲区的数据真正写入磁盘硬件。

这里面有个性能陷阱:如果每次提交事务都执行fsync,在高并发小事务场景下,磁盘IO会成为最大瓶颈。因为fsync是一次磁盘同步操作,哪怕数据量很小,也要等待磁盘硬件确认。为了缓解这个问题,MySQL实现了组提交。

组提交的思想是:把多个事务提交时的fsync合并成一次。当一个事务准备刷盘时,其他正在提交的事务会一起搭顺风车,把各自的redo log一并刷下去。这样在高并发下,每秒事务数可以大幅提升,而fsync次数却不会线性增长。

3.3 核心参数:innodb_flush_log_at_trx_commit的三种策略

这个参数直接决定了redolog的落盘频率,是影响数据安全性和性能最直接的旋钮。它有三个值:

参数值写入log bufferwrite到操作系统fsync落盘崩溃可能丢失的数据性能表现
0事务提交时不写不刷由后台线程每秒执行一次write+fsync每秒刷一次最多丢1秒内的事务最快
1事务提交时写入log buffer事务提交时write事务提交时fsync不丢失已提交事务最慢
2事务提交时写入log buffer事务提交时write由后台线程每秒fsync操作系统崩溃时丢1秒内事务,MySQL崩溃不丢较快

生产环境下,绝大多数业务必须设成1,否则一旦数据库或操作系统崩溃,就会丢已提交事务,这在金融、订单、支付类系统里是不可接受的。

但我遇到过不少开发同学,为了压测好看,直接把参数改成0。这里要特别提醒一句:改之前先想清楚“丢数据”你能不能承受。如果业务能容忍丢失几秒钟的数据(比如访问日志、缓存预热数据),0和2可以用于极致性能压榨;否则老老实实用1。

3.4 每个事务都fsync,怎么把性能找回来

如果你的业务要求innodb_flush_log_at_trx_commit=1,又希望吞吐量不差,可以从以下几个角度入手:

  • 开启组提交,这个在MySQL 5.6之后基本是自动的,不需要额外配置。但binlog的sync_binlog参数最好也配合调整,否则会有“双写双刷”的额外代价。
  • 适当增大innodb_log_buffer_size,避免高并发下log buffer频繁写满、提前触发刷盘。
  • 使用SSD磁盘,尤其是NVMe SSD,fsync延迟比机械硬盘低一个数量级,对刷盘性能改善非常明显。
  • 合理控制事务大小,避免一个事务里写入海量数据,让redo log记录大量膨胀。

这里给出一个典型配置参考:

innodb_log_buffer_size = 64M innodb_log_file_size = 4G innodb_log_files_in_group = 4 innodb_flush_log_at_trx_commit = 1 sync_binlog = 1

不过要强调,这不是万能模板。日志文件总大小应该是你业务高峰时段redo log产生量的合理倍数,具体怎么算,下一节讲。

3.5 组提交与binlog的联动:两阶段提交

在开启binlog的情况下,redo log的写入还牵扯到分布式事务的一致性。MySQL内部使用了两阶段提交:事务提交时,先写redo log并处于prepare状态,再写binlog,最后把redo log改成commit状态。

这么做的原因很直接:redo log和binlog是两套独立的日志,如果先写binlog再写redo log,崩溃后可能binlog里有记录但InnoDB没提交;如果先写redo log再写binlog,可能InnoDB已提交但binlog没有,导致主从复制丢事务或者多事务。两阶段提交保证了这两份日志在崩溃恢复后可以对齐。

实际排查中,偶尔会遇到“从库数据不一致”,很多人的第一反应是复制bug,但有一部分问题就是binlog和redo log的协调出了问题。我们曾经遇到一个主库在并发高峰期崩溃的场景,恢复后部分从库报主键冲突,后来定位发现是binlog中包含了未提交事务的日志,主库恢复时回滚了事务,但从库已经应用了。这种情况如果开启了两阶段提交的正常链路,理论上不会发生,但一旦涉及非事务表、手工修数、或者特殊写操作,就可能打破平衡。

4. 崩溃恢复与checkpoint:落盘机制的另一半

4.1 崩溃后InnoDB如何恢复

当MySQL异常退出,再次启动时,InnoDB会执行崩溃恢复流程。恢复的主要依据就是redo log。

大致流程是:

  1. 扫描redo log,找到最后一个checkpoint位置。
  2. 从checkpoint之后开始重放日志,把那些“在Buffer Pool中被修改但还没刷盘”的页恢复到内存中(重新执行物理修改)。
  3. 对于处于prepare状态的redo log,结合binlog判断事务是否完整,决定是提交还是回滚。

恢复时间的长短,取决于两个因素:checkpoint到日志末尾的距离,以及需要重放的日志量。如果redo log文件设置得太大,崩溃后重新扫描日志的时间可能很长;如果设置得太小,又会频繁触发checkpoint,造成不必要的刷脏。

实际生产里,遇到过MySQL崩溃恢复耗时长的问题,当时redo log总大小配置得非常大,加上Buffer Pool里的脏页也很多,启动时前几分钟CPU高、IO打满,业务受损明显。后来调小了一些日志容量,同时把刷脏策略改成更激进一点,恢复时间从十几分钟降到了两三分钟。

4.2 checkpoint推进与刷脏策略

checkpoint的作用有两个:一是标记redo log可安全覆盖的位置,二是将脏页刷回磁盘。InnoDB推进checkpoint时,会把checkpoint之前的脏页逐步刷盘,然后更新checkpoint LSN。

脏页刷盘不是一次性全部刷完,InnoDB会控制刷盘速度,避免对正常业务产生过大影响。可以通过以下参数调节:

  • innodb_max_dirty_pages_pct:Buffer Pool中脏页比例上限,默认75%。超过这个比例,后台刷脏线程会加速。
  • innodb_io_capacity:刷脏时最多能使用的磁盘IO能力。
  • innodb_io_capacity_max:刷脏时的IO上限。
  • innodb_flush_neighbors:刷脏时是否连带刷相邻页。机械硬盘上可以开启,SSD上建议关闭,因为顺序读相邻页对SSD没意义,反而浪费时间。

从实际调优经验来说,SSD环境下innodb_flush_neighbors设为0,innodb_io_capacity可以设到2000~5000,视磁盘能力而异。如果发现日志里频繁出现“page cleaner”相关等待,多半是刷脏速度和业务写入速度不匹配。

4.3 参数调优:怎么算redo log该设多大

redo log总大小直接影响写入性能和崩溃恢复时间。设得太小,InnoDB会频繁推进checkpoint,刷脏压力大,可能导致性能抖动。设得太大,崩溃恢复时间变长,日志文件占用的磁盘空间也多。

比较合理的估算方式是基于“单位时间redo log生成量”。可以这样观察:

SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_written_bytes';

或者看:

SHOW ENGINE INNODB STATUS;

记录当前时刻的Log sequence number,过一个小时再看一次,差值就是这一个小时产生的redo log字节数。用这个值乘以你希望覆盖的时间段(一般建议至少能容纳30分钟到1小时的日志量),就是日志总容量的下限。

举个例子,如果高峰每小时产生2GB redo log,希望覆盖30分钟的量,那总容量至少要在1GB以上。考虑到峰值和波动,我会建议配成2倍到4倍,也就是2GB到4GB。在8.0.30之后,可以直接用innodb_redo_log_capacity=8G这样的方式配置,系统会自动管理日志文件。

但要注意,日志容量增大虽然能减少checkpoint的频率,却会增加崩溃恢复的扫描时间。要取得平衡,建议配合监控,观察正常运行时“Log flushed up to”和“Last checkpoint at”之间的差值,如果能长期保持很小,说明日志容量偏大;如果经常逼近日志上限,说明容量吃紧。

5. 实操心得与问题排查

5.1 常见问题速查表

现象可能原因处理思路
磁盘IO很高,但SQL本身不慢刷脏线程压力大,redo log太小或checkpoint频繁查看Innodb_buffer_pool_pages_dirty,调大日志容量,调高io_capacity
崩溃恢复时间很长redo log总容量过大,脏页太多控制日志容量,优化刷脏参数
主从延迟大binlog落盘慢、从库应用慢、大事务检查sync_binlog、从库并行复制配置
写入性能差,fsync开销大innodb_flush_log_at_trx_commit=1且磁盘慢换SSD,开启组提交,合并小事务
数据库重启后丢失已提交事务参数被改成0或2,且操作系统崩溃设回1,评估业务容忍度后再考虑降级

5.2 监控与观测建议

这里分享几个比较实用的监控思路,都是我在实际运维中验证过有效的方式。

首先要盯的是redo log的“水位”。用SHOW ENGINE INNODB STATUS查看LOG段:

  • Log sequence number和Log flushed up to的差值,代表有多少日志还没落盘。
  • Log flushed up to和Last checkpoint at的差值,代表有多少日志对应的脏页还没刷盘。

如果第一个差值持续增长,说明log buffer或刷盘链路有问题;如果第二个差值持续很高,说明脏页刷不过来。

其次,掉到磁盘层的指标也不可忽视。用iostat观察磁盘的util、w_await、svctm,如果w_await明显高于读延迟,很可能redo log刷盘正在排队。配合Percona Toolkit里的pt-stalk或者开源的mysqld_exporter,可以采集到更细粒度的数据。

5.3 实际案例:一次redo log引发的性能抖动

简单说一个案例。某业务在高峰期经常出现每秒几百次的fsync,磁盘util接近100%,应用的写入RT呈锯齿状波动。起初以为是SQL慢查询,查了一圈没有明显大查询,最后看InnoDB状态,发现Log flushed up to和Last checkpoint at之间的差距已经超过600MB,说明脏页累积非常严重。

检查配置后发现redo log总容量只有1GB,而高峰期每小时产生的redo log量超过3GB。日志容量太小,导致InnoDB疯狂推进checkpoint,刷脏线程几乎一直在工作。后来把日志容量提到8GB,同时把io_capacity调到合理档位,抖动立刻消失。这里最关键的一点是,必须观察业务高峰时期redo log产生的真实速率,而不能仅仅依赖默认值。

5.4 参数配置的最终建议

在InnoDB调优这件事上,我踩过不少坑,有两点体会特别深。

第一,不要把单一参数调到极限。redo log容量、buffer pool大小、刷脏参数三者是联动的。buffer pool越大,能容纳的脏页越多,对redo log容量的需求也会增加;redo log越小,刷脏频率越高,对IO的压力就越大。三个参数必须一起评估,不能只看单独一项。

第二,用默认值并不丢人。很多情况下,MySQL 8.0的默认配置已经足够好。真正需要调整的时候,往往是业务写入模型非常集中、或者磁盘硬件差异极大的场景。我建议每次只改一个参数,观察至少一个业务周期,再做下一步调整。否则改了两个参数,出了问题根本不知道是哪一项引起的。

最后再分享一个调试技巧:如果你怀疑redo log刷盘是瓶颈,可以直接用下面这条命令查看fsync计数和每秒刷盘次数:

SHOW GLOBAL STATUS LIKE 'Innodb_data_fsyncs';

把这个值除以运行时间,得到每秒fsync次数。再结合磁盘的延迟数据,基本就能定位刷盘是否存在问题。这个方法简单有效,比很多监控工具都直观。

相关新闻

流放之路2国际服交易工具汉化与查价器使用全攻略

流放之路2国际服交易工具汉化与查价器使用全攻略

在流放之路2 的国际服交易玩法里,网页市集、忍者网和 Path of Building 几乎是每个玩家都会用到的工具组合。不过对于不熟悉英文界面的玩家,满屏词缀、陌生术语和复杂的查询参数,很容易让人在配装、比价时一头雾水。这篇文章打算把网页市集汉…

2026/10/20 8:06:24 阅读更多 →
raylib解压即用开发环境:一条gcc命令从窗口到Makefile工程化

raylib解压即用开发环境:一条gcc命令从窗口到Makefile工程化

简介:raylib 是一套以简单易用著称的开源游戏编程库,这份压缩包正是其整合发布版,面向希望快速上手 C/C 图形编程的开发者与游戏原型爱好者,适合从零搭建图形窗口、绘制基本图形、处理输入事件并产出可运行的跨平台演示程序。包内…

2026/10/20 8:05:23 阅读更多 →
SpringBoot+Vue儿童性教育平台:前后端分离毕设项目核心拆解

SpringBoot+Vue儿童性教育平台:前后端分离毕设项目核心拆解

拿到这套SpringBootVue儿童性教育网站平台项目源码的时候,我做的第一件事不是急着双击启动,而是先翻了SQL脚本和接口文档。做了这么多年Java Web开发,我太清楚这类毕设项目的命门在哪儿:代码可以抄,页面可以仿&#xf…

2026/10/20 8:05:23 阅读更多 →

最新新闻

C# Windows服务开发全攻略:从生命周期到调试部署

C# Windows服务开发全攻略:从生命周期到调试部署

用C#写Windows服务程序,这件事听起来像是一个“上古时代”的开发任务,但实际上只要你做过任何需要长时间后台运行、脱离用户会话独立工作的功能——比如数据同步、文件监控、定时报表推送——Windows服务就是绕不开的选项。C#在这方面成熟度极高&#xf…

2026/10/20 9:40:21 阅读更多 →
AI Agent架构设计对比:OpenClaw与OpenCode的工程实践

AI Agent架构设计对比:OpenClaw与OpenCode的工程实践

1. 从两个开源项目的设计分歧说起AI Agent 这个词在过去一年被用得太泛了。但凡能调个 API、能读个文件、能跑个循环,都敢叫自己 Agent。但真正落到架构设计层面,不同项目之间的差异其实非常大——大到什么程度?大到你对"Agent 到底是什…

2026/10/20 9:40:21 阅读更多 →
代码大模型周报:仓库级理解与推理效率优化论文精选

代码大模型周报:仓库级理解与推理效率优化论文精选

1. 这周代码大模型圈子里值得细看的三篇论文每周追代码大模型方向的论文,最头疼的不是找不到论文,而是找到的太多、太杂,不知道哪些值得花时间精读。我自己的习惯是每周固定花两三个小时,把主要来源的更新过一遍,筛出三…

2026/10/20 9:40:21 阅读更多 →
STM32CubeIDE V2.0.0实战:嵌入式开发工具链的集成与调试效率提升

STM32CubeIDE V2.0.0实战:嵌入式开发工具链的集成与调试效率提升

做嵌入式开发这些年,我几乎把主流的工具链都摸过一遍,从早期用第三方编译器配合外部烧录工具,到后来各家芯片厂商自己出IDE,说实话折腾的过程里踩了不少坑。STM32CubeIDE这个工具,我算是从它刚推出就一路用过来的&…

2026/10/20 9:40:21 阅读更多 →
AI大模型时代Java与大数据开发者的能力升级与实战路径

AI大模型时代Java与大数据开发者的能力升级与实战路径

最近不少讨论都围绕一个话题:AI 大模型到底会不会抢走程序员的饭碗。尤其是做 Java、大数据的同学,焦虑感往往更强。因为网上的声音总是很极端——一边说“Java 已经过时了,赶紧转 AI”,另一边说“大模型只是玩具,企业…

2026/10/20 9:40:21 阅读更多 →
OpenClaw 自动化任务编排框架:部署、配置与运维实战指南

OpenClaw 自动化任务编排框架:部署、配置与运维实战指南

1. 项目概述与核心定位OpenClaw 这个项目,我在几个不同的环境里前后部署过不下十次,从最早期的版本一路跟到现在的稳定分支,踩过的坑和积累的经验足够写一本小册子。简单来说,OpenClaw 是一个开源的自动化任务编排与执行框架&…

2026/10/20 9:39:16 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →