InnoDB预读机制详解:从Buffer Pool命中率到性能调优

在做MySQL性能调优时,InnoDB Buffer Pool的命中率永远是我最先看的指标之一,而“预读”这个藏在Buffer Pool背后的机制,往往被很多人忽略。说句实话,早期我也只把预读当成一个默认配置,直到一次报表业务的磁盘IO被打满,才真正意识到InnoDB预读的威力。简单说,InnoDB预读(read ahead)是在数据访问还没发生之前,先把可能用到的数据页从磁盘读进Buffer Pool,用空间换时间。这篇文章我会结合自己的调优经验,把预读的触发条件、相关参数、监控方法和避坑技巧完整讲一遍,适合正在做数据库运维和开发的同学参考。

1. 预读机制划重点:InnoDB为什么需要预读

1.1 慢的不是计算,是磁盘数据读取

关系型数据库里最容易被业务感知到的延迟,绝大多数来自磁盘IO。即使现在固态硬盘已经很普及,一次单页随机读取依然要几十微秒到几百微秒,而内存访问是纳秒级别。对于大量需要扫描数据的查询,如果每一页都等查询触发后才去磁盘读取,整条查询链路会被IO阻塞得很惨。InnoDB的解决思路之一,就是不让查询“一步步等IO”,而是在它到来之前,预测它可能需要的页,提前丢进Buffer Pool。

Buffer Pool是InnoDB访问数据的中转站,所有读写最终都要在Buffer Pool里的页上进行。读请求到了之后,先看目标页在不在Buffer Pool——在就是内存命中,不在就要从磁盘拉取,这个拉取动作在磁盘调度上具有不可控的延迟。因此,Buffer Pool的命中率直接决定数据库的整体响应速度。而预读机制,就是提高“冷门页命中率”的重要手段:它面向的恰好是那些尚未被访问、但大概率会被访问的页。

1.2 用“备菜”来理解预读和Buffer Pool的关系

我经常用一个厨房例子来解释预读。Buffer Pool就好比备菜台,数据页就是待处理的新鲜食材。普通的做法是厨师接到订单后临时去仓库翻找食材,这对应查询触发后读取数据页,慢。而预读机制就像一个熟悉客人口味的老厨师,看到菜单上连续几桌都是类似菜式,就先让帮厨把接下来几桌可能用到的食材提前备好放在手边。等到真正下单时,直接就锅下菜。

落到InnoDB上,这个“老厨师的判断”来自页访问的顺序规律。InnoDB的数据页按区(extent)划分,一个区默认包含64个连续的16KB数据页,也就是1MB。当系统检测到某个区的访问方式有明显顺序性,就会认为相邻区也会很快被访问,于是发出一个异步读请求,把后续区一次性读入Buffer Pool。这个异步读不会阻塞当前执行中的查询,但会占用后台IO线程。预读进来的页也不是直接丢进热区,而是按照LRU列表规则先放在尾部,避免干扰正常热数据。

1.3 预读是把双刃剑,不能贪多

预读听起来很完美,但它是有代价的。第一,预读要消耗真正的IO带宽——它把磁盘上一些“还没用到”的数据读入内存,如果最后这些页根本没被访问,这些IO就是纯浪费。第二,预读进来的页会占据Buffer Pool空间,如果空间本身紧张,它们可能把原本的高命中率热页挤出去。在极端情况下,预读反而会降低整体命中率,造成“越优化越慢”的诡异现象。

因此,InnoDB对预读的整体设计是“保守中带一点激进”。线性预读默认阈值设得比较高,随机预读甚至默认直接关闭。理解了这个“收益与风险”的权衡,后续调参才不至于盲目。很多时候不是预读不好用,而是它在当前workload下被用错了方向。

2. 线性预读与随机预读:两种模式的触发原理和参数

2.1 线性预读:顺序扫描场景的“连续命中器”

线性预读针对的是非常典型的顺序访问模式:全表扫描、大范围IN查询、带范围的二级索引扫描,这些场景下数据页的访问几乎是从一个区连续走向下一个区。InnoDB会跟踪每个区中顺序被访问的页数,一旦同一个区里顺序访问的页数达到某个阈值,就触发对后续区域的预读。

这个阈值就是参数innodb_read_ahead_threshold,默认值56,取值范围0到64。默认56意味着一个区里已经被顺序访问了56个页时,才认为后续区大概率继续被顺序访问,于是提前读入下几个区。这里有个细节:如果参数设为0,InnoDB会完全禁用线性预读;如果设为64,实际上也会禁用,因为一个区总共只有64页,要达到64个页后才能触发,等于访问完整个区再预读后续区,预读的意义已经不大了。

调低这个阈值(比如调到32),会让预读在更早的阶段被触发,顺序扫描的性能会明显提升,但IO消耗也随之增加。调高阈值(比如调到60或62),会让预读触发条件更苛刻,适合那些虽然有大查询、但并发高、磁盘带宽已经比较紧张的系统。很多DBA习惯“越大越保守”,这个方向是没错的,但一定要结合实际IO能力和查询命中情况来定,不能拍脑袋。

2.2 随机预读:一个默认关闭的“激进选项”

随机预读是另一套判断逻辑。它不看顺序页数量,而是盯着同一个区内的随机访问密度。如果同一个区里有一定数量的页碎片化地被访问到了,InnoDB就猜测这个区剩余页也会被访问,于是把整个区读进Buffer Pool。相应的开关参数是innodb_random_read_ahead,默认OFF。

这个机制本意是应对“同一个区域反复点查”的场景,比如一些按ID大量离散查询、但底层数据分布恰好比较聚集的SQL。但问题是,随机访问的“聚集度”很难准确预判,今天几个请求恰好落在同一区,不代表明天剩下几页就会被用到。预测一旦落空,浪费的IO是整块64页,而不是几页,成本比线性预读更高。所以在机械硬盘时代默认关闭是有充分理由的;就算到了NVMe固态时代,我依然不建议轻易打开。

我做过的多数OLTP压测里,打开随机预读后,磁盘读吞吐会明显增加,但QPS基本没有变化,甚至因为无用的预读IO挤占了资源,平均延迟还涨了几个毫秒。如果你真的想验证它有没有用,可以在低峰期对照测试两天,重点看“随机预读页数”和“真正被访问的预读页数”,再决定去留。

2.3 参数速查与选型建议

参数默认值作用域生效方式说明
innodb_read_ahead_threshold56全局动态修改线性预读触发阈值,0~64,越低越激进
innodb_random_read_aheadOFF全局动态修改随机预读总开关,ON表示开启

对于不同负载类型,我的建议如下:

  • 以顺序扫描为绝对主流,例如报表分析、数据仓库场景,且磁盘IO有明显富余,可以把线性阈值降到32~48,让预读更积极。
  • 高并发点查为主,例如典型交易类系统,建议保持默认56或适当调高到60~62,避免预读抢走随机查询需要的IO。
  • 混合负载但Buffer Pool已经不够用,优先考虑关闭或加大阈值,而不是扩预读。
  • 随机预读保持OFF,除非你能拿出监控数据证明命中率很高,再考虑灰度开启。

这些建议都不是绝对标准,真正的依据还是你系统里的命中率、驱逐页数和IO压力,需要有数据支撑。

3. 预读调优实操:从监控到参数调整的一次完整记录

3.1 从InnoDB状态输出里读出预读的真实情况

很多同学调参前不做基线监控,这是最要命的。InnoDB其实把预读的统计信息都放在明面上,只是平时没注意。执行:

SHOW ENGINE INNODB STATUS\G

在输出的“BUFFER POOL AND MEMORY”部分,能找到类似这样的字段:

  • Buffer pool read ahead:预读操作总共读入Buffer Pool的页数
  • Buffer pool read ahead evicted:预读进来但还没被访问就被驱逐出去的页数
  • Buffer pool random read ahead:随机预读读入的页数

第一个字段体现预读发生的总量;第二个字段是最关键的浪费指标;第三个字段专门统计随机预读。只抓一次快照意义不大,因为数值是累计的。我一般会隔10到15分钟抓两次,计算差值。如果read ahead增长量很大,但evicted增长量只在10%以内,说明预读命中率很高,不用动;如果evicted占比长期超过20%甚至接近一半,说明预读过头了,需要让预读更保守。除了状态输出,也可以借助performance_schema里的IO相关视图辅助观察,但上面这三个字段已经是最直接的。

3.2 用系统IO监控判断预读是否在偷偷“搬砖”

由于预读是异步的,业务核心查询可能感觉不到它在发生,但系统层面的IO压力会出卖它。我常用的三个判断手法:

第一,执行iostat -x 1,观察磁盘util、await和avgrq-sz。预读时InnoDB经常一次性读取连续多个页,所以avgrq-sz会明显偏大,可能达到几百KB甚至更高,这是顺序IO的特征。第二,执行iotop -o,专门看mysqld进程的实时磁盘读写速度。如果业务低峰期仍有持续几十MB/s的读,又没有大查询在跑,大概率就是预读或后台刷页在作祟。结合3.1里的evicted字段,就能把“预读浪费”钉死。第三,看慢查询和等待事件。如果大量查询的等待瓶颈是IO,而预读命中率又不高,一般会先考虑收敛预读,而不是盲目加大Buffer Pool。

3.3 一次阈值调整的复盘:从IO打满到逐渐收敛

前一段时间我接手一个报表系统,每天都跑几十个大范围扫描查询,平均磁盘util长期在85%左右,偶尔直接100%。问题表象是查询慢,但慢查询日志里SQL执行计划都正常,索引也合理。我第一反应不是看SQL,而是看预读统计。连续采集两次SHOW ENGINE INNODB STATUS后,发现read ahead增长每秒约两千页,但evicted增长占了将近一半——也就是说预读进来大量页面,一大半连用都没用就被挤走了。IO都花在这种无效预读上。

当时系统参数还是默认的56,考虑到报表查询虽然是大扫描,但多个会话并发交错,单个区未必能被连续访问56页,预读取样不规律,浪费自然多。我的调整方向是把触发条件收紧,让预读只在访问连续性更有把握时才发生。于是执行:

SET GLOBAL innodb_read_ahead_threshold = 62;

然后把这个值写进配置文件,等待了几个小时再采集。结果read ahead增长量明显下降,evicted占read ahead的比例从接近50%降到了大概15%,磁盘util从85%降到60%左右。业务侧报表查询的响应时间虽然没有飞跃式提升,但稳定性明显好了,没有再出现IO长时间打满的情况。这次调优真正的收益不是让某个查询变快,而是把被浪费的IO还给了正常查询。

当然,我也处理过完全相反的情况。另一个库的大表统计任务每次要扫描几十GB,但默认阈值56下,单区访问连续性经常刚好达不到触发线,导致大量查询像“温水煮青蛙”一样逐页IO。这时我把阈值调低到32,预读触发概率提高,扫描速度明显加快。同一个参数,不同系统,调的方向完全相反。这正说明预读调优必须带着监控数据来做。

3.4 让参数生效的正确姿势

上面两条动态修改命令确实可以直接生效,但如果MySQL实例重启,动态设置会全部丢失,又回到配置文件里的旧值。很多同学踩过这个坑:调优效果不错,结果某天实例重启后参数恢复默认,IO问题再次爆发。

在MySQL 8.0里可以用SET PERSIST持久化,例如:

SET PERSIST innodb_read_ahead_threshold = 62;

这样会同时修改运行值并写入数据目录下的mysqld-auto.cnf,以后启动自动读取。如果你还停留在老版本,或者习惯用传统配置文件管理,那就手动把参数加到my.cnf的[mysqld]段,例如:

[mysqld] innodb_read_ahead_threshold = 62 innodb_random_read_ahead = OFF

这里还有个容易忽略的点:innodb_read_ahead_threshold虽然是全局参数,但不是所有版本都支持动态修改,至少8.0主流版本没问题。改完以后建议立即执行SHOW VARIABLES确认:

SHOW VARIABLES LIKE 'innodb%read_ahead%';

输出里两个参数都验证过,再继续观察业务监控曲线,才能确定改的是预期值。

4. 预读避坑指南:四个最容易踩的坑

4.1 预读页把Buffer Pool污染了

预读页进入Buffer Pool后,并不直接进入热区,而是放在LRU链表尾部。这是InnoDB刻意设计的减速带,让预读页有机会在被访问后晋升热区,没被访问也不会一开始就抢占热数据。但“减速带”不能完全抵消大量预读的冲击。如果预读量太大,LRU尾部持续涌入无用页,这会迫使真正的热页也顺着链表向前移动,最终被驱逐。大量扫描业务最怕的就是“扫描一遍,热数据没了”,也就是Buffer Pool被污染。

InnoDB里还有一个相关参数innodb_old_blocks_time,默认1000毫秒。它规定了一个页在LRU旧区至少要停留多长时间后,才能因为再次访问而晋升热区。对一次性扫描尤其有效:扫描过程中大量预读页虽然被访问,但在旧区停留时间太短,不会晋升热区,不会冲掉真正的热数据。如果你的系统有大量周期性全表扫描,又发现扫描后核心高频查询变慢,可以考虑适当调大这个值,比如2000到5000毫秒。这其实是和预读配合很紧密的一项调优,却经常被分开讨论,有点可惜。

4.2 打开随机预读后,IO反而飞了

随机预读这个参数太有迷惑性了。有些同学看到“随机预读”几个字,就以为它能加速随机点查,于是直接把innodb_random_read_ahead设为ON。结果往往是恶性循环:点查请求没怎么变快,磁盘IO却多了整块区的读取,IO队列变长,所有请求的延迟都被拉高。

我见过最典型的例子是某个订单查询接口,点查量很大,但每次查询的ID分布很随机。打开随机预读后,同一个extent里只要有几个ID被访问到,系统就把整个区64页读进来。可实际上后面来的ID很少落在同一区,预读页大多在LRU尾部等不到访问就被驱逐。最终表现就是随机预读页数暴涨,QPS掉了一截。如果要在生产上验证,我建议至少观察48小时,对比开和关两个阶段的平均延迟、磁盘流量、随机预读页数和驱逐页数,数据会告诉你答案。

4.3 动态改了参数,重启后一切回到解放前

前面已经提过,动态修改和持久化是两码事。有些DBA喜欢在线调优但懒得更新配置文件,觉得环境都是好的,直接调也没问题。数据库重启一次,参数恢复默认,问题复发,然后又开始排查为什么“改了个寂寞”。这个坑特别蠢,但特别常见。我的习惯是:动态修改之后第一时间补配置文件或执行SET PERSIST,并把改动记录到变更单里。哪怕你只是临时降低阈值观察效果,也该先在配置里留一份备注,避免团队成员不知情。

还有另一个小坑:如果实例存在高可用切换,备库被提升为新主库时,使用的前提是重启后配置文件一致,否则主备参数不同步,切换之后性能表现完全不同。预读参数虽然影响没那么大,但同样值得在初始化配置时统一约定。

4.4 预读与操作系统页缓存之间的“双重搬砖”

InnoDB读取数据页到Buffer Pool,底层必然经过文件系统。在Linux上,如果使用默认的fsync或O_DSYNC等方式,InnoDB的读路径会经过操作系统页缓存。这意味着同一个数据页,可能在Buffer Pool里有一份,在系统页缓存里也有一份。对于预读来说,系统本身也有自己的readahead逻辑,两者叠加,会增加内存和IO的无谓消耗。

如果Buffer Pool足够大,且你有把握绝大部分热数据都留在InnoDB层,可以考虑把innodb_flush_method设为O_DIRECT,让InnoDB绕过操作系统文件缓存,直接对磁盘设备进行IO。这样能缓解“双重缓存”问题,也能减少系统预读对Buffer Pool预读效果的干扰。但O_DIRECT不是万能药,它会影响刷脏页的方式和崩溃恢复时间,需要结合具体存储和负载测试后再上生产。单纯为了预读去动flush_method有点大动干戈,我是建议在评估整体IO路径时再把它纳入考虑。

5. 从预读看InnoDB的异步IO与后台调度

5.1 预读请求走的是哪个IO通道

预读并不像很多人想的那样,由用户线程同步去读磁盘。在Linux上,InnoDB会把预读请求提交给后台IO线程,由它们通过异步IO接口发起。用户线程发出预读请求后,可以继续执行自己的逻辑,等到真正需要那批页时,再去等待页被加载完成。这也是为什么预读对单个查询看上去“没有负面影响”。

但这不代表预读没有成本。后台IO线程数量是有限的,如果同一时间预读请求太多,请求队列会变长,排在后面的普通读请求也可能受到牵连。在并发扫描任务很多的时候,我遇到过查询的等待事件集中在“IO read”上,而当时active sessions并不高,根因就是后台读线程被大量预读请求占满。所以,预读的“异步”体现在不阻塞当前查询,但不代表没有代价,代价体现在后台线程的负载。

5.2 预读和刷脏页共用后台线程时的竞争

InnoDB的后台任务除了处理预读,还要负责刷脏页、合并插入缓冲等操作。当Buffer Pool很大、脏页很多时,预读和刷盘都在抢IO。如果你关心写放大,可以关注innodb_io_capacity参数,它决定后台刷新脏页的IOPS上限。预读本身不直接受这个参数限制,但它会占用磁盘带宽,间接导致刷脏速度变慢,进而加剧checkpoint压力。

在IO能力固定的情况下,预读激进和刷脏及时其实是矛盾的。我调预读时会同时看磁盘读写压力分布。如果读IO已经很高,但脏页比例也在持续上涨,说明后台写已经没有余力,这时应当收敛预读,而不是继续加大。反过来,如果磁盘读IO很低,写压力也不大,预读取激进一点通常问题不大。这个“读写跷跷板”的直觉,比死记参数值重要得多。

5.3 用perf/iostat这类工具进一步定位预读异常

定位预读相关的异常,我一般会组合使用几个工具。第一步是iostat -x 1看整体IO带宽和队列长度;第二步是SHOW ENGINE INNODB STATUS看预读统计;第三步是iotop -o确认mysqld进程的实时读写。

如果这三步不够,我才会在测试环境上用strace跟踪单条SQL的系统调用。比如执行一个大范围查询时,能看到系统层面发出readahead调用,结合文件offset判断是不是在预读相邻区。不过strace对生产环境有性能损耗,尽量少用。在绝大多数情况下,通过状态输出和iostat的组合已经能把预读异常定位清楚。

最后说点个人经验

“这台机器IO压力大,是不是该把预读调大?”这是我被问过最多的问题之一。实际上预读调优很少是“调大”或“调小”这么简单,更多时候是在找匹配当前负载的那条线。我在实际运维中最大的体会是,先看数据,再动参数。很多默认配置在常规环境下反而是最稳的,真正需要调的是那些有明确顺序扫描特征、又明显出现预读浪费或预读不足的系统。如果你刚接触这块,我建议从SHOW ENGINE INNODB STATUS开始,把read ahead和evicted数据收集两天,再决定要不要动。

最后说个小技巧:预读参数适合两个人配合调,一个人盯着IO曲线,另一个人改参数,每次只改一个值,观察时间足够长。这样你才知道这个改动到底是救了系统,还是添了麻烦。预读是个“慢变量”,它的效果会体现在整体稳定性上,而不是某一条SQL的跑分里。

相关新闻

深度解析InnoDB Buffer Pool:从工作原理到性能调优实战

深度解析InnoDB Buffer Pool:从工作原理到性能调优实战

1. Buffer Pool在解决什么问题:一次磁盘读页的代价很多刚接触MySQL内部机制的朋友,对Buffer Pool的第一印象是"一块缓存内存,用来加速查询的"。这个说法没错,但它掩盖了一个关键问题:为什么偏偏是它&#xf…

2026/10/22 9:45:23 阅读更多 →
敏捷落地为何总翻车?85页PPT拆解理念、实践与转型优先级

敏捷落地为何总翻车?85页PPT拆解理念、实践与转型优先级

简介:这份85页PPT系统梳理了华为敏捷软件开发的核心知识体系,面向软件开发管理者、项目经理、开发与测试人员,以及希望理解敏捷理念与落地策略的技术从业者。内容从敏捷诞生的历史背景讲起,涵盖敏捷宣言的四大价值观、对敏捷的常见…

2026/10/22 10:26:28 阅读更多 →
AI手绘风格生成不稳定?327种编号化风格实现精准复现

AI手绘风格生成不稳定?327种编号化风格实现精准复现

1. 手绘风格生成的核心痛点与破局思路手绘风格图像生成这件事,看起来门槛不高,但真正批量做过项目的人都知道,它有一个非常折磨人的特性:随机性太强,复现性太差。你让AI画一张“手绘风格的流程图”,第一次出…

2026/10/22 10:24:18 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

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

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

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

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

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

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

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

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

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

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 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/21 21:50:56 阅读更多 →
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/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练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/21 16:24:48 阅读更多 →