MySQL8.0索引调优实战:从慢SQL到执行计划与联合索引设计
前两天同事跑过来说线上有个查询要三秒多问我是不是加个索引就行。我让他先EXPLAIN一下结果typeALLrows直接奔着四百万去。后来在(shop_id, status, created_at)上加了一个联合索引三秒变成二十毫秒。这种案例在MySQL8.0索引调优的时候几乎每周都能遇到。做SQL优化这么多年我最深的体会是慢SQL十有八九不是执行器慢而是优化器选错了执行计划。索引调优不是上来就加索引而是顺着SQL的真实执行路径去定位问题再决定加什么索引、怎么改SQL。这篇文章不会只讲概念我会把从发现问题、读懂执行计划到设计索引、处理深分页和JOIN优化这一整套思路拆开来说。不管你是在Linux上直接装的MySQL8.0还是用Docker跑起来的只要业务在这个版本上索引调优和SQL优化的逻辑都是一样的。后端开发、DBA、运维都能照着操作尤其适合被慢SQL折磨过、但又不知道从哪里下手的同学。1. 慢SQL是怎么发生的先定位瓶颈再动手很多人一遇到查询慢第一反应就是“加索引”。这个想法没错但是忽略了一个前提你得先搞清楚SQL慢在哪个环节。否则很容易出现加了个索引用不上或者明明走索引了还是慢半拍的情况。1.1 MySQL执行一条SQL的完整路径一条SELECT语句从客户端发到MySQL大概要经过四个阶段连接器负责权限校验和连接管理分析器做词法语法解析优化器负责生成执行计划最后才是执行器调存储引擎接口取数。慢SQL的问题大多数出在优化器这一层。优化器要根据表结构、索引、统计信息、数据分布来决定走哪个索引、怎么关联、是否排序一旦它的判断基于错误信息后续执行就会跟着遭殃。所以排查的时候我第一件事永远是看执行计划而不是盯着慢查询日志里的耗时数字发呆。1.2 全表扫描的代价到底有多大先算一笔账。假设有一张100万行的订单表每行平均200字节InnoDB默认页大小是16KB一个页大约能装80行。全表扫描要读大约12500个页也就是差不多200MB的数据。如果你是机械硬盘顺序读可能还好但遇到回表或者随机读场景性能会非常难看。即便在SSD上全表扫描也没有任何查询优化空间因为每一行都要过一遍。数据量再涨上去这条路根本走不通。所以索引最核心的价值就是把“我要翻遍整本书”变成“我直接翻到目录那一页”。1.3 索引不是越多越好这里得泼一盆冷水。每增加一个索引写入和更新时就要多维护一棵B树代价是实打实的。一个表搞七八个索引写入慢不说还容易让优化器在选择时犯迷糊。我见过一个项目某张表上建了三个包含相同首列的索引比如idx_a、idx_a_b、idx_a_b_c其实前两个在绝大多数场景下都是冗余的。删掉冗余索引后写入性能明显回升。记住一个原则索引是为查询服务的不是为“看着专业”服务的。上线前花几分钟检查一下冗余索引回报率很高。2. 索引选择的底层原理从B树到回表想做好索引调优光会建索引不行得理解InnoDB为什么这么设计。很多表面上的“玄学”问题追到底层之后其实都是数据结构问题。2.1 为什么InnoDB选择B树而不是哈希表哈希表做等值查询确实快O(1)复杂度但它对范围查询无能为力也没法排序。B树虽然也能做范围查询但它的每个节点既存数据又存索引树会变得矮胖但非叶子节点能存的索引条目就少了。B树把数据全部放在叶子节点非叶子节点只存索引键和指针一层能放更多条目树更矮I/O次数更少。更重要的是B树的叶子节点之间用链表串起来了天然支持范围查询和顺序扫描。像WHERE create_time BETWEEN 2024-01-01 AND 2024-01-31这种条件B树只要找到起点顺着链表往后读就行对磁盘顺序I/O非常友好。2.2 回表查询与覆盖索引的取舍InnoDB的二级索引叶子节点存的不是整行数据而是“索引列 主键值”。如果SQL要的字段在二级索引里找不到就得拿着主键去聚簇索引里查完整行这个动作叫回表。回表是随机I/O行数一多性能就崩。所以就有了覆盖索引的理念让索引覆盖SQL所需的全部字段查询就不需要回表了。最简单的例子-- 假设有索引 (name) SELECT id, name FROM user WHERE name 张三;如果索引是(name, id)那这个查询直接扫描二级索引就能拿到全部字段Extra里会显示Using index。这就是为什么我经常建议别用SELECT *按需取列既减少网络传输又有机会命中覆盖索引。2.3 联合索引的设计与最左前缀原则联合索引不是简单地把几个列拼在一起它的排序逻辑是先按第一列排序再按第二列排序。所以查询条件里如果不包含最左列索引通常走不了这就是最左前缀原则。举个例子索引(shop_id, status, created_at)WHERE shop_id 1能走索引WHERE shop_id 1 AND status 2能走索引WHERE shop_id 1 AND status 2 AND created_at 2024-01-01能走索引WHERE status 2 AND created_at 2024-01-01走不了因为跳过了shop_id设计联合索引时我的习惯是把等值条件放在前面范围条件放后面。比如status是枚举值等值场景多就放前面created_at一般用于范围筛选放后面。反过来会导致范围条件后面的列无法用于过滤等于白建。3. 用EXPLAIN读懂执行计划执行计划就是SQL在MySQL里“打算怎么跑”的路线图。看不懂执行计划索引调优就是盲人摸象。这一章我把最关键的几个字段讲清楚。3.1 执行计划核心字段说明用EXPLAIN SELECT ...会得到一张表。重点关注这几个字段type访问类型从好到差依次是system、const、eq_ref、ref、range、index、ALL。看到ALL基本就是全表扫描是首要优化对象。key实际用到的索引。如果为NULL说明没走索引。key_len用到的索引字节数可以算出哪些索引列真正参与过滤。rows优化器预估需要扫描的行数这个值越接近实际结果集越健康。Extra经常出现Using filesort、Using temporary、Using index等提示。前两个通常意味着性能隐患Using index则是好事。下面这张表是我常用的参考type含义是否理想system表只有一行极佳const主键或唯一索引等值查询极佳eq_ref被驱动表通过唯一索引关联极佳ref通过普通索引等值查询良好range索引范围扫描可接受index全索引扫描一般ALL全表扫描需要优化3.2 一条SQL从慢到快的执行计划对比之前调过一条统计SQL原来是这样SELECT order_id, amount FROM orders WHERE status 1 ORDER BY created_at DESC LIMIT 10;表里有200万行status字段分布很不均匀只有2%的行是status1。EXPLAIN显示typeALLrows是200万Extra里还有Using filesort意思是要先把200万行扫一遍再全部排序取10行慢是必然的。后来加了联合索引(status, created_at)执行计划变成typerefrows降到4万Using filesort也消失了。原因很简单索引先按status过滤再按created_at排好序MySQL扫描到第10条就能停了。这中间有个细节为什么不只建status单列索引因为单列索引虽然能过滤status但created_at的排序还是得交给filesort。联合索引让排序字段也在索引里直接省掉一次排序操作。执行计划里key_len的变化也能验证这一点。4. 实战四个典型慢SQL优化案例理论说完了来看几个真实场景。这些SQL模式在业务代码里出现频率极高每一种我都踩过坑。4.1 隐式转换和函数操作让索引白建用户表有个mobile字段类型是VARCHAR(20)上面建了索引。业务代码里经常这么查SELECT * FROM user WHERE mobile 13800138000;表面看没问题但mobile是字符串拿数字跟它比MySQL会自动把字符串转成数字导致索引列上发生隐式转换索引直接失效。EXPLAIN一看typeALL。改成WHERE mobile 13800138000之后立刻变成ref。这个坑特别隐蔽尤其是从接口层拿到的参数是数字类型时很容易中招。同理下面的SQL也是典型的“索引杀手”SELECT * FROM order WHERE DATE(created_at) 2024-06-01;DATE()函数套在索引列上索引就没法用了。优化思路不是建函数索引8.0支持函数索引但毕竟有额外成本而是改成范围查询SELECT * FROM order WHERE created_at 2024-06-01 00:00:00 AND created_at 2024-06-02 00:00:00;这样created_at上的普通索引就能正常走range扫描效率天差地别。4.2 深分页查询的延迟关联优化分页是个老话题但很多人只优化到“表里有索引”就停止了。一行代码SELECT * FROM orders ORDER BY created_at DESC LIMIT 1000000, 20;这条SQL哪怕created_at上有索引也会慢得离谱。因为MySQL必须从头扫到第1000020行然后再扔掉前100万行。扫描和回表的成本都花在了“不需要返回”的数据上。我用过最有效的方案是延迟关联先覆盖索引查出主键再回表拿完整行SELECT t.* FROM orders t INNER JOIN ( SELECT id FROM orders ORDER BY created_at DESC LIMIT 1000000, 20 ) tmp ON t.id tmp.id;子查询只查id配合(created_at, id)覆盖索引MySQL扫描100万行时不需要回表代价小很多。外层再按主键回表20行整体耗时会从秒级降到百毫秒级。如果业务上允许还可以用游标分页替代深分页SELECT * FROM orders WHERE created_at 上一次的最大值 ORDER BY created_at DESC LIMIT 20;这种方案把随机跳页的能力换成了“下一页”换来的是线性性能在高并发场景下非常推荐。4.3 JOIN关联查询的驱动表选择多表关联查询变慢常见原因是被关联字段没有索引或者驱动表选错了。MySQL一般会选小表作为驱动表用小表的结果集去匹配大表。看一条常见SQLSELECT u.name, o.amount FROM orders o JOIN users u ON o.user_id u.id WHERE o.status 1;如果orders.user_id没有索引优化器只能对orders全表扫描然后对每一行去users主键匹配效率要看驱动表大小。后来在orders.user_id上加了个普通索引执行计划从Using join buffer变成了ref查询时间下降了80%以上。这里有个很实用的套路JOIN的关联字段类型一定要一致否则跟隐式转换一样会让索引失效。user_id在A表是INT在B表是VARCHAR就算两边都有索引也未必能用上。另外join_buffer_size这类参数不是调得越大越好它只是辅助手段治标不治本。4.4 UPDATE和DELETE也可能慢在索引上很多人以为只有SELECT才需要优化索引其实大范围的UPDATE/DELETE同样会拖垮数据库。原因有两个一是定位需要更新的行时走了全表扫描二是更新范围太大锁了太多行还让undo log膨胀。我之前处理过一个清理任务DELETE FROM logs WHERE created_at 2024-01-01;这表有几千万行直接跑下去锁的范围巨大主从延迟飙到十几分钟。后来改成按主键分批处理DELETE FROM logs WHERE id IN ( SELECT id FROM logs WHERE created_at 2024-01-01 ORDER BY id LIMIT 1000 );循环执行每批只删1000行加上索引(created_at)快速定位数据整个清理过程对线上业务几乎没有影响。几条简单的启发大批量写操作永远要拆批拆批之后永远要走索引定位这两点同时满足性能就不会太差。4.5 窗口函数好用但别让它裸奔MySQL8.0带来了窗口函数写排名、累计求和方便了不少。但窗口函数如果涉及全表排序没有合适的索引支撑一样会慢。比如按用户算订单排名SELECT user_id, order_id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn FROM orders;如果没有(user_id, created_at)联合索引这个查询必然要对全表做一次临时表和排序。加上联合索引后PARTITION BY和ORDER BY都能直接复用索引顺序Extra里不再出现Using temporary; Using filesort。这算是我在MySQL8.0上最常给业务方推荐的一个优化点。5. MySQL8.0的新特性在调优里的实际价值MySQL8.0不只是加了窗口函数和CTE索引层面也更新了几个非常有用的能力。用好它们能解决很多老版本里只能绕路的问题。5.1 降序索引真正支持反向排序的索引老版本的MySQL虽然能写INDEX (a DESC)但实际存储还是升序遇到混合排序就会走filesort。比如SELECT * FROM product ORDER BY price DESC, created_at ASC LIMIT 10;在MySQL8.0里可以建一个真正的降序索引ALTER TABLE product ADD INDEX idx_price_created (price DESC, created_at ASC);建完之后ORDER BY里的排序方式完全由索引提供Extra里的Using filesort消失。这个优化的典型场景就是商品列表、秒杀列表这类“价格从高到低、时间从旧到新”的排序需求。5.2 不可见索引安全验证索引价值在MySQL8.0里可以把索引设置为不可见优化器完全忽略它但索引本身还在维护ALTER TABLE orders ALTER INDEX idx_old INVISIBLE;我经常用它来验证“这个索引到底有没有被用到”。如果设为不可见之后线上一切正常查询性能没有波动说明这个索引就是冗余的可以彻底删除。反之则赶紧设回VISIBLE。这比直接删索引安全太多尤其是面对不敢轻举妄动的生产环境。需要注意主键索引和唯一约束依赖的索引不能被设为不可见否则会破坏数据约束。5.3 直方图优化器的数据分布盲区MySQL优化器默认假设数据分布是均匀的但现实往往是80%的数据集中在少数几个值上。字段status可能90%都是1优化器会高估WHERE status 2的返回行数从而选错索引。MySQL8.0支持给字段建直方图ANALYZE TABLE orders UPDATE HISTOGRAM ON status WITH 100 BUCKETS;直方图能告诉优化器这个字段的数据分布让它更准确地估算rows和成本。这跟索引是两回事索引改变的是访问路径直方图改变的是优化器的“判断依据”。两者配合使用效果最佳。5.4 EXPLAIN ANALYZE真实执行看每一行的代价MySQL8.0.18开始支持EXPLAIN ANALYZE它不只是展示预估计划而是真的把SQL跑一遍输出每步操作的实际耗时、扫描行数、返回行数。EXPLAIN ANALYZE SELECT * FROM orders WHERE status 1 ORDER BY created_at DESC LIMIT 10;输出里能看到actual time和actual rows跟优化器预估的对比一下能很快发现统计信息偏差。但要记住它会让SQL真实执行生产环境遇到大查询千万别直接跑。6. 常见问题与排查技巧实录最后把日常调优中反复踩过的坑整理成速查表照着排查就能解决大部分问题。6.1 索引失效高频场景速查场景原因解决方案WHERE name LIKE %关键词%前模糊查询无法使用索引改后模糊或改用全文索引WHERE DATE(create_time) ...函数作用在索引列上改成范围条件WHERE mobile 138...隐式类型转换参数类型与字段类型保持一致WHERE a 1 OR b 2多条件OR导致无法走索引拆分成两个查询UNION或改INWHERE status IS NOT NULLNULL值使索引判定复杂化设计时避免可空列联合索引跳过了首列违反最左前缀原则调整SQL或增加对应索引6.2 索引生效了但还是慢大概率是这几个原因第一种是选择性太低。比如gender字段只有男女两个值索引虽然被使用了但过滤后还有一半行要回表性能自然上不去。这种情况应该考虑复合索引或者干脆接受全表扫描。第二种是回表行数太多。明明走了索引但需要回表的数据量巨大I/O开销抵消了索引优势。最简单的解法是把要查的字段都放进索引做成覆盖索引。第三种是统计信息过期。有时候执行计划里rows跟实际差了好几个数量级这时候手动跑一下ANALYZE TABLE让优化器重新评估可能问题就解决了。第四种是行锁竞争和长事务。SQL本身很快但被其他未提交的事务堵住了这就不完全是索引问题了需要去performance_schema看锁等待事件。6.3 关于FORCE INDEX的最后手段网上经常可以看到FORCE INDEX的用法强制优化器走某个索引。我的建议是能不用就不用。因为FORCE INDEX是人工干预一旦数据分布或统计信息变化强制指定的索引可能变成最差的选择而且这种问题很难提前发现。如果确实用了记得加上注释说明原因并且在每次大版本升级或数据量翻倍时重新评估。长期来看把SQL本身和索引设计调整到优化器能自然选对才是最健康的做法。6.4 一套实用的慢SQL监控组合调优不能只看偶尔一条慢SQL得建立监控习惯SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1;把超过1秒的查询都记录到慢查询日志然后配合mysqldumpslow或者performance_schema里的events_statements_summary_by_digest做聚合统计。MySQL8.0里还有现成的sys.statement_analysis视图一条SQL就能看到所有慢查询的排名、平均耗时、扫描行数非常方便。我自己的习惯是每周固定看一眼Top 10慢SQL列表用EXPLAIN逐个过一遍把需要优化的记录到工单里。不要等业务方反馈某个接口慢了才去处理主动发现和被动救火的差别很大。最后分享一个小习惯。我每次定位一条慢SQL都会先问三个问题是否走了索引回表了多少行排序和临时表能不能省掉大部分性能问题只要把这三件事想明白答案基本就清晰了。索引调优做到后面拼的不是操作技巧而是对数据和查询路径的理解。如果你手里正有一条三秒钟的SQL别急着加索引先EXPLAIN看一眼多半能找到比加索引更精准的解法。

相关新闻

OpenClaw 实例暴露事件解析:从裸奔自查到安全加固的完整指南

OpenClaw 实例暴露事件解析:从裸奔自查到安全加固的完整指南

先说结论:这条“25 万 OpenClaw 实例暴露”的安全提醒,不是危言耸听,更不是在制造流量焦虑。我自己的判断很直接:OpenClaw 这类开源 AI Agent 现在确实火,但太多人只是照着“openclaw 安装教程”把服务跑起来&#xff…

2026/10/11 13:49:15 阅读更多 →
Mirror Particle:人类行为世界模型的多尺度物理化建模框架

Mirror Particle:人类行为世界模型的多尺度物理化建模框架

1. 项目概述:当“镜像粒子”不再只是物理概念,而成为理解人类行为的底层框架“Mirror Particle”这个词乍一听像是高能物理实验室里刚跑出来的术语——毕竟在标准模型里,镜像粒子是为解释中微子振荡、暗物质候选者或CP破坏现象而提出的理论构…

2026/10/11 15:03:35 阅读更多 →
claude-mem 记忆持久化实战:分层架构与检索优化

claude-mem 记忆持久化实战:分层架构与检索优化

1. 从零理解 claude-mem 到底在解决什么问题第一次看到 claude-mem 这个名字,我脑子里蹦出来的第一个念头是:这不就是把 Claude 和 memory 拼在一起吗?没错,字面意思确实如此,但它背后要解决的事情,远比名字…

2026/10/11 13:42:05 阅读更多 →

最新新闻

线程概念和控制

线程概念和控制

线程概念 线程是程序里的一个执行路线。 一切进程至少都有一个执行线程 线程在进程内部执行,本质是在进程地址空间内运行分页式存储管理 虚拟地址和页表的由来 西靠一下,如果在没有虚拟内存和分页机制的情况下,每一个用户程序在物理内存上对应…

2026/10/11 17:44:29 阅读更多 →
随机森林时间序列预测实战:特征工程、多步策略与避坑指南

随机森林时间序列预测实战:特征工程、多步策略与避坑指南

简介:一套基于Python实现随机森林(RF)时间序列预测的完整工程包,面向需要完成课程设计、期末大作业或毕业设计的计算机、电子信息、数学等专业学生,也适合刚接触机器学习预测的新手快速上手。压缩包内共3个文件&#x…

2026/10/11 17:44:29 阅读更多 →
EP_机械双臂ROS2交互协议

EP_机械双臂ROS2交互协议

EP:Engineering and Projects 双臂轮式机器人(单臂 7 关节 夹爪)ROS2 Topic 交互协议硬件构成: 移动底盘(轮式)【本次只做状态反馈,不展开底盘控制话题】左机械臂:7 个转动关节 夹…

2026/10/11 17:44:28 阅读更多 →
人脸检测数据集从零搭建:WIDER FACE大目标子集8188张VOC转YOLO全流程

人脸检测数据集从零搭建:WIDER FACE大目标子集8188张VOC转YOLO全流程

简介:从WIDER Face中筛选出的B子集大目标人脸检测数据集,包含8188张jpg图片及对应标注,仅face一个类别,总标注框14649个。所有目标的像素面积均大于3500,专门面向近距离、大脸检测场景,可显著减少远距离小目…

2026/10/11 17:44:28 阅读更多 →
CoT还是ToT怎么选?Agentic Design Patterns推理技术(Reasoning Techniques)终极对比

CoT还是ToT怎么选?Agentic Design Patterns推理技术(Reasoning Techniques)终极对比

文档教程AI Agent人工智能 【免费下载链接】Agentic-Design-Patterns Agentic Design Patterns 项目地址: https://gitcode.com/gh_mirrors/agen/Agentic-Design-Patterns 点击查看 免费下载 Agentic Design Patterns 项目第 17 章聚焦 AI 智能体的推理技术&#x…

2026/10/11 17:44:28 阅读更多 →
手写文字去除:OCR前图像预处理的可控方案

手写文字去除:OCR前图像预处理的可控方案

简介:本资源提供手写文字智能擦除的工业级Python实现方案,面向图像处理开发者、AI算法工程师及教育信息化从业者,解决试卷、表单等场景中手写内容与印刷体混杂导致的OCR识别干扰问题。资源包共36个文件,含22个核心Python脚本&…

2026/10/11 17:43:28 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →