连接条件下推优化:基于代价模型的数据库查询性能提升实践
1. 从“跑得动”到“跑得快”SQL慢在哪连接条件为何成了活靶子先把话说在前面这项目不是为了炫技也不是为了搞一个理论上好看但在生产环境里根本不敢开的特性。它就是冲着真实业务里最常遇到的那类痛点去的——两张表甚至多张表关联查询数据量一旦上来SQL执行计划就开始“抽风”要么是中间结果集爆炸要么是连接顺序选错要么是过滤条件下推不下去最终DB的CPU和IO被拖到报警慢SQL一张接一张。我接手的那套系统核心查询集中在订单、用户、流水这几张千万级大表上连接查询动辄三五个JOIN还带着各种OR条件、子查询和聚合。最初的表现就是查询超时、连接池被打满、DBA天天收到告警。当时大家的共识是“SQL写得有问题”于是常规做法是人工改写SQL、加索引、调整统计信息甚至用hint强行固定执行计划。这个路子不能说错但问题在于它治标不治本。业务SQL一多你不可能每一条都人肉去调统计信息一更新或者数据分布一变化执行计划又可能回到原来的老路。这个项目的切入点非常明确既然连接查询最怕的是中间结果集过大和无效数据的提前过滤缺失那就从连接条件下手让数据库在生成执行计划的时候根据代价模型自动决定“哪些连接条件应该下推到哪个表、哪个阶段以及下推之后到底能省多少代价”。说白了就是让优化器从“按固定规则干活”升级成“按成本精算干活”。这套能力对谁最有用三类人第一类是业务侧天天写复杂SQL的开发他们不关心优化器内部实现但希望复杂查询别莫名其妙慢到天上去第二类是专职DBA和数据库内核开发者他们需要从原理层面搞清楚计划为什么变差、下推逻辑怎么评估第三类是中间件、数据平台团队他们经常要在分布式或MPP环境里做类似条件下推的改造这套思路完全可以复用到他们的场景。下面我会按照项目落地的实际顺序把整体设计、代价评估方法、核心实现细节、踩坑记录完整拆开讲。内容偏原理和工程结合但我会尽量用大白话把关键机制说透方便不同基础的人都能跟上。2. 连接条件下推的设计思路不是把条件往下搬就算完事2.1 连接条件下推的本质减少参与计算的数据量连接条件下推名字听起来像是“把WHERE里的过滤条件移个位置”但实际上远不止如此。它的本质是改变执行计划中数据流动的路径和量级。举个最直白的例子SELECT * FROM orders o JOIN users u ON o.user_id u.id WHERE u.level VIP AND o.create_time 2024-01-01;常规优化器能做的下推是u.level VIP下推到users表扫描之后过滤o.create_time 2024-01-01下推到orders表扫描之后过滤。这两步几乎每个优化器都会做没什么稀奇。真正复杂的是下面这种情况SELECT * FROM orders o JOIN ( SELECT user_id, MAX(amount) AS max_amount FROM payments WHERE status SUCCESS GROUP BY user_id ) p ON o.user_id p.user_id WHERE o.amount p.max_amount * 0.8;这个查询里o.amount p.max_amount * 0.8这个连接条件理论上是可以有条件地下推到子查询内部的。如果能先算出一部分user_id的max_amount再反过来过滤orders表就能减少orders参与JOIN的行数。但难点在于max_amount是聚合之后的结果下推的条件依赖聚合的输出不能无脑推。所以连接条件下推的真正难点不是“推不推”而是**“哪些条件能推、推到哪一步、推了之后到底是赚是亏”**。这就是为什么必须引入代价模型来兜底。2.2 为什么基于规则的下推不够用三个反直觉的坑很多人第一反应是下推条件肯定是好事啊能早过滤就早过滤。但在实际工程里基于固定规则的无脑下推会踩到至少三个坑。第一个坑是下推导致索引失效。比如某个连接条件被下推到一张大表的扫描阶段但如果这个条件的表达式形态无法匹配已有索引那么原本可以走索引的路径反而退化成全表扫描。你看着过滤后的行数少了但扫描代价可能翻了数倍。第二个坑是下推打乱原本合理的连接顺序。优化器原本可能计划让小表做驱动表大表被索引探测但如果你强行把大表上的条件提前计算并物化成中间结果优化器可能把这个物化结果当成新驱动表导致整体JOIN顺序失衡。第三个坑是重复计算和表达式膨胀。有些条件下推之后会在子查询或子计划里被重复计算多次尤其是在复杂的嵌套视图或OR条件场景中条件复制粘贴过去执行时反而多了大量重复的表达式求值和临时物化开销。所以只靠规则不够。规则只能告诉你“这条件能不能推”但回答不了“推了到底值不值”。值不值这个问题必须交给代价模型。2.3 代价模型选型为什么选择基数估算驱动的评估框架在项目预研阶段我对比过几类方案。纯粹基于规则的方案实现简单但没法处理上面提到的坑。基于启发式的方案比如“小表优先”“过滤率低的条件优先下推”在简单场景下表现稳定但遇到多表、多条件、子查询嵌套时很容易误判。最终我选择的是基于基数估算的代价评估框架。核心思路很简单任何一个下推动作最终都会改变执行计划中某个算子的输入行数。行数一变IO代价、CPU代价、内存代价、网络传输代价都会变。如果我们能精确估算“下推前”和“下推后”的行数变化就能用统一的代价公式判断利大于弊还是弊大于利。具体的代价公式在项目里是分层的扫描代价扫描行数 × 单行处理成本和表大小、存储格式、是否走索引强相关。连接代价左输入行数 × 右输入探测次数 × 单次探测成本。这个最敏感输入行数稍微变一点代价可能差一个量级。物化代价如果下推导致中间结果被物化还要额外加上写入临时缓冲的开销。所以整个项目的技术核心就落在了基数估算的准确性上。如果估算不准代价模型再精巧也是空中楼阁。后面我会详细说这块具体怎么做的这会直接决定整个项目的成败。2.4 适用边界与场景限制哪些查询不适合这套方案在设计阶段我也明确划出过几条不适用的边界省得后面测试的时候到处开洞。一是单表查询不需要下推因为没有连接可言。 二是包含窗口函数且下推会导致窗口语义改变的查询这类必须保守处理窗口函数的计算范围一旦被下推条件修改结果直接错。 三是存在用户自定义函数UDF的连接条件因为UDF的代价和过滤率不可控估算基本靠猜强行下推风险太大。 四是数据分布严重倾斜的列比如某个user_id占了90%的数据这种情况下基数估算很容易失真需要提前做特殊识别。这几条边界在项目文档里被明确写成了“禁止下推清单”后续所有规则和代价判断第一件事就是先检查查询是否踩中这些禁区的边界。3. 核心实现细节基数估算、代价计算、下推决策三步走3.1 基数估算的底层改进直方图与多列统计组合基数估算做得准下推决策才有意义。项目里最先动刀的就是统计信息和基数列估算。传统数据库里常见的是等宽直方图维护成本低但对数据分布敏感。项目里我改用高频值直方图和等深直方图混合的策略高频值单独抽出低频值归入桶内。这样能显著提升level VIP这种高选择性条件的估算精度。等深直方图就更有意思了它把数据按累积频率等分到固定数量的桶里每个桶内行数基本一致。估算某个范围的过滤率时只需要定位命中的桶再按桶内均匀分布假设做比例计算。实测下来对于订单金额、创建时间这类分布相对平稳的列误差基本能控制在15%以内。但单列直方图在多列条件下不够用。比如WHERE region 华东 AND channel APP这两列单看都不算倾斜但一旦组合可能实际命中行数极少用单列统计相乘会严重高估结果集。项目里为此实现了联合多列统计信息对业务上高频同时出现的过滤条件组合直接采样统计组合分布然后用它替代单列估算的乘积结果。下面是直方图构建的核心逻辑简化示意class HistogramBuilder: def build_equi_depth_histogram(self, sample_values, bucket_count100): # 1. 对样本值排序 sorted_vals sorted(sample_values) # 2. 按总量均分到 bucket_count 个桶 total len(sorted_vals) bucket_size max(1, total // bucket_count) buckets [] for i in range(bucket_count): start i * bucket_size end min(total, (i 1) * bucket_size) if start end: break bucket { min: sorted_vals[start], max: sorted_vals[end - 1], count: end - start, # 桶内均匀分布假设估算时按边界重叠比例计算 } buckets.append(bucket) return buckets def estimate_range_selectivity(self, buckets, predicate_min, predicate_max): # 根据谓词范围与每个桶边界重叠程度累加估算行数 total_estimated 0 for b in buckets: if b[max] predicate_min or b[min] predicate_max: continue overlap_start max(b[min], predicate_min) overlap_end min(b[max], predicate_max) ratio (overlap_end - overlap_start) / (b[max] - b[min] 1) total_estimated b[count] * ratio return total_estimated这套实现跑下来单列选择性的估算准确度提升明显尤其是日期范围和金额范围这两类最常见也最难估的谓词。多列统计则更重一些需要额外建快照和采样任务只在特定查询模板命中时启用避免全局开销失控。3.2 代价计算模型IO、CPU、内存、网络四维加权有了基数估算代价计算就可以具体化。项目里把执行代价拆成四个维度IO代价、CPU代价、内存代价、网络代价。IO代价的计算按页为单位IO_cost (total_rows / rows_per_page) * page_cost index_probe_cost这里最关键的是索引探测代价不能按固定值算。比如连接右表走主键索引探测每次探测IO次数在1到3之间浮动不能当成常量。项目里根据索引深度做了动态估算B树层数1次随机IO。CPU代价主要算两件事表达式求值开销和连接匹配开销。表达式求值这块下推条件涉及复杂函数时会额外乘一个函数代价系数。比如简单等值比较系数是1.0字符串LIKE匹配是3.5正则表达式是8.0。内存代价主要针对连接算子和物化算子。如果估算的中间结果集超过内存阈值就需要估算溢出到磁盘的代价。项目里用mem_available × spill_factor来模拟溢出分界点一旦超了就额外加磁盘读写代价。网络代价在分布式或MPP场景下最关键即数据shuffle代价估算结果集行数乘以单行传输成本。单机版项目里这一项默认是零但代码框架里已经留好了接口方便后续扩展到集群模式。四个维度的权重不是固定的。项目里提供了配置项允许按负载特征调整。比如硬盘是SSD时IO权重调低CPU密集型查询多时CPU权重调高在跨机查询频繁的系统中网络权重明显上调。这比写死在代码里灵活得多。3.3 下推决策的算法流程如何判断一个条件“该不该推”决策流程是整个项目最核心的部分。我把它设计成五个阶段第一阶段条件分解。把SQL中的连接条件拆成原子谓词每个原子谓词单独标记来源表、涉及列、表达式类型、是否存在UDF或非确定性函数。第二阶段合法性检查。对每个原子谓词做边界判断命中之前提到的禁止下推清单的直接标记为不可推。这个阶段不涉及代价计算纯粹是安全兜底。第三阶段候选下推路径生成。对每个可推的原子谓词枚举它可能下推的位置。比如一个连接条件可能被下推到左表扫描后、右表扫描后、连接算子之前、或者某个子查询内部。每一条路径都生成一个虚拟的备选执行计划片段。第四阶段代价对比。用基数估算结果分别计算原始计划下该位置的代价和下推后的代价计算差值。如果下推后总体代价更小且减少幅度超过一个阈值项目里设为5%避免无意义的抖动则判定为下推有效。第五阶段冲突消解。多个条件同时下推可能产生互相影响比如两个条件下推后都要物化同一批中间数据这时候需要合并物化节点或者选其中一个更优的下推避免重复浪费。def should_pushdown(origin_cost, pushed_cost, threshold0.05): if pushed_cost 0: return False savings (origin_cost - pushed_cost) / origin_cost return savings threshold这个流程看着简单但真正跑起来后第五阶段是最容易出问题的。比如两个条件下推路径不同但都会诱发同一张表提前物化结果合到一起反而比不下推更贵。所以冲突消解的优先级判断用的是“先比总代价再比局部收益”不能贪多。3.4 下推后的执行计划等价性校验宁可慢也不能错正确性永远比性能重要。项目里在下推决策通过后还会做一轮执行计划等价性校验。校验的核心是确认下推前后的查询语义一致。具体做法是对原始计划和优化执行计划生成两棵逻辑树做结构化的遍历比较重点检查以下几个方面。一是连接结果集是否一致。如果下推条件改写了连接语义比如把内连接条件下推到外连接的内部表可能导致空值行被错误过滤这类必须拦截。二是聚合和去重语义是否保持。如果条件下推到了GROUP BY或DISTINCT的下层导致输入行数变化但分组键未变结果一般没问题但如果条件中引用了聚合结果就不能无脑下推因为聚合输出的行和原始输入行不是一一对应的。三是对子查询的关联性判断。相关子查询里的连接条件如果下推位置越过关联边界会导致引用外层列时计算上下文错误这会直接报错或产出脏数据。这个校验阶段在项目里是用一组覆盖了50多个典型查询模板的回归测试来兜底的。每个模板都包含原始SQL、下推前的期望结果、下推后的实际结果自动化跑批量对比。初期几乎每天都能抓到三五个语义破坏的案例基本都出在OR条件和NULL语义的组合上等到后期才逐渐稳定下来。4. 实操过程与关键案例从TPC-H到线上业务SQL的完整验证4.1 环境准备与测试基准整个项目跑在标准Linux服务器上数据库采用类MySQL架构的开源分支存储引擎为InnoDB内存配置128GBCPU为32核。测试基准选用TPC-H的SF100数据集同时从线上抽样了100条真实慢SQL作为补充。TPC-H的好处是它提供了明确的业务场景和固定的数据分布跑出来的执行计划变化容易横向对比。但它的短板是查询模板相对固定覆盖不到线上那些“歪七扭八”的写法。所以线下用TPC-H验证正确性线上用真实慢SQL验证收益。搭建测试环境时有几个细节值得注意统计信息的采集粒度要调高尤其是大表的分区统计不能让优化器只看全局分布。直方图的采样率需要根据表行数动态调整千万级表采样率建议在百万行以上太小覆盖不了长尾数据。配置代价权重时先用默认权重跑一轮观察计划形态有没有明显不合理的地方再微调。4.2 TPC-H Query 5的完整下推过程拆解TPC-H Query 5是最经典的多表连接查询之一涉及6张表带地区过滤和分组聚合。原始SQL简化后大致如下SELECT n.n_name, SUM(l.l_extendedprice * (1 - l.l_discount)) AS revenue FROM customer c JOIN orders o ON c.c_custkey o.o_custkey JOIN lineitem l ON o.o_orderkey l.l_orderkey JOIN supplier s ON l.l_suppkey s.s_suppkey JOIN nation n ON c.c_nationkey n.n_nationkey AND s.s_nationkey n.n_nationkey JOIN region r ON n.n_regionkey r.r_regionkey WHERE r.r_name ASIA AND c.c_custkey IN ( SELECT o2.o_custkey FROM orders o2 WHERE o2.o_orderdate 1994-01-01 AND o2.o_orderdate 1995-01-01 ) GROUP BY n.n_name;在未开启下推优化时优化器选择了从orders表先做日期过滤然后去join lineitem再把结果和customer、nation、region逐层连接。问题在于r.r_name ASIA和n.n_regionkey r.r_regionkey这两个条件没有提前压缩nation和region的参与规模导致中间结果集膨胀得厉害。开启基于代价的下推后执行计划变成了这样先通过region表过滤出r_name ASIA的行此时只有一行。将n.n_regionkey r.r_regionkey下推到nation表连接之前nation表只保留ASIA区域对应的少数行。进一步将c.c_nationkey n.n_nationkey下推到customer表扫描后的过滤阶段customer表参与后续连接前已经被压缩到只剩ASIA区域的客户。s.s_nationkey n.n_nationkey同样下推到supplier表扫描阶段supplier表只留下ASIA区域的供应商。这四下推完成后整个6表连接变成了“小表先聚拢大表带条件进连接”的形态。实测下来这条查询的耗时从28.4秒降到了7.2秒提升约4倍。更重要的是中间结果集从千万级降到了十几万行内存和临时磁盘的消耗都大幅下降。这个案例直观说明了一个道理连接条件下的核心价值在于改变整个计划的中间数据流走向而不仅是“过滤条件提前”这一件事。4.3 线上真实SQL优化案例OR条件下推的收益与陷阱TPC-H跑通了之后我开始拿线上慢SQL做验证。有个典型案例让我印象很深它长这样SELECT * FROM trade_order t LEFT JOIN user u ON t.user_id u.id LEFT JOIN refund r ON t.order_no r.order_no WHERE (t.status PAID OR t.status REFUNDING) AND (r.refund_status IS NULL OR r.refund_status IN (WAIT, DONE));这个SQL本身逻辑不算复杂但OR条件的引入让优化器犯了难。在下推优化前它倾向于把t.status IN (PAID, REFUNDING)先过滤出来形成约几十万行的中间结果然后左连接user和refund。问题在于refund表上的r.refund_status过滤条件无法提前参与导致左连接时refund表被全表扫描探测。基于代价的下推逻辑在这里做了一次尝试把(r.refund_status IS NULL OR r.refund_status IN (WAIT, DONE))尝试下推到refund表扫描阶段。这个条件本身可以用r.refund_status IN (WAIT, DONE) OR r.refund_status IS NULL重写变成refund表上的一个过滤谓词使得refund表在参与连接之前就只保留符合状态的行。但由于这是LEFT JOIN下推这个条件到refund表内部时存在NULL语义风险。如果直接过滤掉不符合条件的refund行LEFT JOIN后原本保留的NULL补强行为了保持语义就必须对“未匹配行”额外生成NULL扩展。这会导致两个后果一是过滤本身省掉了一些无意义的refund行二是NULL补行增加了连接输出的复杂度。最终代价对比后系统选择了一个折中方案对refund表先做状态过滤但只在连接时把过滤结果保存为物化临时表并且将r.refund_status IS NULL的语义通过一个额外的标志位保留。这样既压缩了探测规模又保持了LEFT JOIN的输出语义。实测这条SQL从原来的6.8秒降到2.3秒收益明显。但这次实践也暴露出一个重要教训带NULL语义的OR条件下推必须非常谨慎地处理NULL补行的生成逻辑否则很容易得到错误结果。后续我在等价性校验里专门增加了一类测试用例用于覆盖LEFT JOIN OR条件 NULL语义的组合。4.4 参数调优与执行计划观察技巧调试过程中我习惯用以下方式观察下推是否生效第一看执行计划中过滤条件的位置。如果条件出现在了“表扫描”节点下方或紧贴扫描节点说明下推成功如果条件出现在高层连接节点之上说明没推下去或者推了但被回退。第二看每个节点的rows估算值。对比下推前后估算行数的变化能快速判断基数估算是否准确。如果估算行数严重偏离实际行数问题往往出在统计信息或直方图上。第三看中间临时表是否被创建。物化操作是代价模型中最敏感的一环如果某个条件下推后反而触发了大量临时表落盘那不是省了代价而是增加了代价需要调整下推的成本阈值。我还习惯把下推前后的执行计划用树状文本形式打印出来逐层对比这样能直观看到每个算子的输入行数和代价权重。项目里专门写了辅助脚本把EXPLAIN输出解析成可读的缩进树方便一眼定位异常节点。另外有一个很实用的排查技巧打开优化器的Trace日志查看每个下推条件的“决策理由”。它会记录该条件下推前的估算代价、下推后的估算代价、节省比例、是否被冲突消解覆盖等关键信息。这个Trace在初期调试中帮了大忙几乎每一条异常决策都能在Trace里找到原因。5. 常见问题与排查技巧实录5.1 统计信息不准导致下推误判这是发生率最高的问题。直方图没更新、多列统计缺失、采样率太低任何一个环节出问题代价估算就会跑偏。排查技巧是对比EXPLAIN里的rows和实际执行的行数。如果差异超过3倍下推决策基本不具备参考价值。解决方案也比较直接手动触发统计信息更新例如执行ANALYZE TABLE。对高频查询涉及的表开启自动化统计采集任务。关键的倾斜列单独建高频值直方图。5.2 下推后执行计划出现回退或反复有时候下推决策已经在计划里生效了但实际跑计划时优化器又把它回退掉了。这通常是因为下推后的子计划触发了其他代价更高的算子比如排序或物化。排查方式是看Trace里该下推条件的最终决策状态如果显示“pushed down but reverted”就要检查它的下推位置是不是和另一个更优的执行计划产生冲突。多见于多个条件下推后中间结果被两次物化的场景。解决办法是调整冲突消解的优先级策略或者适当调低下推收益阈值不要追求“所有条件都推”而是追求“推了以后整体更优”。5.3 结果集语义不一致这类问题最危险早期几乎都出在NULL值和OR条件组合上。比如上面提到的LEFT JOIN场景一旦条件被推到右表内部NULL扩展逻辑必须同步调整。排查方法很简单对同一查询强制关闭下推功能跑一遍结果再开启下推跑一遍逐行比对两批结果集。项目里把这种“开关对比测试”做成了自动化每次代码变更后全量跑一遍避免回归。5.4 代价模型对超大查询的超时优化当查询涉及十几个表连接时下推候选路径的枚举量会爆炸式增长。一个原子条件下推的位置可能有四五种可能十几个条件组合起来路径数量就是指数级。那段时间我为了控制枚举规模引入了剪枝策略先按单条件收益排序只对收益最大的前N个条件做组合枚举。这个剪枝在90%的场景下不影响结果但能显著缩短优化器决策时间避免优化本身变成新的瓶颈。N的取值建议在5到8之间太小容易漏掉有组合收益的场景太大优化时间又会失控。5.5 常见问题速查表现象可能原因排查建议下推后变慢索引失效或物化溢出查看执行计划是否出现高代价物化节点下推决策不生效命中禁止下推清单检查是否存在UDF、窗口函数或非确定表达式估算行数和实际相差过大统计信息过期或直方图缺失更新统计重建直方图LEFT JOIN结果集不一致NULL语义处理错误开关对比测试定位异常节点优化器决策时间超长候选路径爆炸启用剪枝策略限制组合枚举数多条件下推互相冲突重复物化同一批数据调整冲突消解优先级6. 项目落地后的效果与个人实操体会项目从设计到上线前后跑了两个多月最终的效果数据我简单列一下500条线上慢SQL优化后平均单条查询耗时下降约52%。TPC-H SF100下22条查询里13条有明显提升5条无变化4条有微小回退但可通过代价阈值配置压平。优化器本身决策耗时增加平均控制在30ms以内没有对短查询造成明显额外负担。下推功能的开启率在线上达到95%剩余5%集中在命中禁止清单或代价倒挂的场景。这套方案的实际收益并不只是“查询变快了”这一个维度。它更大的价值是让优化器开始真正理解代价而不是靠死规则碰运气。以前调SQL完全靠人肉经验现在很多场景下数据库自己就能选出更优的连接路径DBA的重复劳动大幅减少。我个人在实际操作中最深的体会是连接条件下推不是一个二元决策而是一个带代价权衡的连续决策。很多时候条件能推但推了未必划算有时候明面上亏一点却为后续连接顺序优化创造了空间。这套系统的核心不是把“下推”做成开关而是把它做成一个可以被代价模型直接度量的优化动作。如果你也想在自己的项目里落地类似方案我的建议是三步走先把基数估算做扎实再搭一个可解释的代价计算框架最后才做下推决策和冲突消解。顺序反了的话后面会不断回头补课别问我怎么知道的。最后再分享一个小技巧调试这类优化器特性一定要保留“开关关闭”的执行路径作为对照。我日常上线时不会彻底移除旧逻辑而是通过session级的配置项控制新优化是否生效。这样一旦线上出问题随时可以秒级切换回旧策略同时利用对比结果快速定位新逻辑的薄弱点。这个操作在几次紧急回滚里都保住了系统的可用性算是最值得推荐的一个工程习惯。

相关新闻

Git忽略机制全解析:.gitignore与.git/info/exclude的优先级和实战

Git忽略机制全解析:.gitignore与.git/info/exclude的优先级和实战

做Git项目最烦的事情之一,就是 git status 一刷出来,满屏的 untracked files: node_modules 、 target 、 .idea 、 *.class 、 .log ,又占地方又晃眼。更坑的是,你明明只想提交自己的代码,手一…

2026/10/1 19:44:19 阅读更多 →
显存不够?先测量再决策:LLM训练优化实战

显存不够?先测量再决策:LLM训练优化实战

做 LLM 训练调优这几年,我最大的感觉是:很多人一碰到显存不足就急着改代码、调参数,甚至直接换大卡,却很少有人先做一件事——把显存占用“测”清楚。这篇是“大模型显存优化篇”的 task3,核心就两个字:测量…

2026/10/1 19:43:18 阅读更多 →
从零开始落地AI工程:数据、实验、部署与监控全链路指南

从零开始落地AI工程:数据、实验、部署与监控全链路指南

"ai-engineering"这个词现在热度很高,但你要是去问十个自称做AI工程的人"你具体在做什么",大概率能收获十种完全不同的答案。有人觉得是调API、套LangChain,有人觉得是训模型、调超参,还有人觉得是写推理代码…

2026/10/1 19:43:18 阅读更多 →

最新新闻

Trivy 0.70.0 Windows x64 安装包下载:扫描工具 ZIP 与数据库准备

Trivy 0.70.0 Windows x64 安装包下载:扫描工具 ZIP 与数据库准备

Trivy 0.70.0 Windows x64 下载入口 入口会先显示草料跳转提示页,确认目标是夸克网盘后点击“继续访问”。本文整理的是 0.70.0 固定旧版本,适合需要该版本的用户,不代表当前最新版。 下载前核对文件 文件名:trivy_0.70.0_wind…

2026/10/1 20:24:42 阅读更多 →
PowerShell安装配置与Tab补全实战指南

PowerShell安装配置与Tab补全实战指南

1. 为什么PowerShell不是“另一个命令行”,而是Windows系统能力的解锁钥匙PowerShell不是cmd.exe的升级版,也不是Linux bash在Windows上的简单移植。它是一套以对象流为核心设计的自动化平台,底层直接调用.NET Framework或.NET Core的类库&am…

2026/10/1 20:24:42 阅读更多 →
OpenClaw在Windows 11上的详细安装教程:从环境准备到TaoToken接入

OpenClaw在Windows 11上的详细安装教程:从环境准备到TaoToken接入

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

2026/10/1 20:24:42 阅读更多 →
WSL2 配置实录:从虚拟机平台到 Docker、GPU 开发环境的完整流程

WSL2 配置实录:从虚拟机平台到 Docker、GPU 开发环境的完整流程

一份完整的 WSL2 配置记录,我每次换新笔记本都要拿着这套流程跑一遍。现在微信上动不动就有同事问“WSL2 到底怎么装”“为什么我装完一堆报错”,与其一次一次截图讲,不如把完整的过程、参数和踩过的坑都写下来。这篇文章不讲花架子&#xff…

2026/10/1 20:24:42 阅读更多 →
在线光谱分析仪选型怎么看?从功能定位到行业适配解读

在线光谱分析仪选型怎么看?从功能定位到行业适配解读

在线光谱分析仪选型怎么看?从功能定位到行业适配解读在化工、精细化工、新材料、医药等流程制造企业的日常运营中,光谱分析仪器承担着至关重要的角色——无论是原料进厂的质量把关、生产过程中的浓度监测,还是成品出厂前的指标验证&#xff0…

2026/10/1 20:24:42 阅读更多 →
Agent Skills 概览:用 SKILL.md 给 AI 智能体装上可复用技能包

Agent Skills 概览:用 SKILL.md 给 AI 智能体装上可复用技能包

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

2026/10/1 20:23:42 阅读更多 →

日新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05: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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →