SQL数据库跟踪工具实战:从慢查询定位到性能优化闭环
简介SQL数据库跟踪工具是一套面向数据库管理员与开发者的实用学习资料聚焦SQL Server环境下的活动监测、性能分析与安全审计。资源围绕数据库结构逆向说明、SQL语句读写跟踪、性能瓶颈定位及合规审计等场景展开帮助读者理解Profiler、Extended Events及第三方监控工具的使用思路。压缩包共28个文件约71KB以C#源码.cs与窗体资源.resx为主体辅以可执行程序、项目文件、配置与清单文件构成一个可编译运行的跟踪工具示例工程便于对照代码理解跟踪逻辑与界面实现。目前已有1116人学习下载。通过源码、配置模板与项目结构读者可掌握跟踪工具的搭建方式、事件采集与结果分析方法并借鉴其排错与优化思路提升数据库监控与故障排查的实战能力。1. SQL数据库跟踪工具为什么慢查询总在凌晨三点爆发你有没有遇到过这种情况白天系统跑得好好的一到凌晨批量任务上来数据库 CPU 直接飙到 90%早上到工位只看到一堆超时告警却完全不知道昨晚发生了什么。SQL数据库跟踪工具就是为这种场景准备的——它把数据库内部正在执行的语句、等待事件、锁竞争、执行计划原原本本记录下来让你事后能像看监控回放一样定位问题。它适合后端开发、DBA、运维工程师尤其是那些线上库不敢随便开慢日志、又急需知道“到底哪条 SQL 在拖后腿”的团队。我见过太多人只靠SHOW PROCESSLIST抓现场结果手速永远赶不上问题消失的速度。跟踪工具的核心价值不是“看”而是“留痕”——把转瞬即逝的数据库行为变成可检索、可对比、可复现的数据。这一篇就按我实际落地的顺序从选型到跑通再到避坑把 SQL 数据库跟踪这件事讲透。2. 先搞清楚跟踪什么语句、等待、锁还是执行计划2.1 跟踪粒度的四个层次很多人一上来就问“用哪个工具”其实更该先问“我要跟踪什么”。SQL 数据库跟踪大致分四个粒度层次选错了后面全是无用数据。第一层是语句级跟踪只记录执行了哪些 SQL、耗时多少、返回行数。这是最轻量的对性能影响最小适合长期开启做趋势分析。第二层是等待事件跟踪记录每条语句在等什么——等 IO、等锁、等网络、等 CPU。这一层能解释“为什么慢”但数据量会大很多。第三层是锁与阻塞链跟踪专门抓谁堵了谁、阻塞持续多久适合排查并发写入问题。第四层是执行计划跟踪把优化器实际选择的计划抓下来用于对比计划漂移。我一般的做法是生产环境长期开第一层出问题时临时开第二层和第三层第四层只在复现环境开。四层全开在生产库上基本等于给自己埋雷。2.2 内置跟踪能力对比不同数据库的抓手不一样不同数据库自带的跟踪手段差异很大选型前必须确认你的库支持什么。下面这张表是我整理过的常见能力对照注意这里说的是数据库自身提供的能力不涉及任何第三方商业产品。跟踪能力轻量内置方式重量内置方式对性能影响语句耗时慢查询日志全量语句审计低 / 中高等待事件性能视图采样事件追踪会话中 / 高锁阻塞锁等待视图阻塞链追踪低 / 中执行计划计划缓存查询实时计划捕获低 / 中高轻量方式通常是查系统视图或读日志文件重量方式是开启专门的追踪会话。我的经验是能查视图就别开会话能采样就别全量。很多团队一上来就开全量追踪结果数据库本身被追踪拖垮这就本末倒置了。2.3 选型前必须确认的三个前提在动手之前先确认三件事否则后面一定翻车。第一确认权限。跟踪工具通常需要较高的系统权限比如查看所有会话、读取性能视图。如果只有普通业务账号很多跟踪视图是空的。第二确认存储。跟踪数据写到哪里写本地文件要考虑磁盘轮转写表要考虑表空间增长。我见过追踪表把数据盘写满导致主库不可用的案例。第三确认保留周期。跟踪数据留多久留太短查不到历史留太久存储爆炸。一般建议语句级留 7 到 15 天详细追踪按需开启、用完即关。提示在正式库开启任何跟踪之前先在测试库跑一遍完整流程记录开启前后的 CPU、IO 和延迟变化心里有数再上生产。3. 用系统视图搭一套最小可用跟踪从开启到查询3.1 开启语句级跟踪的最小配置以常见的关系型数据库为例语句级跟踪最稳妥的方式是开启慢查询日志并配合性能视图采样。下面是一段配置示例具体参数名按你所用数据库调整逻辑是通用的。-- 开启慢查询记录阈值设为 1 秒 -- 不同数据库参数名不同这里用通用写法示意 SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1; SET GLOBAL log_output TABLE; -- 输出到表方便 SQL 查询 -- 确认是否生效 SHOW VARIABLES LIKE slow_query_log%; SHOW VARIABLES LIKE long_query_time;这段配置做了三件事打开慢查询开关、把阈值设为 1 秒、把输出定向到表而不是文件。输出到表的好处是可以用 SQL 直接过滤和聚合坏处是表会持续增长必须配清理任务。阈值 1 秒是折中值太低了日志量爆炸太高了抓不到问题。如果你的库 QPS 很高建议从 2 秒起步观察一天再往下调。3.2 用性能视图抓当前正在执行的语句慢查询日志是事后记录性能视图能看当下。下面这段查询用来抓当前活跃会话和它们正在执行的语句。-- 查询当前活跃会话及其执行语句 -- 过滤掉空闲会话只看真正在跑的 SELECT session_id, user_name, status, cpu_time_ms, elapsed_time_ms, sql_text FROM performance_schema.active_sessions WHERE status ! idle ORDER BY elapsed_time_ms DESC LIMIT 20;逻辑说明从活跃会话视图里过滤掉空闲连接按已耗时降序排列取前 20 条。关键参数是status ! idle不加这个条件会把大量空闲连接混进来。elapsed_time_ms是语句从开始到现在的总耗时cpu_time_ms是实际消耗的 CPU 时间。如果一条语句 elapsed 很高但 cpu 很低说明它在等 IO 或等锁这时候就要往等待事件方向查。3.3 把跟踪数据落到一张可查询的表光看实时视图不够要把数据沉淀下来做趋势分析。下面建一张跟踪汇总表用定时任务把慢查询日志聚合进去。-- 创建跟踪汇总表 CREATE TABLE sql_trace_summary ( id BIGINT AUTO_INCREMENT PRIMARY KEY, sql_fingerprint VARCHAR(512) NOT NULL, -- SQL 指纹去掉具体参数值 exec_count INT DEFAULT 0, -- 执行次数 avg_time_ms DECIMAL(10,2) DEFAULT 0, -- 平均耗时 max_time_ms DECIMAL(10,2) DEFAULT 0, -- 最大耗时 total_rows_examined BIGINT DEFAULT 0, -- 总扫描行数 first_seen DATETIME, -- 首次出现时间 last_seen DATETIME, -- 最近出现时间 INDEX idx_fingerprint (sql_fingerprint), INDEX idx_last_seen (last_seen) ); -- 从慢查询日志表聚合写入 INSERT INTO sql_trace_summary (sql_fingerprint, exec_count, avg_time_ms, max_time_ms, total_rows_examined, first_seen, last_seen) SELECT sql_fingerprint, COUNT(*), AVG(query_time * 1000), MAX(query_time * 1000), SUM(rows_examined), MIN(start_time), MAX(start_time) FROM slow_query_log_table WHERE start_time NOW() - INTERVAL 1 HOUR GROUP BY sql_fingerprint ON DUPLICATE KEY UPDATE exec_count exec_count VALUES(exec_count), avg_time_ms (avg_time_ms VALUES(avg_time_ms)) / 2, max_time_ms GREATEST(max_time_ms, VALUES(max_time_ms)), last_seen VALUES(last_seen);这张表的核心是sql_fingerprint字段也就是 SQL 指纹。同一个查询模式带不同参数指纹相同这样聚合才有意义。ON DUPLICATE KEY UPDATE保证重复指纹是累加而不是重复插入。注意avg_time_ms这里用了简单平均生产环境更严谨的做法是按执行次数加权但作为第一版够用了。定时任务建议每 5 分钟跑一次每次只处理最近 1 小时的数据避免全表扫描。3.4 用聚合结果定位 Top 问题 SQL数据落表之后定位问题就是一句 SQL 的事。-- 找出最近 24 小时内总耗时最高的 10 条 SQL SELECT sql_fingerprint, exec_count, avg_time_ms, max_time_ms, total_rows_examined, (exec_count * avg_time_ms) AS total_time_ms FROM sql_trace_summary WHERE last_seen NOW() - INTERVAL 24 HOUR ORDER BY total_time_ms DESC LIMIT 10;这里按exec_count * avg_time_ms排序也就是总耗时而不是单次耗时。原因很简单一条单次 50ms 但每秒执行 1000 次的 SQL对系统的影响远大于一条单次 5 秒但一天只跑一次的报表 SQL。很多人排查时只盯着最慢的那条结果优化完发现系统没变化就是因为没算总账。total_rows_examined用来判断扫描行数是否异常如果一条简单查询扫描了几百万行基本可以确定索引有问题。4. 跟踪工具避坑五条血泪经验4.1 坑一全量追踪把生产库拖垮现象开启全量语句追踪后数据库 CPU 从 40% 涨到 85%业务开始超时。原因全量追踪会记录每一条语句的完整信息包括参数值和执行计划写入开销极大。在高 QPS 场景下追踪本身的写入量可能超过业务写入量。解决永远不要在生产库开全量追踪。用采样代替全量比如只记录耗时超过阈值的语句或者按 1% 概率采样。如果必须全量先在从库上开或者用专门的追踪实例。4.2 坑二追踪表把磁盘写满现象凌晨收到磁盘空间告警追踪表所在分区 100% 占用数据库无法写入。原因追踪数据只进不出没有配清理任务。一条高频 SQL 每秒产生一条记录一天就是 86400 条一个月就是 260 万条。解决建表时就配好分区或定时清理。我一般用按天分区保留 7 天每天凌晨自动 drop 最旧分区。如果数据库不支持分区就写一个定时任务每天删除 7 天前的数据。清理任务本身要监控别清理任务挂了没人知道。4.3 坑三SQL 指纹把不同语句混为一谈现象聚合结果里某条指纹总耗时极高但点进去看具体语句发现是几条完全不同的查询被归到了一起。原因指纹算法对字面量替换过于激进把结构不同的 SQL 也算成了同一个指纹。比如WHERE id 1和WHERE id 1 OR 11可能被归为同一类。解决检查指纹算法的规则确认它只替换字面量而不改变语句结构。如果内置指纹不满足需求可以在应用层自己做归一化比如把数字和字符串统一替换为占位符但保留 SQL 关键字和表名。归一化之后先人工抽查一批确认归类合理再上线。4.4 坑四只看平均耗时漏掉长尾现象某条 SQL 平均耗时 10ms看起来完全正常但用户偶尔反馈超时。原因平均值掩盖了长尾。这条 SQL 99% 的请求是 1ms但 1% 的请求是 2 秒平均下来就是 10ms 出头。那 1% 才是真正影响体验的。解决跟踪数据里必须保留最大值和分位数。至少要有 P95 和 P99有条件的话加上 P999。查询时不要只看 avg要把 max 和分位数一起看。如果某条 SQL 的 P99 远高于 avg说明存在偶发性的资源竞争或计划漂移要重点查。4.5 坑五开了追踪忘了关现象排查完问题后忘记关闭详细追踪一周后发现追踪数据量是业务数据的十倍。原因详细追踪通常是临时开启的但排查完问题后注意力转移到别处没人记得关。解决开启详细追踪时同时设一个自动关闭时间比如 2 小时后自动关闭。或者把开启和关闭做成一个脚本开启时在日历上设一个提醒。我自己的习惯是任何临时开启的追踪开启命令和关闭命令写在同一个脚本里用at命令定时执行关闭这样就算忘了也有兜底。5. 从跟踪到优化把数据变成索引和改写5.1 用跟踪数据反推缺失索引跟踪数据里最有价值的信息之一是rows_examined和实际返回行数的比值。如果一条 SQL 扫描了 10 万行但只返回 10 行说明索引选择性极差或者根本没走索引。-- 找出扫描行数远大于返回行数的 SQL SELECT sql_fingerprint, exec_count, avg_time_ms, total_rows_examined, total_rows_sent, CASE WHEN total_rows_sent 0 THEN total_rows_examined ELSE total_rows_examined / total_rows_sent END AS examine_ratio FROM sql_trace_summary WHERE last_seen NOW() - INTERVAL 24 HOUR AND total_rows_examined 10000 ORDER BY examine_ratio DESC LIMIT 20;examine_ratio大于 1000 的基本都可以判定为索引问题。拿到指纹后去查对应的完整 SQL看 WHERE 条件和 ORDER BY 字段判断该建什么索引。注意不要盲目加索引每个索引都有写入开销加之前先确认这条 SQL 的执行频率和总耗时占比。5.2 用等待事件判断是 IO 问题还是锁问题如果一条 SQL 耗时高但 CPU 时间低就要看等待事件。下面这段查询把语句和等待事件关联起来。-- 关联语句和等待事件 SELECT s.sql_fingerprint, s.avg_time_ms, w.event_name, w.total_wait_ms, w.wait_count FROM sql_trace_summary s JOIN wait_event_summary w ON s.sql_fingerprint w.sql_fingerprint WHERE s.last_seen NOW() - INTERVAL 1 HOUR AND w.total_wait_ms 1000 ORDER BY w.total_wait_ms DESC;如果等待事件集中在 IO 相关比如读文件、读磁盘说明需要优化存储或加缓存。如果集中在锁相关比如行锁、表锁说明并发写入有冲突要考虑调整事务粒度或隔离级别。这一步的关键是把“慢”翻译成“等什么”翻译对了优化方向就明确了。5.3 建立跟踪到优化的闭环跟踪本身不是目的闭环才是。我的做法是每周跑一次跟踪汇总输出三个清单总耗时 Top 20、扫描行数异常 Top 20、等待事件 Top 10。然后逐个评估能加索引的加索引能改写 SQL 的改写能加缓存的加缓存。改完之后下一周对比同一指纹的 avg_time_ms 和 exec_count确认优化生效。这个闭环里最容易忽略的是验证环节。很多人改完索引就不管了结果索引没被用上或者用上了但效果不如预期。跟踪数据的好处就是可以前后对比同一指纹的耗时变化一目了然。如果改完一周后 avg_time_ms 没降要么索引没建对要么问题不在索引上得回到等待事件重新分析。注意优化之前先备份执行计划。有些数据库在加索引后优化器会选错计划导致原本快的 SQL 变慢。保留优化前的计划出问题能快速回滚。6. 跟踪数据的进阶用法基线与异常检测跟踪数据攒够两周之后就可以做基线了。所谓基线就是每条 SQL 指纹在正常情况下的耗时范围。有了基线异常检测就不需要人盯着看了。具体做法是按天聚合每条指纹的 avg_time_ms 和 P99算出过去 14 天的均值和标准差。当天数据超过均值加三倍标准差就标记为异常。下面是一个简化的检测查询。-- 基于 14 天基线检测当天异常 SQL WITH baseline AS ( SELECT sql_fingerprint, AVG(daily_avg_ms) AS base_avg, STDDEV(daily_avg_ms) AS base_std FROM ( SELECT sql_fingerprint, DATE(last_seen) AS day, AVG(avg_time_ms) AS daily_avg_ms FROM sql_trace_summary WHERE last_seen NOW() - INTERVAL 14 DAY AND last_seen CURDATE() GROUP BY sql_fingerprint, DATE(last_seen) ) daily GROUP BY sql_fingerprint HAVING COUNT(*) 7 -- 至少 7 天数据才建基线 ) SELECT t.sql_fingerprint, t.avg_time_ms AS today_avg, b.base_avg, b.base_std, (t.avg_time_ms - b.base_avg) / NULLIF(b.base_std, 0) AS z_score FROM sql_trace_summary t JOIN baseline b ON t.sql_fingerprint b.sql_fingerprint WHERE t.last_seen CURDATE() AND (t.avg_time_ms - b.base_avg) / NULLIF(b.base_std, 0) 3 ORDER BY z_score DESC;这段查询的逻辑是先用过去 14 天不含今天的数据算出每条指纹的日均耗时均值和标准差然后拿今天的平均耗时去比z_score 大于 3 的判为异常。HAVING COUNT(*) 7是为了过滤掉数据太少的指纹数据太少算出来的基线不可靠。NULLIF防止标准差为零时除零错误。这个检测跑起来之后每天早上看一眼异常列表就行不用再人工翻慢查询日志。我自己的习惯是把结果推送到内部告警渠道z_score 超过 5 的立即看3 到 5 的当天处理。这样既不会漏掉问题也不会被噪音淹没。最后说一个我踩过的坑基线不是一成不变的。业务增长、数据量变化、版本升级都会让基线漂移。所以基线要滚动更新永远用最近 14 天而不是固定某段时间。另外大促或批量任务期间要临时放宽阈值否则告警会爆掉。跟踪工具的价值不在于它记录了多少数据而在于你能不能从数据里读出系统正在发生什么。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

极大似然法原理与Python实现:从概率建模到参数估计实战

极大似然法原理与Python实现:从概率建模到参数估计实战

简介:在数据分析与机器学习中,参数估计是连接概率模型与观测数据的核心桥梁。极大似然估计(MLE)作为一种经典统计推断方法,通过最大化似然函数来寻找最能解释当前样本的模型参数,广泛应用于分布拟合、回归建…

2026/10/9 13:27:13 阅读更多 →
DDIA核心精讲:存储引擎、复制分区与流处理选型实战

DDIA核心精讲:存储引擎、复制分区与流处理选型实战

简介:这份资源是《设计数据密集型应用程序》(DDIA)中文翻译版,面向全栈工程师、架构师、DBA及资深开发者,帮助读者系统理解数据密集型应用从底层数据结构到顶层架构设计的核心知识。内容涵盖分布式系统、数据库原理与架…

2026/10/9 13:27:13 阅读更多 →
随机森林时间序列预测实战:从滑动窗口到特征工程的完整指南

随机森林时间序列预测实战:从滑动窗口到特征工程的完整指南

简介:这是一份面向时间序列预测场景的Python完整实现,以RF算法为核心,附带训练与测试所需的CSV数据集,适合计算机、电子信息、数学等专业学生在课程设计、期末大作业或毕业设计中直接参考。代码在Anaconda和PyCharm环境下运行&…

2026/10/9 13:27:13 阅读更多 →

最新新闻

试题库管理系统开发实战:数据库设计、自动组卷与权限模型解析

试题库管理系统开发实战:数据库设计、自动组卷与权限模型解析

简介:本资源为基于Qt与C开发的高校试题库管理系统课程设计完整资料包,面向计算机相关专业学生及需要完成数据库课程设计、管理信息系统开发实践的学习者。资源按照软件工程流程推进,覆盖需求分析、概念与逻辑结构设计、SQL建库建表、系统界面…

2026/10/9 14:07:13 阅读更多 →
de4dot-netcore 实战:.NET Core 程序集反混淆与避坑指南

de4dot-netcore 实战:.NET Core 程序集反混淆与避坑指南

简介:de4dot-netcore 版本是面向.NET Core 环境的脱壳工具,专为安全研究人员与逆向工程师打造,用于剥离 ConfuserEx、DNEmu、Themida、.NET Reactor 等常见保护壳,还原未经混淆的原始可执行文件,便于静态或动态分析。资…

2026/10/9 14:07:12 阅读更多 →
电子报纸订购系统数据库设计:课设中的真实业务数据建模

电子报纸订购系统数据库设计:课设中的真实业务数据建模

简介:本资源是一份面向高校数据库课程设计实践的完整说明书文档,适用于计算机相关专业本科生开展电子报纸订购系统开发项目。内容覆盖需求分析、数据流图绘制、概念与逻辑结构设计、关系模式构建、子系统实现(订购/统计/管理)及系…

2026/10/9 14:07:12 阅读更多 →
数据库习题解析:从SQL错题到生产级查询能力跃迁

数据库习题解析:从SQL错题到生产级查询能力跃迁

简介:本资源是《数据库原理和应用教程(第4版)》配套的习题参考答案与解析PDF,面向高校计算机、信息管理等专业本科生及数据库初学者,旨在系统巩固数据库核心理论与解题能力。内容覆盖数据库发展三阶段、DBMS组成与功能…

2026/10/9 14:07:11 阅读更多 →
Mendeley文献管理实战:从安装配置到Word引用与避坑指南

Mendeley文献管理实战:从安装配置到Word引用与避坑指南

1. 为什么我最终把文献管理交给了这款工具写论文这件事,最折磨人的环节往往不是实验做不出来,也不是数据分析跑不通,而是参考文献。我见过太多同行的桌面:几十个PDF文件散落在不同文件夹里,命名规则五花八门&#xff0…

2026/10/9 14:07:11 阅读更多 →
工资管理系统数据库设计:从课程作业到企业级HR建模

工资管理系统数据库设计:从课程作业到企业级HR建模

简介:本资源是一份面向高校信息管理与信息系统专业本科生的数据库课程设计报告,聚焦工资管理系统的全流程数据库设计与实现,帮助学习者掌握从需求分析到运行维护的完整工程实践能力。报告严格遵循数据库设计规范,系统覆盖引言、需…

2026/10/9 14:06:10 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →