MySQL索引深度解析:聚簇索引与二级索引原理、优化与实践
1. 索引的本质与两种核心形态在数据库的世界里索引就像是图书馆的目录。没有索引要找到一本特定的书你就得在茫茫书海中一本一本地翻这就是全表扫描效率极低。而有了索引你就能通过书名、作者或分类号快速定位到书架上的具体位置。MySQL的InnoDB存储引擎主要提供了两种索引形态聚簇索引Clustered Index和非聚簇索引Non-clustered Index也叫二级索引或辅助索引。理解它们的区别是深入MySQL性能调优、设计高效表结构的基石。简单来说聚簇索引决定了表中数据的物理存储顺序。一张InnoDB表必须有且只有一个聚簇索引。如果你定义了主键PRIMARY KEY那么主键就是聚簇索引。如果没有显式定义主键InnoDB会选择一个唯一的非空索引UNIQUE NOT NULL来代替。如果连这个都没有InnoDB会隐式地生成一个6字节的ROWID作为聚簇索引。聚簇索引的叶子节点直接存储了完整的行数据row data。因此通过聚簇索引查找数据非常高效因为找到索引就等同于找到了数据本身。而非聚簇索引二级索引的叶子节点并不存储行数据它存储的是该行数据对应的聚簇索引键值主键值。你可以把它理解为一个指向“主目录”的“副目录”。当你通过二级索引查找数据时MySQL会先在这个“副目录”里找到目标的主键值然后再拿着这个主键值去“主目录”聚簇索引里查找最终的行数据。这个过程被称为“回表”Bookmark Lookup。显然这比直接通过聚簇索引查询多了一次索引查找。为什么InnoDB要这样设计核心是为了平衡。聚簇索引让主键查询和范围查询因为数据物理相邻极快但代价是插入速度严重依赖于插入顺序乱序插入可能导致频繁的页分裂。二级索引虽然需要回表但它的体积可以更小只存主键值一张表上可以建立多个为不同的查询条件提供快速的入口同时不影响数据本身的物理组织方式。这种设计在OLTP联机事务处理场景下在查询和写入之间取得了很好的权衡。2. 聚簇索引数据与索引的一体化设计2.1 聚簇索引的工作原理与数据结构聚簇索引通常采用B树数据结构。在B树中非叶子节点内节点只存储索引键值和指向子节点的指针而所有的叶子节点则按索引键的顺序形成一个有序链表并且叶子节点包含了完整的行记录。想象一下一本按章节标题拼音排序的书籍目录。目录本身非叶子节点告诉你“A章在10-50页B章在51-100页”。当你翻到具体的某一章叶子节点时这一页上印着的就是该章节的全部正文内容而不是“请参见第XXX页”。聚簇索引就是如此它的“目录项”和“正文”在物理上是紧密绑定在一起的。这种设计带来了几个关键特性数据即索引索引即数据数据行就存放在索引的叶子页上。因此聚簇索引就是表。顺序存储由于叶子节点按主键顺序链接所以基于主键的范围查询如WHERE id BETWEEN 100 AND 200效率极高因为相关的数据行在物理磁盘上很可能是相邻存储的减少了磁盘I/O。快速主键访问通过主键进行等值查询WHERE id 123只需一次B树搜索即可拿到所有列的数据。2.2 主键选择对聚簇索引的深远影响既然聚簇索引如此重要主键的选择就绝非随意。一个糟糕的主键设计会直接拖垮整张表的性能。1. 单调递增的主键如自增ID、时间戳是最佳实践。当新插入的数据的主键值总是比之前的大时InnoDB只需要简单地将新行追加到当前索引的末尾。这避免了频繁的页分裂和随机I/O。页分裂是一个昂贵的操作它需要分配新页、移动部分数据并调整B树结构会导致性能抖动和空间碎片。注意使用UUID或随机字符串作为主键是典型的反面案例。因为其无序性每次插入都可能需要寻找中间某个页极易引发页分裂严重降低写入性能并增加存储碎片。2. 主键应尽可能短。因为所有二级索引的叶子节点都存储主键值。一个过大的主键如很长的VARCHAR会使得每个二级索引都变得臃肿占用更多的磁盘和内存空间。在同样大小的内存缓冲区InnoDB Buffer Pool中你能缓存的索引页就更少缓存命中率下降性能自然受影响。3. 避免频繁更新的列作为主键。聚簇索引键的更新代价高昂因为它可能导致数据行物理位置的移动如果新值破坏了顺序。同时所有包含该主键的二级索引也需要同步更新其叶子节点中的主键值引发连锁的写入开销。实操心得在绝大多数业务场景下使用BIGINT UNSIGNED NOT NULL AUTO_INCREMENT作为主键是安全、高效且省心的选择。它简短、有序、唯一完美契合聚簇索引的需求。只有在分布式、需要全局唯一且无法接受递增趋势的特殊场景下才需要考虑雪花算法Snowflake生成的ID它至少保持了时间上的大体有序。3. 非聚簇索引二级索引高效的查询入口3.1 二级索引的结构与回表现象二级索引同样是一棵B树。但这棵树的叶子节点内容与聚簇索引截然不同它存储的是索引列的键值 对应数据行的主键值。例如我们在users表的email列上建立了一个索引idx_email。这棵B树的叶子节点可能看起来像这样假设主键是id[‘aliceexample.com’, 105] [‘bobexample.com’, 102] [‘charlieexample.com’, 101] ...每一行都是一个索引条目包含邮箱地址和该用户的主键ID。当执行查询SELECT * FROM users WHERE email ‘bobexample.com’;时优化器如果选择使用idx_email索引其过程如下在idx_email的B树中查找键值‘bobexample.com’。在叶子节点找到条目[‘bobexample.com’ 102]得到主键值102。拿着主键值102回到聚簇索引主键索引的B树中查找id102的记录。在聚簇索引的叶子节点找到完整的行数据返回给客户端。步骤3和4就是“回表”。如果查询只需要索引列和主键列即覆盖索引后面会详述那么步骤3和4就可以省略性能会大幅提升。3.2 覆盖索引避免回表的性能利器覆盖索引是优化二级索引查询性能的关键技术。如果一个索引包含了查询语句所需要的所有字段那么MySQL就可以直接从索引中取得数据而无需回表。例如有查询SELECT id name FROM users WHERE email ‘bobexample.com’;如果我们只在email上建立索引idx_email(email)那么查询过程是通过idx_email找到主键id再回表通过id获取name。但如果我们建立的是复合索引idx_email_name(email name)情况就不同了。这个索引的叶子节点存储的是(email name id)的组合实际上先存email和name的键值再附上id。对于上面的查询SELECT子句需要的id和name以及WHERE子句需要的email全都存在于idx_email_name这个索引中。因此引擎在idx_email_name的B树里找到‘bobexample.com’对应的条目后发现需要的id和name已经到手了完全不需要再去聚簇索引里查找查询性能得到质的飞跃。创建覆盖索引的技巧分析高频查询使用SHOW PROCESSLIST或慢查询日志找出执行最频繁或最耗时的SELECT语句。检查查询字段仔细查看这些查询的SELECT、WHERE、ORDER BY、GROUP BY子句中用到了哪些字段。设计复合索引尝试创建一个包含所有这些字段的复合索引。字段的顺序至关重要通常将等值查询条件WHERE column value的列放在最左边范围查询 BETWEEN和排序ORDER BY的列放在后面。权衡索引大小覆盖索引虽好但不要无节制地创建宽索引包含很多列。太宽的索引会占用大量磁盘和内存并降低写入速度。需要在查询性能提升和存储/写入开销之间取得平衡。常见误区认为在查询的WHERE条件中出现的所有列都加上索引就能提高性能。实际上无序地创建多个单列索引MySQL在很多时候只能使用其中一个索引合并策略并非总是启用并且每个索引都要单独维护对写入不友好。正确的思路是针对特定的查询模式设计精良的复合索引。4. 两种索引的对比与联合使用场景4.1 核心差异对照表为了让区别更直观我们用一个表格来总结特性聚簇索引非聚簇索引二级索引数量每表唯一每表多个叶子节点内容完整行数据索引列值 主键值数据存储顺序按索引键排序存储按索引键排序存储但不决定行数据的物理顺序查询效率主键/范围查询极快等值查询快但通常需要回表插入性能影响受主键顺序影响大有序插入快无序插入慢影响相对较小但索引越多插入越慢典型代表主键PRIMARY KEY普通索引INDEX、唯一索引UNIQUE KEY4.2 实战中的联合应用与优化思路在实际业务中聚簇索引和二级索引是协同工作的。一个高效的数据库设计往往是在良好的聚簇索引基础上针对核心查询路径创建精准的二级索引。场景分析订单表查询优化假设有一张订单表orders主要字段有order_id(主键 自增)user_idstatusamountcreate_time。高频查询1用户查看自己的订单列表按时间倒序。SELECT * FROM orders WHERE user_id 123 ORDER BY create_time DESC LIMIT 20;优化方案在(user_id create_time)上建立复合索引idx_user_time。WHERE条件user_id在左边做等值匹配ORDER BY的create_time在右边索引本身的有序性可以直接满足排序需求避免昂贵的文件排序filesort。由于查询是SELECT *依然需要回表但通过索引已经快速过滤并排好序回表的次数就是LIMIT的20次效率很高。高频查询2后台统计特定状态、某时间段的订单总金额。SELECT SUM(amount) FROM orders WHERE status ‘PAID’ AND create_time BETWEEN ‘2024-01-01’ AND ‘2024-01-31’;优化方案这是一个典型的聚合查询且只涉及statuscreate_timeamount三个字段。我们可以创建一个覆盖索引idx_status_time_amount(status create_time amount)。这样整个查询都可以在这个索引中完成无需回表速度极快。高频查询3根据订单号查询主键查询。SELECT * FROM orders WHERE order_id 10086;无需优化直接走聚簇索引一次查找即可。这是聚簇索引最擅长的场景。设计心得索引设计是一个“空间换时间”和“写入性能换读取性能”的权衡过程。我的经验法则是主键优先首先确保有一个简短、有序的主键聚簇索引。按需创建不要一开始就创建大量索引。根据上线的业务监控和慢查询日志针对性地为耗时最长的查询创建索引。复合优先尽量使用复合索引来覆盖多个查询条件而不是创建一堆分散的单列索引。前缀利用利用复合索引的最左前缀原则。索引(a b c)可以用于只查a、查ab、查abc的查询但不能用于查b或查bc。设计时要考虑查询模式的共性。定期审视业务逻辑变化后旧的索引可能不再高效甚至成为累赘。需要定期使用EXPLAIN分析查询计划并清理无用索引。5. 通过EXPLAIN洞察索引选择与性能瓶颈理论再扎实也需要工具来验证。MySQL的EXPLAIN命令是我们分析SQL语句执行计划、理解索引使用情况的瑞士军刀。5.1 解读关键字段执行EXPLAIN SELECT ...你会得到一张表。其中几个关键字段直接反映了索引的使用情况type访问类型从好到坏大致是system const eq_ref ref range index ALL。const/eq_ref通常是通过主键或唯一索引进行等值匹配性能最佳。ref使用普通二级索引进行等值匹配。range利用索引进行范围扫描BETWEEN IN等。index全索引扫描遍历整个索引树比全表扫描ALL好一点但依然不高效。ALL全表扫描需要重点优化。keyMySQL实际决定使用的索引。如果为NULL则表示未使用索引。rowsMySQL预估为了找到所需的行需要扫描的行数。这个值越小越好。Extra包含非常重要的额外信息。Using index恭喜表示使用了覆盖索引查询效率很高无需回表。Using where表示在存储引擎检索行后MySQL服务器层还需要应用WHERE条件进行过滤。如果type是ALL且出现Using where说明性能很差。Using filesort表示MySQL需要额外进行一次排序操作无法利用索引的有序性。对于大数据集这非常消耗性能。Using temporary表示MySQL需要创建临时表来处理查询常见于GROUP BY和ORDER BY子句对不同列进行操作时。5.2 实战排查案例假设我们有一个性能缓慢的查询SELECT user_id COUNT(*) FROM orders WHERE create_time ‘2024-01-01’ GROUP BY user_id;我们使用EXPLAIN分析EXPLAIN SELECT user_id COUNT(*) FROM orders WHERE create_time ‘2024-01-01’ GROUP BY user_id;可能得到如下结果简化typekeyrowsExtraALLNULL1000000Using where; Using temporary; Using filesort这个结果非常糟糕type: ALL进行了全表扫描。key: NULL没有使用任何索引。rows: 1000000扫描了100万行。Extra同时出现了Using temporary创建临时表分组和Using filesort文件排序并且还有Using where在服务器层过滤时间。优化步骤添加索引显然WHERE create_time ‘2024-01-01’这个条件没有索引可用。我们首先考虑在create_time上建索引。ALTER TABLE orders ADD INDEX idx_create_time (create_time);再次分析添加索引后再次EXPLAIN。typekeyrowsExtrarangeidx_create_time50000Using index condition; Using temporary; Using filesort有进步type变成了range使用了我们新建的索引idx_create_time预估扫描行数从100万降到了5万。但Using temporary和Using filesort依然存在因为GROUP BY user_id无法利用create_time索引的有序性。设计更优的复合索引我们的查询条件是WHERE create_time ?和GROUP BY user_id。为了同时优化过滤和分组我们可以尝试创建一个(create_time user_id)的复合索引。但注意GROUP BY本质上也需要排序而索引的最左前缀原则意味着(create_time user_id)索引是先按create_time排序再按user_id排序。对于WHERE create_time ?范围查询后的GROUP BY user_iduser_id在索引中并不是有序的因此可能仍然无法避免临时表和文件排序。考虑调整索引顺序或查询在某些情况下如果业务允许可以尝试建立(user_id create_time)索引并调整查询方式。或者如果user_id的过滤性也很好可以将其放入WHERE条件。这是一个需要结合业务数据分布进行测试和权衡的过程。有时可能需要在(create_time)和(user_id)上分别建立索引让优化器选择先过滤时间再分组或者先分组再过滤时间通过子查询等方式。排查心得EXPLAIN只是一个开始。rows列是估算值有时严重不准。要获得真实情况最好在测试环境使用EXPLAIN ANALYZEMySQL 8.0或打开profiling查看各阶段耗时。对于复杂查询不要指望一个索引解决所有问题有时拆分查询或重构业务逻辑是更根本的解决方案。6. 索引使用中的常见陷阱与最佳实践即使理解了原理在实际开发中依然会踩坑。下面是一些我总结的常见陷阱和对应的实践建议。6.1 陷阱清单与规避方法陷阱现象与影响规避方法1. 索引列参与计算或函数WHERE YEAR(create_time) 2024或WHERE amount * 2 100。索引失效全表扫描。将计算移到等号另一边WHERE create_time ‘2024-01-01’ AND create_time ‘2025-01-01’。2. 隐式类型转换表里user_id是VARCHAR但查询写WHERE user_id 123整数。MySQL会进行类型转换导致索引失效。确保查询条件的数据类型与列定义严格一致。3. 前导模糊查询WHERE name LIKE ‘%张%’或WHERE name LIKE ‘%三’。因为索引是从左到右匹配的前导%让索引无法定位起点。考虑使用全文索引FULLTEXT或调整业务设计如冗余一个反转的字段。4. OR条件使用不当WHERE a 1 OR b 2如果a和b上都有单列索引MySQL可能使用索引合并index_merge但效率通常不如复合索引。如果有一个字段没索引则整个条件索引失效。尽量使用UNION或UNION ALL改写或为(a b)创建复合索引。5. 不符合最左前缀原则有复合索引(a b c)但查询条件是WHERE b 2 AND c 3。由于跳过了最左的a这个索引无法被用于查找。设计索引时将等值查询最频繁的列放在最左边。查询时尽量包含最左列。6. 范围查询后的列无法使用索引排序有索引(a b c)查询WHERE a 1 AND b 10 ORDER BY c。a和b可以用到索引但ORDER BY c无法利用索引排序因为b是范围查询其后的c在索引中是无序的。如果ORDER BY很重要尝试调整索引顺序为(a c b)或使用其他优化手段。7. 数据区分度低的列建索引在gender性别只有‘M’‘F’两种值或status状态只有少数几种上建索引。索引树高度很低但每个叶子节点要扫描大量数据行回表成本高可能不如全表扫描。只为区分度高的列唯一值多创建索引。对于低区分度列可以考虑与其他高区分度列组成复合索引。8. 过度索引每个查询条件都建一个索引或创建过宽的复合索引。导致写操作INSERT UPDATE DELETE变慢因为每个索引都需要维护。同时占用大量磁盘和内存。遵循“按需创建”原则定期清理无用索引。使用sys.schema_unused_indexesMySQL 5.7视图辅助判断。6.2 维护与监控建议监控索引使用率定期检查INFORMATION_SCHEMA.STATISTICS表或使用SHOW INDEX FROM table_name查看索引的基数Cardinality。基数/总行数的比值越接近1索引区分度越好。对于长时间未使用的索引可通过performance_schema或慢查询日志间接判断考虑删除。处理索引碎片表经过大量增删改后索引页会产生碎片降低空间利用率和查询效率。对于InnoDB表可以通过执行OPTIMIZE TABLE table_name;来重建表并整理碎片。但这是一个重量级操作会锁表请在业务低峰期进行。对于频繁更新的表可以定期使用ALTER TABLE table_name ENGINEInnoDB;达到类似效果。理解索引下推ICPMySQL 5.6引入的索引条件下推优化对于复合索引(a b c)和查询WHERE a ‘xxx’ AND b LIKE ‘%yyy%’在旧版本中即使a能用索引b的模糊匹配也要回表后再过滤。有了ICPb的条件可以在存储引擎层在索引扫描过程中就进行过滤减少回表次数。确保你的MySQL版本支持并开启了此优化默认开启。谨慎使用唯一索引UNIQUE KEY唯一索引除了提供查询优化还强制了数据的唯一性约束。这既是优点也是缺点。优点是保证了数据一致性缺点是在批量导入或更新时检查唯一性会带来额外开销。确保业务上确实需要唯一性约束时才使用。我个人在实际操作中的体会是索引调优没有银弹它是一个持续迭代和平衡的过程。从设计表结构时选择一个好的主键开始到上线后根据真实的查询负载不断调整和优化二级索引每一步都需要结合具体的业务逻辑和数据特征来分析。最好的学习方式就是多使用EXPLAIN多查看慢查询日志在实践中不断积累对数据访问模式的感觉。记住索引是工具目的是为了加速查询而不是为了存在而存在。

相关新闻

网络安全入门:从CIA三元组到防御实践,构建合规实验环境

网络安全入门:从CIA三元组到防御实践,构建合规实验环境

在当今数字化社会,网络安全已成为个人隐私保护和国家信息基础设施稳定的基石。无论是个人用户防范信息泄露,还是企业构建防御体系,掌握基础的网络安全知识都至关重要。本文旨在为有志于了解网络安全基础、希望建立正确安全认知的初学者&#…

2026/10/9 11:59:46 阅读更多 →
PyTorch自动求导机制详解:从计算图到梯度下降实战

PyTorch自动求导机制详解:从计算图到梯度下降实战

在深度学习模型训练中,反向传播算法是更新模型参数、实现学习功能的核心。然而,手动计算复杂神经网络中成千上万参数的梯度,不仅繁琐,而且极易出错。PyTorch 框架的 autograd (自动求导)系统正是为解决这…

2026/10/9 11:48:30 阅读更多 →
MySQL Connector/J 驱动深度解析:核心配置、性能调优与生产实践

MySQL Connector/J 驱动深度解析:核心配置、性能调优与生产实践

1. 项目概述:为什么我们需要深入理解MySQL Connector/J?如果你正在用Java开发一个需要连接MySQL数据库的应用,那么你几乎肯定接触过mysql-connector-java这个JAR包。它太常见了,常见到很多开发者把它当作一个“黑盒”——在pom.xm…

2026/10/9 17:36:01 阅读更多 →

最新新闻

【会议征稿】第三届数字经济与计算机科学国际学术会议(DECS 2026)

【会议征稿】第三届数字经济与计算机科学国际学术会议(DECS 2026)

第三届数字经济与计算机科学国际学术会议 (DECS 2026) 2026 3rdInternational Conference on Digital Economy and Computer Science 会议官网: 第三届数字经济与计算机科学国际学术会议(DECS 2026)https://ais.cn/…

2026/10/10 2:57:07 阅读更多 →
论文阅读-EATA

论文阅读-EATA

EATA:Efficient Test-Time Model Adaptation without Forgetting论文:Efficient Test-Time Model Adaptation without Forgetting 会议:ICML 2022 核心思想:不是所有测试样本都值得用于模型更新。EATA 在 TENT 的熵最小化基础上&a…

2026/10/10 2:57:07 阅读更多 →
安徽皖上好影视制作公司 擅长人物传记片、活动花絮视频的创意制作

安徽皖上好影视制作公司 擅长人物传记片、活动花絮视频的创意制作

影视制作行业发展态势与皖上好的业务定位随着数字化传播时代的全面到来,视频内容已经成为政企单位与商业品牌对外展示形象、传递价值的核心载体。无论是政务宣传、校园文化传播,还是企业品牌推广、活动记录留存,人物传记片与活动花絮视频的需…

2026/10/10 2:57:07 阅读更多 →
工业智能体:小白也能学会的大模型应用指南(收藏必备)

工业智能体:小白也能学会的大模型应用指南(收藏必备)

本文介绍了工业智能体的概念、发展现状、产业生态布局以及典型应用案例。工业智能体以大模型为核心,深度融合工业知识与AI技术,实现环境感知、逻辑推理、任务规划等功能。文章还分析了工业智能体推动“人工智能制造”落地的机理,包括知识内化…

2026/10/10 2:57:07 阅读更多 →
Solidity 基础语法:用五个小案例,把语法学成肌肉记忆

Solidity 基础语法:用五个小案例,把语法学成肌肉记忆

前两篇我们聊了学习路径和三个实战合约。但有个问题一直悬着:很多人的语法是"拼凑"出来的,不是"理解"出来的。他们能写 mapping(address > uint256),但说不清为什么不用数组;能用 modifier,但不…

2026/10/10 2:57:07 阅读更多 →
同城跑腿系统:骑手端同步和下单收款怎么拆

同城跑腿系统:骑手端同步和下单收款怎么拆

同城跑腿系统联调时,常见做法是支付一通就对外宣称上线。更稳的做法是把「下单与订单状态」和「收款回调」拆阶段验收:前者不依赖真实通道,后者用沙箱 profile,避免支付未过却改订单写入口。结论 订单状态推进应由领域事件驱动&am…

2026/10/10 2:56:07 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

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/10 1:36:08 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →