从SQL到数据返回:数据库查询执行链路与慢SQL排查实战
一条看似普通的SELECT语句从客户端发出去到数据真正返回中间要走过一条相当长的流水线。我指的不仅仅是网络传输和SQL文本解析还包括优化器怎么选执行计划、执行引擎怎么扫描数据、存储引擎怎么读取页面和落盘。平时写完SQL能跑出结果我们很少会去关心这一整套链路但一旦遇到慢查询、索引失效、死锁、复制延迟这类问题如果你不清楚这条链路每个环节在做什么排查起来基本就是靠猜。这篇文章把“从SQL语句到数据库操作”的完整链路拆开讲一遍。我以一条真实的查询为例从解析、优化、执行一路讲到存储引擎内部的日志和锁最后整理一份我平时排查慢SQL的检查清单。适合后端开发、数据分析师、运维同学也适合刚接触数据库原理不久、想搞明白执行计划结果到底在说什么的人。内容不绑定某个具体数据库但会尽量贴近市面上最主流的关系型数据库实现原理通用。1. SQL语句是怎么被“读懂”的解析与预处理1.1 词法分析、语法解析与语法树先明确一个认知数据库不是一个逐字符匹配的文本解释器。你发过去的SQL文本第一步会被拆成一个个最小的语法单元也就是Token。SELECT、FROM、WHERE这些关键字表名、列名、数字常量、字符串字面量、运算符全都会被识别出来。这个过程叫词法分析。比如下面这条SQLSELECT user_id, order_amount FROM orders WHERE create_time 2024-01-01 AND status 1 ORDER BY create_time DESC LIMIT 20;词法分析阶段会把整条语句拆成类似这样的Token序列SELECT、user_id、,、order_amount、FROM、orders、WHERE、create_time、、2024-01-01、AND、status、、1……紧接着是语法解析。解析器拿到Token流后会按照SQL的语法规则构建一棵语法树。这棵树的根节点是查询下面挂着SELECT列表、FROM子句、WHERE条件、ORDER BY排序条件等子节点。如果SQL本身写错了比如漏了关键字、括号不匹配报错就发生在这个阶段。这个过程跟编译器把源代码转成AST再编译是一样的道理。你写SQL本质是在用声明式的语言描述“我要什么数据”而不是“怎么取这些数据”。怎么取是后面优化器和执行引擎的事。所以理解语法树很重要它是后续所有优化动作的载体。1.2 语义检查、权限校验与查询改写语法树生成后数据库还要做语义检查表存在吗列存在吗字段类型匹配吗这些检查必须在真正执行前完成不然执行到一半才发现列名写错整个事务状态会变得很难处理。与此同时权限校验也会在这里做——当前登录账号对这个表有没有SELECT权限没有就直接拒绝省得后面白忙一场。接下来是查询改写这个环节容易被忽略但非常关键。比如你查的是一个视图数据库会把视图定义展开成底层表的真实查询如果你写了复杂的子查询常见数据库的优化器通常会做子查询去关联优化把嵌套子查询改写成JOIN或者半连接。这也是为什么有时候你自己写的SQL很绕——子查询套了三层执行计划却很“平”因为底层优化器已经帮你做了等价变换。这里有一个实操中容易踩的坑同一个SQL在不同版本的数据库里改写能力是不一样的。老版本对子查询的处理普遍比较弱可能直接把子查询物化成一张临时表然后对临时表做全表扫描性能很难看。这不是你SQL写错了而是优化器版本能力的问题。遇到这类情况与其升级版本不如手动把子查询改写成JOIN往往立竿见影。2. 优化器的决策过程执行计划是怎么选出来的2.1 统计信息与代价估算优化器的“算账”逻辑语法树准备好了优化器登场。优化器不是靠固定规则猜的而是带着统计信息去“算账”。数据库为每一张表保存了行数、数据页数、索引信息、列的直方图等统计信息。遇到WHERE条件时它会估算这个条件的过滤率也就是“筛选后大概还剩多少行”这个估算值在专业术语里叫基数Cardinality。基数越小越值得走索引基数接近全表走索引的意义就不大。举例一张订单表有100万行status字段区分度很差只有0和1两个值比例大概是99比1。查询WHERE status 1会过滤掉99%的数据剩下约一万行优化器大概率选全表扫描。但如果查询WHERE user_id 某个具体用户ID由于user_id区分度高剩下可能只有几百行优化器就会果断走索引。这里藏着很多新手理解不了的“索引失效”真相。为什么明明有索引执行计划不用它因为全表扫描在存储引擎层是顺序读性能并不差而走二级索引还要回表后面细讲涉及随机读。优化器算总账发现全表扫描代价更低就会忽略索引。这不是索引失效是优化器觉得不划算。统计信息过期也会导致优化器算错账。比如表数据量从10万涨到1000万统计信息没刷新优化器还以为走索引要读的行很少结果执行计划选了错索引慢查询一下就出来了。这是生产环境里非常典型的一类问题。还要补充一个容易被忽略的因素LIMIT。如果查询加了LIMIT 10即使筛选条件预期返回十万行优化器也知道走某个索引扫描到第10条就能提前停所以它会把“提前终止”的收益算进去经常因此选择辅助索引而不是覆盖索引。这个行为在排序查询里尤其常见。2.2 看懂EXPLAIN从执行计划反推优化思路排查SQL性能问题第一步永远是看执行计划。主流关系型数据库都支持EXPLAIN用法大同小异EXPLAIN SELECT user_id, order_amount FROM orders WHERE create_time 2024-01-01 AND status 1 ORDER BY create_time DESC LIMIT 20;输出结果里我重点看这几个字段type、key、rows、Extra。type字段表示访问类型按性能从好到差大致排序访问类型含义典型场景const按主键或唯一索引等值查询最多返回一行主键等值条件ref普通索引等值匹配索引列 常量range索引范围扫描、、BETWEEN、LIKE前缀index扫描整棵索引树但不需要访问表数据覆盖索引场景ALL全表扫描未走索引或优化器判断走索引不如全表扫rows是优化器估算的要扫描的行数不是精确值但能反映代价量级。Extra列才是真正藏信息的地方常见的有Using index覆盖索引查询列全部在索引树里不用回表这是很理想的状态。Using where存储引擎返回记录后再做一次条件过滤。Using filesort需要额外排序常见于ORDER BY无法用到索引的情况代价偏高。Using temporary用了临时表常见于GROUP BY或子查询物化需要警惕。我会反复强调一个事看执行计划不要只看有没有走索引要看rows和Extra。举个例子某次排查看到的执行计划是possible_keys: idx_status, idx_create_time key: idx_status rows: 480000 Extra: Using where; Using filesort这个SQL是“按状态过滤 按时间排序”。idx_status区分度太低虽然走了索引但rows估算48万行等于扫了半个表后面还要filesort。这个索引走了还不如不走。后来我把SQL改成让优化器走idx_create_time利用索引天然有序的特性做排序同时用状态做过滤整体耗时从800毫秒降到20毫秒。这就是看懂执行计划的价值——不是“有索引就行”是“选对索引才行”。3. 执行引擎拿到执行计划后怎么工作从算子到数据行3.1 算子与流水线执行执行计划不是一段文本而是一棵算子树。每个算子对应一种数据操作IndexScan索引扫描、Filter过滤、Sort排序、TopN取前N条、HashJoin哈希连接、NestedLoopJoin循环嵌套连接、Aggregate聚合等。执行引擎从数据源算子开始一行一行向上驱动上层算子处理完一行再交给更上层直到输出给客户端。这种逐行拉动的模型在数据库术语里叫Volcano模型或迭代模型。它的好处是内存占用小、响应快。比如一个分组聚合查询如果用流水线模型第一行结果可能在扫描完第一批数据后就能产出不需要等整个表全部处理完。这也是为什么流式计算、实时报表能用SQL做——执行引擎天生就带流式处理能力。回到前面那条查询。它的执行计划大概长这样IndexRangeScan on create_time用时间索引做范围扫描拿到满足时间条件的记录。Filter on status 1逐行过滤状态值。TopN维护一个大小为20的有序堆只保留时间最大的20条而不是把所有结果排序后取20条。关键是最后这个TopN。如果排序逻辑走的是ORDER BY create_time DESC LIMIT 20而create_time恰好是索引列那么排序本身可以直接利用索引的有序性连TopN的堆都可以省。这就是为什么我一直强调排序字段尽量进索引排序是索引最容易被低估的用途之一。3.2 索引扫描、回表与覆盖索引的真实成本执行计划最终要落到存储引擎层去取数。这里把最常见的索引结构讲透主流关系型数据库的主键索引是聚簇索引表数据按主键顺序存在B树的叶子节点上。二级索引普通索引的叶子节点不存完整行数据只存索引键值和主键值。走二级索引找到一个主键后再到聚簇索引里通过主键找完整行这个动作叫回表。每回表一次就是一次额外的B树查找。我用一个生活化类比“B树索引就像书的目录目录只告诉你某个主题在哪一页翻了目录还得再翻到正文那一页这个翻正文的动作就是回表。如果你要的内容在目录里全都能看到就不用翻正文了这就是覆盖索引。”那么真实成本是多少一张几百万行的表B树高度通常也就3层左右。走二级索引读100行大约需要3次B树查找定位再加上100次回表。如果这些数据页不在缓冲池里每一次回表都可能是一次磁盘随机读单次耗时甚至有几毫秒。100次回表累计下来很可能要几百毫秒。对比起来全表顺序读可能还更快。这就是为什么索引不能乱建更不能“见一个条件就加一个索引”。覆盖索引是解决回表问题最常用的手段。如果查询只需要user_id和order_amount而索引恰好建立在(user_id, order_amount)上那么走这个索引时直接在索引叶子里就能拿到全部要返回的列不需要回表EXPLAIN里会出现Using index。我在实际业务里优化过很多慢查询其中一大半都是靠调整索引列顺序、塞入查询列做成覆盖索引搞定的。但注意覆盖索引不是把所有列都塞进索引。索引列越多写入时的维护成本越高索引文件也越大。好的做法是只把高区分度条件和常用查询列纳入索引平衡读写。4. 写入类操作在存储引擎内部发生了什么日志、缓冲与锁前面全在讲查询但实际业务里INSERT、UPDATE、DELETE也占一半。写入操作比查询复杂得多因为它牵扯事务、崩溃恢复、并发控制任何一个环节出问题都是大事故。4.1 缓冲池、Redo日志与页面落盘执行一条UPDATE时存储引擎不会立刻把磁盘上的数据页原地覆盖掉。它会先把包含目标行的数据页从磁盘读进内存里的缓冲池在缓冲池中修改这一页同时把这次修改以追加方式记录到redo log里。等未来某个合适的时机比如检查点才把缓冲池里变脏的页面真正刷到磁盘。为什么这么绕根本原因是磁盘随机写和顺序写的性能差距太大了可能差两个数量级。直接修改磁盘上分散的数据页是随机写性能惨不忍睹而redo log是追加写属于顺序写快得多。数据库把随机修改转成顺序日志追加再异步合并脏页落盘这是经典设计。理解这个机制对排查问题很有帮助。比如你可能会看到一些调优参数把事务日志刷盘频率调低可以显著提升写入性能但代价是崩溃时可能丢失最近一小段时间内已提交的事务。对一个金融交易系统这不能接受但如果是日志型数据、报表中间表丢了还能重建那就可以权衡。我在实际业务里见过因为盲目调低刷盘参数导致数据丢失的案例所以这里必须提醒性能参数要和数据安全诉求匹配不能只看TPS。崩溃恢复的流程也值得一提。数据库重启后会对比数据页和redo log把还没落盘的已提交修改重放一遍。这个机制保证了数据库在突然断电、进程崩溃之后数据依然能恢复到崩溃前的一致性状态。4.2 锁、MVCC与并发控制事务隔离靠锁和MVCC多版本并发控制。MVCC通过undo log保留每一行的历史版本实现“快照读”。普通SELECT走的是快照读不加锁读到的是一致性的历史版本。而UPDATE、DELETE、INSERT走的是当前读需要加行锁。如果两个事务同时更新同一行后面那个事务会阻塞等待直到前一个提交或回滚。间隙锁是另一个容易出问题的地方。为了防止幻读数据库在范围查询时会锁住满足条件的记录以及它们之间的“间隙”这就是间隙锁。间隙锁本身不是坏事但如果你在一个大范围查询里开启事务却迟迟不提交它可能会锁住一大片数据导致其他正常事务全部阻塞。我排查过一次生产事故一个批量UPDATE事务因为逻辑里有个外部接口调用卡了几十秒事务一直不提交结果它锁住的区间把所有相关表的写入全部堵死业务接口瞬间雪崩。排查锁问题我会去查系统表里的事务和锁等待信息。比如通过information_schema下的事务表找到长时间运行的事务查看它的开始时间、状态、当前执行的SQL通过锁等待视图看谁在等谁。定位到阻塞源头后处理方式通常是先评估能否把那个事务安全终止再从根本上解决长事务问题——比如缩小事务范围、把外部调用移出事务、分批处理大批量更新。这里再分享一个经验长事务不只是锁的问题它还会让undo log膨胀历史版本一直无法清理导致数据库文件变大、查询变慢、主从复制延迟升高。所以监控系统里一定要有“最长运行事务时长”这个指标超过阈值就告警。5. 慢SQL排查与常见索引误区实录5.1 常见索引失效场景与原因我把平时工作中最高频的“索引好像没生效”的案例整理成一张表每一个都解释一下根因因为这些案例在业务代码里反复出现场景示例为什么索引失效隐式类型转换WHERE phone 13800138000phone是varchar数据库给每一行的phone都加隐式函数转换后再比较函数作用在索引列上索引失效对索引列使用函数WHERE DATE(create_time) 2024-01-01索引里存的是原始值不是DATE函数处理后的值无法直接匹配前导模糊匹配WHERE name LIKE %关键词%索引只能按前缀匹配头部带通配符时无法确定起始扫描位置OR连接非索引列WHERE status 1 OR create_time 2024-01-01只要有一个条件无法用索引整条SQL可能退化为全表扫描复合索引最左前缀缺失索引(a, b, c)条件只有b ?复合索引必须从最左列开始匹配缺了第一列后面的列无法利用索引关于隐式类型转换我要多说一句。很多人以为“没有报错就没问题”但实际上数据库为了比较一个varchar字段和一个数字字面量会把varchar类型的每一行都转成数字这个转换动作加在列上之后普通索引就完全失效了。我在实际业务里遇到过好几次就是因为接口层把用户ID当字符串传进来或者把手机号当数字传进来查一次慢一次。排查方法也很简单EXPLAIN看到type是ALL、rows很大再对比一下字段定义和查询条件的类型基本就锁定了。对索引列使用函数这个事还有一个常见变体日期字段存的是datetime但业务上需要按天统计很多人习惯写WHERE DATE(create_time) ...。正确写法是改成范围条件create_time 2024-01-01 AND create_time 2024-01-02这样索引才能正常工作而且逻辑上表达的意思完全一样。可能有人觉得“范围写法没有DATE函数直观”但数据库内核没有智能到能自动转换这种写法这些细节就是性能差距的来源。5.2 实测排查路线与案例复盘我处理慢SQL时通常按下面这个顺序来基本能覆盖90%的问题先确认不是LATENCY问题。也就是先看数据库整体的CPU、IO、连接数、慢查询日志排除数据库本身负载过高导致的“全员变慢”。如果整体负载高单个SQL再优化也白搭。对目标SQL执行EXPLAIN看type、key、rows、Extra判断访问路径是否合理。如果走了索引但rows仍然很大多半是索引选择率低或统计信息过期。先刷新表的统计信息再看执行计划有没有变化。统计信息刷新通常用ANALYZE TABLE语句。如果执行计划稳定但性能仍然差考虑重建索引或调整索引结构比如把单列索引改成复合索引、把查询列纳入覆盖索引。最后一步才是改写SQL。改写前要想清楚是SQL写法有问题还是优化器能力受限还是统计信息不准。改写方向一般是拆子查询、改JOIN、改条件写法、调整表连接顺序。举两个最近遇到的真实案例。第一个是订单按月统计报表。表里数据量涨到800万行后报表接口从秒级响应变成几十秒超时。EXPLAIN显示全表扫描但表在create_time上其实是有索引的优化器却压根没用上。原因在于统计信息长时间没更新优化器以为全表只有60万行走全表扫描的代价被严重低估。刷新统计信息后执行计划自动改成走create_time索引查询时间降到了几百毫秒。这个问题的根因不是SQL而是日常维护里漏了统计信息更新。第二个是登录日志查询。业务方在用户名上建了索引但查询还是慢。EXPLAIN显示走了索引typerefrows却高达几百万。我一看表结构发现用户名这一列区分度极低——大量测试账号和默认用户共用同一个用户名等值查询命中了几百万行。后来业务方加了账号来源字段建了复合索引(username, source)查询行数从几百万降到几十问题才真正解决。这个案例说明索引好不好用关键看区分度而区分度和业务数据分布强相关不能只看字段定义。最后再分享一个排查工具层面的心得很多数据库支持开启优化器跟踪可以打印出优化器每一步的代价计算过程包括为什么选这个索引、为什么放弃另一个索引。调试复杂SQL时这个信息比EXPLAIN直观看出来得更详细。排查极端疑难问题时值得打开看一眼平时没必要常开因为它有额外性能开销。我个人在实际操作中的体会是SQL写得好不好和数据库跑得快不快中间隔着一条完整的执行链路。你堆再多的代码技巧不如先弄清楚优化器在怎么想、执行引擎在怎么跑、存储引擎在怎么读。遇到慢查询不要急着加索引也不要急着改SQL先看执行计划先问一句“它为什么会这么选”。绝大多数性能问题答案都藏在“从SQL语句到数据库操作”这条链路的某个环节里。

相关新闻

2026 AI编程终极套装:Claude Code + Codex + Gemini CLI + Antigravity 实战指南

2026 AI编程终极套装:Claude Code + Codex + Gemini CLI + Antigravity 实战指南

2026 AI 编程终极套装:Claude Code Codex Gemini CLI Antigravity,四位一体实战指南! 进入2026年,AI编程工具的赛道已经从"谁家的对话窗口更聪明"卷到了"谁能让Agent在终端里、IDE里真正替你干活"的阶段。…

2026/10/16 12:50:43 阅读更多 →
QCustomPlot瀑布图绘制详解:从QCPColorMap到实时滚动实现

QCustomPlot瀑布图绘制详解:从QCPColorMap到实时滚动实现

简介:基于Qt与QCustomPlot的瀑布图实现demo,主要面向需要在Qt界面中展示数据变化过程的C开发者。demo通过随机数生成数据,完整演示了初始化绘图控件、配置坐标轴与刻度、创建QCPGraph对象、绘制矩形及连接线、调用replot刷新视图等关键流程&a…

2026/10/16 12:49:27 阅读更多 →
公共文化场馆携程评论爬取实战:反爬应对与文旅数据应用

公共文化场馆携程评论爬取实战:反爬应对与文旅数据应用

1. 项目概述:为什么一个城市图书馆的评论数据值得被系统性采集?“广州图书馆——携程评论爬取”这个标题乍看有点违和——图书馆不是政务服务平台或公共文化场馆吗?怎么会出现在携程这样的旅游预订平台上?但正是这种“反常识”的组…

2026/10/16 12:49:27 阅读更多 →

最新新闻

UNet的Pytorch实现:架构拆解、代码详解与踩坑记录

UNet的Pytorch实现:架构拆解、代码详解与踩坑记录

"UNet的Pytorch实现"——别被这个标题吓到,这其实是我最近手把手复现UNet时踩坑踩出来的完整记录。UNet在医学影像分割、卫星遥感图像处理、自动驾驶语义分割这些场景里,几乎是入门必练的骨架网络,Pytorch又是现在做深度学习实验最…

2026/10/16 15:17:37 阅读更多 →
Java工程师转型Agent工程师24周实战路线:从Spring生态到智能体编排

Java工程师转型Agent工程师24周实战路线:从Spring生态到智能体编排

1. 为什么Java老手转Agent工程师反而有天然优势 先把结论摆在前面:一个写了五六年Java后端的人,转去做Agent Engineer,起点比大多数从零起步的人要高得多。这不是安慰话,是我自己从Spring生态一路摸到Agent编排之后最真实的感受。…

2026/10/16 15:17:37 阅读更多 →
AiPy:一句话生成PPT,五步高效工作流详解

AiPy:一句话生成PPT,五步高效工作流详解

说出来可能有点凡尔赛:半年前我还在为了汇报 PPT 的排版加班到凌晨,现在用 AiPy 生成一份像样的 PPT,只需要一句指令加十五秒等待。我说的 AiPy,不是某个只能聊天的对话工具,而是一个把「自然语言 → 结构化大纲 → 完…

2026/10/16 15:17:37 阅读更多 →
Debian 10.6 + Xfce 桌面安装实战:从镜像到优化全攻略

Debian 10.6 + Xfce 桌面安装实战:从镜像到优化全攻略

1. 装之前先想清楚:你适合哪种 Debian 10.6 Xfce 组合很多人一听“Debian”就头大,觉得那是服务器系统,命令行黑漆漆的。但 Debian 10.6(代号沿用 Buster 系列的第六个维护更新)其实完全可以作为日常桌面使用&#xf…

2026/10/16 15:17:37 阅读更多 →
SpringBoot+Vue林业产品推荐系统毕设项目:前后端分离与协同过滤算法实践

SpringBoot+Vue林业产品推荐系统毕设项目:前后端分离与协同过滤算法实践

毕设选题季一到,后台私信里问得最多的就是“有没有一个能拿得出手、工作量适中、技术栈又主流的项目”。我通常第一反应就是推荐SpringBootVue这套前后端分离的组合——如果再给它安上一个“推荐系统”的业务场景,那基本就是一石三鸟:技术栈够…

2026/10/16 15:17:37 阅读更多 →
手写工业级顺序表:内存布局、动态扩容与边界安全实现

手写工业级顺序表:内存布局、动态扩容与边界安全实现

1. 项目概述:为什么今天还要手写一个顺序表? “实现一个顺序存储的线性表”——看到这个标题,很多刚学数据结构的朋友第一反应是:“这不就是教科书第一章的内容吗?C语言里用个数组不就完事了?” 但我在某高…

2026/10/16 15:16:35 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →