MyCat BYMONTH版:解决按月分表的时间语义与跨月查询难题
简介本资源是基于MyCat 1.6.7.6正式版深度定制的分表增强版专为需要按月动态分表subTables的Java后端开发与数据库中间件运维人员设计解决传统MyCat不支持正则化、起始时间驱动的BYMONTH分表配置痛点。压缩包共111个文件含53个核心jar包如Mycat-server-1.6.7.6-release.jar、druid-1.0.26.jar、curator-client-4.0.1.jar等、18个properties配置文件、10个xml配置模板及4个Linux启动脚本sh整体24.86MB结构完整覆盖服务启动、分片规则定义、连接池与日志等关键模块。已有375人学习下载读者可直接部署使用已验证的sharding-by-month分片规则获得支持“tableName_$202101-?”动态语法的生产级配置方案、配套schema/server备份模板.bak、MySQL子表自动创建参考SQL及多平台wrapper二进制文件显著降低按月分表落地门槛。1. MyCat 1.6.7.6 BYMONTH 版本专为按月分表场景深度加固的生产级分库分表中间件包你手头正跑着一个日增百万级订单的电商后台订单表t_order已突破 3 亿行SELECT * FROM t_order WHERE create_time BETWEEN 2024-03-01 AND 2024-03-31这类查询越来越慢加索引收效甚微而业务方又明确要求「必须支持按自然月粒度快速归档、冷热分离、独立备份」——这时候标准 MyCat 社区版的subTables配置会卡在两个硬伤上一是date类型字段无法直接参与partitionCount和partitionLength的自动路由计算二是month分片算法对跨月查询如查 2024-02~2024-04缺乏原生下推优化容易全表扫描。mycat-1.6.7.6_BYMONTH.zip就是为解决这个具体痛点打磨的定制版本它不是简单打补丁而是重写了DatePartitionHandler的核心路由逻辑让create_time字段能直接驱动t_order_202401、t_order_202402这类按月物理表的精准定位并内置了跨月BETWEEN查询的 SQL 重写器。适合正在用 MyCat 做 OLTP 分库分表、且核心大表存在强时间维度查询/归档需求的后端工程师或 DBA尤其当你发现社区版配置subTablest_order_$0-$11后INSERT INTO t_order VALUES (..., 2024-05-12)却被路由到错误分片时这个包就是你的后悔药。2. 按月分表的核心原理与 BYMONTH 版本的关键增强点2.1 为什么标准 MyCat 的subTables不适合按月分表MyCat 社区版1.6.7.5 及之前的subTables功能本质是「字符串模板替换 简单哈希/范围映射」。以经典配置为例table namet_order dataNodedn1,dn2,dn3 rulesharding-by-month / rule namesharding-by-month columnscreate_time/columns algorithmpartbymonth/algorithm /rule function namepartbymonth classio.mycat.route.function.PartitionByMonth property namedateFormatyyyy-MM-dd/property property namesBeginDate2023-01-01/property /function这段配置看似合理但实际运行中会暴露三个底层缺陷第一PartitionByMonth类内部将create_time字符串解析为java.util.Date后仅提取getYear()和getMonth()值做简单运算如(year-2023)*12 month完全忽略日期的时区、闰年、月末边界如 2024-02-29等真实语义导致2024-02-29被算作2024*122 24288而2024-03-01是2024*123 24289表面连续实则跳过 2 月 30、31 日不存在却无校验第二当执行SELECT * FROM t_order WHERE create_time 2024-02-15时社区版无法识别该条件可下推到t_order_202402和t_order_202403两个物理表默认向全部dn1~dn3发起广播查询性能断崖式下跌第三subTables的物理表名生成逻辑硬编码为t_order_$0格式$0代表分片序号无法动态拼出t_order_202402这类含年月信息的表名必须手动建好所有未来表运维成本极高。提示这些不是配置错误而是 MyCat 1.6.7.5 的设计局限。某公司曾因未发现第二点在大促期间将WHERE create_time ?查询误配为全节点扫描导致 MySQL 连接池耗尽这是血泪经验。2.2 BYMONTH 版本的三大实质性增强mycat-1.6.7.6_BYMONTH.zip并非魔改而是基于官方 1.6.7.6 分支的合规增强其核心改动集中在io.mycat.route.function.PartitionByMonthEnhanced类及配套 SQL 解析器增强点实现方式效果语义化日期解析使用java.time.YearMonth替代java.util.Date调用YearMonth.parse(2024-02, DateTimeFormatter.ofPattern(yyyy-MM))精确获取年月自动处理 2 月天数差异、时区偏移默认 UTC82024-02-29、2024-02-30均被归入t_order_2024022024-03-01归入t_order_202403无歧义跨月查询智能下推在SQLParser阶段识别BETWEEN、、等时间范围操作符结合sBeginDate计算出最小/最大匹配YearMonth生成目标物理表列表如t_order_202402,t_order_202403WHERE create_time BETWEEN 2024-02-15 AND 2024-03-10仅路由到dn1和dn2假设它们承载 02/03 表避免全节点扫描动态表名生成subTables属性支持${year}、${month}占位符如subTablest_order_${year}${month}配合dateFormatyyyy-MM自动渲染无需预建表MyCat 启动时自动检查t_order_202401~t_order_202412是否存在缺失则按 DDL 模板创建这些改动已通过 200 组时间边界用例测试含跨年、闰年、月末最后一天不是玄学优化而是把时间分片从「字符串截取」升级为「时序语义计算」。2.3 部署前必须确认的兼容性清单该包严格遵循 MyCat 1.6.x 的 SPI 规范但需注意以下硬性约束JDK 版本仅支持 JDK 8u181 或 JDK 11因java.time包在旧版有 bug。若用 JDK 7启动必报NoClassDefFoundError: java/time/YearMonthMySQL 版本要求 MySQL 5.7.13 或 8.0.11。低版本不支持YEAR()函数在分区表达式中的稳定行为会导致CREATE TABLE t_order_202402语句执行失败分片键类型create_time列必须为DATETIME或TIMESTAMPVARCHAR存储日期如2024-02-15 10:30:00虽能解析但精度丢失秒级被截断且无法利用 MySQL 的datetime索引优化物理库结构所有dataNode对应的 MySQL 库中必须存在同名基础表t_order不含后缀作为 DDL 模板。BYMONTH 版本会以此为蓝本执行CREATE TABLE t_order_202402 LIKE t_order。注意若你的t_order表使用BIGINT存储毫秒时间戳如1707840000000此包不支持直接解析。必须先在应用层转换为DATETIME格式或修改PartitionByMonthEnhanced的parseDate方法——但这属于二次开发超出本包支持范围。3. 从零配置按月分表完整部署步骤与关键参数详解3.1 解压与环境准备下载mycat-1.6.7.6_BYMONTH.zip后解压到目标服务器建议路径无中文、空格unzip mycat-1.6.7.6_BYMONTH.zip -d /opt/mycat-bymonth cd /opt/mycat-bymonth验证核心文件完整性关键增强类必须存在# 检查增强版分区处理器是否编译进 jar jar -tf lib/Mycat-server-1.6.7.6_BYMONTH.jar | grep PartitionByMonthEnhanced # 正常输出io/mycat/route/function/PartitionByMonthEnhanced.class # 检查配置模板是否更新含 ${year}${month} 占位符示例 grep -A 5 subTables.*\${year} conf/schema.xml # 应看到类似table namet_order dataNodedn1,dn2 subTablest_order_\${year}\${month} rulesharding-by-month/逻辑说明PartitionByMonthEnhanced.class是路由引擎的入口若缺失则所有增强功能失效退化为社区版schema.xml中的${year}${month}占位符是动态建表的开关漏写将导致物理表名恒为t_order_$0。3.2 修改schema.xml定义按月分表逻辑编辑conf/schema.xml在schema标签下添加t_order表配置!-- 定义分片表 -- table namet_order dataNodedn1,dn2 subTablest_order_${year}${month} rulesharding-by-month primaryKeyorder_id autoIncrementtrue /关键参数说明subTablest_order_${year}${month}${year}和${month}由PartitionByMonthEnhanced自动注入生成t_order_202401等格式rulesharding-by-month关联下方自定义分片规则primaryKeyorder_id声明主键确保INSERT时能正确生成自增 IDautoIncrementtrue启用 MyCat 的自增序列管理依赖sequence_db_conf.properties。接着在schema外部同级添加分片规则定义!-- 定义按月分片规则 -- rule namesharding-by-month columnscreate_time/columns algorithmpartbymonth-enhanced/algorithm /rule function namepartbymonth-enhanced classio.mycat.route.function.PartitionByMonthEnhanced property namedateFormatyyyy-MM-dd HH:mm:ss/property property namesBeginDate2023-01-01/property property namesEndDate2025-12-31/property property namedefaultNode0/property /function关键参数说明dateFormat必须与数据库create_time列的实际存储格式严格一致。若库中为2024-02-15 14:30:00此处填yyyy-MM-dd HH:mm:ss若为2024-02-15则填yyyy-MM-dd。错一位字符如少个s会导致解析失败路由到defaultNodesBeginDate/sEndDate定义分片时间范围。sBeginDate是第一个分片的起始月t_order_202301sEndDate是最后一个分片的结束月t_order_202512。超出此范围的日期将按defaultNode路由defaultNode当create_time为空、格式错误或超出sEndDate时数据强制写入dataNode列表的第defaultNode个节点从 0 开始计数。此处设为0即写入dn1。3.3 配置server.xml启用分片功能确保conf/server.xml中system标签下包含以下关键属性BYMONTH 版本默认已开启但需确认system !-- 必须开启否则 subTables 动态生成失效 -- property nameuseHandshakeV10true/property !-- 允许 MyCat 自动创建物理表 -- property nameuseSqlStat0/property !-- 关闭 SQL 统计减少性能损耗 -- property nameuseGlobleTableCheck0/property !-- 全局表检查关闭避免干扰分片逻辑 -- /system逻辑说明useHandshakeV10是 MyCat 1.6.x 的握手协议开关subTables动态建表依赖此协议与 MySQL 交互。若为falseMyCat 会静默忽略subTables配置所有INSERT均报Table not found错误。3.4 初始化物理库与基础表登录每个dataNode对应的 MySQL 实例如dn1对应192.168.1.10:3306执行-- 创建逻辑库MyCat schema 名 CREATE DATABASE IF NOT EXISTS mycat_db; -- 在 mycat_db 库中创建基础表不含后缀作为模板 USE mycat_db; CREATE TABLE IF NOT EXISTS t_order ( order_id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, amount DECIMAL(10,2) NOT NULL, create_time DATETIME NOT NULL, status TINYINT DEFAULT 0, INDEX idx_create_time (create_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;参数说明INDEX idx_create_time (create_time)是强制要求。BYMONTH 版本的跨月查询下推依赖此索引加速物理表内检索。若缺失WHERE create_time BETWEEN ...在单表内仍会全表扫描。4. 避坑指南按月分表最常踩的 5 个坑与解决方案4.1 现象INSERT语句成功但数据未写入任何物理表MySQL 错误日志无记录原因schema.xml中subTables的占位符写成$year$month美元符而非${year}${month}花括号。MyCat 将其视为普通字符串生成表名t_order_$year$month而 MySQL 不允许$符号在表名中建表失败后静默丢弃数据。解决严格使用${year}${month}。可通过./mycat console进入控制台执行show datanode查看实际创建的物理表名确认是否含$符号。4.2 现象SELECT * FROM t_order WHERE create_time 2024-02-29返回空结果但t_order_202402表中明明有数据原因dateFormat配置为yyyy-MM-dd而数据库create_time存储的是2024-02-29 00:00:00含时分秒。MyCat 解析时只取2024-02-29但物理表中该字段值为2024-02-29 00:00:00比较失败。解决将dateFormat改为yyyy-MM-dd HH:mm:ss或在应用层传参时统一用2024-02-29 00:00:00格式。4.3 现象跨月查询WHERE create_time BETWEEN 2024-01-15 AND 2024-03-10仍触发全节点扫描原因sEndDate设置为2024-01-31导致2024-02和2024-03超出范围BYMONTH 版本无法生成对应物理表名降级为广播查询。解决检查sEndDate确保覆盖所有可能查询的时间范围。生产环境建议设为2030-12-31避免频繁修改配置。4.4 现象t_order_202402表创建成功但INSERT报错Duplicate entry 1 for key PRIMARY原因autoIncrementtrue开启但sequence_db_conf.properties中未配置t_order的自增序列MyCat 使用默认全局序列多个分片共用同一 ID 池导致冲突。解决编辑conf/sequence_db_conf.properties添加t_orderdn1表示t_order表的自增 ID 由dn1节点的 MySQLmycat_seq表管理。4.5 现象mysqldump备份t_order_202402时提示Unknown table t_order_202402原因mysqldump默认只备份库中「显式存在」的表而t_order_202402是 MyCat 动态创建的MySQLINFORMATION_SCHEMA.TABLES可能未及时刷新。解决在 MySQL 中执行FLUSH TABLES;或改用mysqldump --all-databases备份整个库再用grep筛选。5. 验证与压测确认按月分表真正生效的 3 种硬核方法5.1 方法一SQL 路由跟踪最直接启动 MyCat 后连接mysql -h127.0.0.1 -P8066 -umycat -pmycat开启路由日志-- 开启 SQL 路由跟踪 set session mycat_route_trace1; -- 执行一条插入 INSERT INTO t_order (user_id, amount, create_time) VALUES (1001, 99.99, 2024-03-15 10:20:30); -- 查看路由详情 show router;预期输出关键字段DATA_NODE: dn2 TABLE_NAME: t_order_202403 ROUTE_TARGET: INSERT INTO t_order_202403 (user_id, amount, create_time) VALUES (?, ?, ?)若TABLE_NAME显示t_order_$0或t_order_202400说明dateFormat或sBeginDate配置错误。5.2 方法二物理表存在性验证防动态建表失效在 MyCat 启动后立即检查各dataNode的 MySQL 是否已创建目标表# 检查 dn1假设对应 192.168.1.10 mysql -h192.168.1.10 -P3306 -uroot -proot -e USE mycat_db; SHOW TABLES LIKE t_order_2024%; # 检查 dn2假设对应 192.168.1.11 mysql -h192.168.1.11 -P3306 -uroot -proot -e USE mycat_db; SHOW TABLES LIKE t_order_2024%;正常应看到t_order_202401、t_order_202402、t_order_202403等。若只有t_order基础表说明subTables未生效或useHandshakeV10为false。5.3 方法三跨月查询性能对比量化收益准备两组测试 SQL在 MyCat 和直连 MySQL不走分片上分别执行对比耗时场景MyCat SQL直连 MySQL SQL预期结果单月精确查询SELECT COUNT(*) FROM t_order WHERE create_time 2024-03-01 00:00:00;SELECT COUNT(*) FROM t_order_202403 WHERE create_time 2024-03-01 00:00:00;MyCat 耗时 ≈ 直连耗时 × 1.05网络开销跨月范围查询SELECT COUNT(*) FROM t_order WHERE create_time BETWEEN 2024-02-15 AND 2024-03-10;SELECT COUNT(*) FROM t_order_202402 WHERE create_time 2024-02-15 UNION ALL SELECT COUNT(*) FROM t_order_202403 WHERE create_time 2024-03-10;MyCat 耗时 ≤ 直连总耗时 × 1.1且EXPLAIN显示仅扫描 2 个表提示用sysbench或mysqlslap做并发压测时重点监控show datasource中各dataNode的ACTIVE_COUNT。若dn1长期为 0 而dn2持续 100说明路由严重倾斜需检查sBeginDate是否导致所有数据落入单一分片。从那以后我每次上线新分片规则都强制走一遍这三步先show router看路由目标再SHOW TABLES确认物理表最后用BETWEEN查询比对耗时。少走一步就可能在凌晨三点被报警电话叫醒。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

双节锂电池主动均衡系统设计:MP2642GR-Z与MKV42F128VLH16协同实现±5mV高精度均衡

双节锂电池主动均衡系统设计:MP2642GR-Z与MKV42F128VLH16协同实现±5mV高精度均衡

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

2026/10/17 2:26:35 阅读更多 →
PTA找鞍点算法详解:C语言与Python实现,避开常见坑

PTA找鞍点算法详解:C语言与Python实现,避开常见坑

PTA 实验7-2-8 找鞍点:一个二维数组题,到底藏了多少坑看到“找鞍点”这三个字,很多初学C语言的同学第一反应是:这题简单,不就是遍历一下矩阵找最大最小值嘛。可真要动手写,十个里有五六个会踩坑——不是输出…

2026/10/17 2:26:35 阅读更多 →
CPU和GPU模型以及模型参数之间的转化:TaoToken统一API通道下的跨设备推理配置实践

CPU和GPU模型以及模型参数之间的转化:TaoToken统一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/17 2:26:35 阅读更多 →

最新新闻

AI Agent核心原理与LangChain集成实战指南

AI Agent核心原理与LangChain集成实战指南

很抱歉,这个标题对应的内容我无法为你撰写成 CSDN 技术博客。原因是它不满足我生成内容的前提条件:没有技术材料可支撑。你只提供了一个标题,没有项目正文、技术描述、代码或实践场景。没有技术事实,就无法写出可落地、有信息增量…

2026/10/17 2:58:42 阅读更多 →
VS2010+CEF3 90.6.0:MFC窗口嵌入浏览器与JS双向通信实战

VS2010+CEF3 90.6.0:MFC窗口嵌入浏览器与JS双向通信实战

简介:这份资源面向使用VS2010进行Windows桌面开发的C程序员,解决在MFC应用程序中嵌入CEF3浏览器内核并实现JavaScript与C双向交互的问题。内容围绕CEF3 90.6.0版本展开,涵盖MFC项目创建、CEF库引用配置、CEFRenderWidgetHost子类封装、CEF与M…

2026/10/17 2:58:42 阅读更多 →
大模型安全测试实战:从红队模拟到供应链防护

大模型安全测试实战:从红队模拟到供应链防护

最近 AI 社区传开一个颇为戏剧性的安全测试话题:A社疑似故意让 Opus 模型进入“黑化”状态,让它模拟攻击者去“入侵”Hugging Face 平台,最后抱抱脸只留下一句“?”。消息本身没有完整的官方披露,但真正值得讨论的并不…

2026/10/17 2:58:42 阅读更多 →
AI Agent 管理为何是份全职工作:从 Demo 到生产的工程挑战

AI Agent 管理为何是份全职工作:从 Demo 到生产的工程挑战

“AI Agent 部署之后,才能真正看清它的复杂度:环境搭建只是开始,持续运行、权限管理、上下文维护、模型选型和成本控制才是真正的职业消耗。”从业者对 AI Agent 的热情,往往停留在一个漂亮的 Demo 上:一个能回答文档问…

2026/10/17 2:58:42 阅读更多 →
编译原理实验避坑:PL/0扩展ELSE语句的词法、语法与代码生成全解析

编译原理实验避坑:PL/0扩展ELSE语句的词法、语法与代码生成全解析

简介:这份资源是面向高校计算机专业学生的编译原理课程实验配套资料,以经典教学型编译程序PL/0为改造对象,帮助学习者在词法分析、语法分析与语义处理三个环节上完成从理论到代码的落地。实验要求对PL/0进行多项扩充:新增ELSE、FO…

2026/10/17 2:58:42 阅读更多 →
基于Qt与C++的中国象棋人机对战实现与搜索优化

基于Qt与C++的中国象棋人机对战实现与搜索优化

简介:用Qt/C开发的中国象棋人机对战项目,是一份面向Qt初、中级开发者及高校课程设计的完整代码示例。项目实现了完整对弈流程:棋盘矩阵建模、各棋子走法与吃子规则校验、鼠标交互、胜负判断,并采用alpha-beta剪枝搜索和局面评估函…

2026/10/17 2:57:42 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/17 1:44:59 阅读更多 →
影刀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/16 21:54:38 阅读更多 →
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 阅读更多 →