MySQL EXPLAIN 怎么看 EXPLAIN 输出主要看这几个关键字段,我按重要性和常见坑点来讲。 核心字段速览 字段 含义 id 查询的执行顺序标识,id 越大越先执行(子查询、派生表会有不同 id) select_type 查询类型:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION 等 table 当前这一行对应的表 type 最重要 ,访问类型,反映查询效率 possible_keys 可能用到的索引 key 实际用到 的索引 key_len 索引使用的字节数,可以判断联合索引用了几列 rows 预估扫描行数(估算值,非精确) filtered 按条件过滤后剩余行的百分比 Extra 第二重要 ,很多关键信息都在这里 type 字段:从好到差的排序 system > const > eq_ref > ref > range > index > ALL system/const :主键或唯一索引等值查询,最快,基本只在单表单行时出现 eq_ref :多表连接时,被驱动表用主键/唯一索引做等值匹配(比如 a.id = b.a_id 且 b.a_id 是唯一索引) ref :普通索引的等值查询,可能返回多行 range :索引范围扫描,比如 > 、 < 、 BETWEEN 、 IN index :索引全扫描(遍历整棵索引树),比 ALL 好但依然要扫全部索引 ALL :全表扫描,一般需要优化 经验标准 :一般要求至少达到 range 级别,最好是 ref 或以上,看到大表出现 ALL 基本就要警觉了。 Extra 字段:常见情况解读 1. Using filesort(需要额外排序) 出现在 ORDER BY 无法利用索引顺序时,MySQL 需要在内存或磁盘中额外排序。 常见诱因 : - ORDER BY 的列没有索引 - 联合索引使用顺序和 ORDER BY 不一致 - WHERE 条件用了索引,但排序列不在索引里,且中间断了顺序性 优化思路 :建立能同时覆盖 WHERE 和 ORDER BY 的联合索引,让索引顺序和排序顺序一致。 2...
规则引擎的"算法"其实不是一个单一算法,而是三个简单机制拼起来的: 一、执行模型:责任链 + 短路求值 规则不是把所有维度一次性打分再综合判断,而是按类型(领取/门槛/叠加/计价)分成一条条链,链上的规则按优先级排好顺序,从头开始逐条求值。只要有一条不通过,立刻停止,后面的规则根本不会被执行。这样做两个好处:一是省计算,大部分场景第一条不通过的规则往往排在前面就能拦住;二是"因为哪条规则被拒绝"天然有唯一确定的答案,不会出现好几条规则都不通过、不知道该给用户看哪个原因的情况。 二、表达模型:统一接口 + 两种求值方式 所有规则背后都实现同一个"输入上下文、输出通过与否"的接口,但内部求值方式不同。结构化规则(互斥组、数量上限)本质是直接在代码里写好的逻辑判断,输入什么类型就按什么逻辑走。表达式规则则是运行时的一个小型解释器:配置的字符串在编译阶段被解析成一棵语法树,求值时对着这棵树递归计算,碰到"订单金额""用户等级"这类字段引用,就去当前上下文里取对应的值代进去。因为两者对外都是同一个接口,链上可以随意混排,规则引擎本身不需要关心某条规则到底是硬编码的还是配置出来的。 三、一致性模型:整体编译 + 原子替换 规则变更不是"改一条生效一条",而是把这一批新规则 整体 重新编译成一份全新的、不可变的规则集合,编译全部成功才用一个原子指针把"当前生效的规则集合"整体切换过去。切换的一瞬间,正在处理中的老请求仍然用切换前的那份规则跑完,不会出现跑到一半规则变了的中间状态;读取规则的一方也完全不需要加锁,只是读一个指针。这本质上是一种"整体重建、原子替换"的无锁方案,好处是新规则里哪怕只有一条写错导致编译失败,也是整批回退,不会出现新旧规则混杂生效的情况。 四、冲突检测:集合求交 规则之间是否矛盾,判断方式很朴素——把每个券模板所在的互斥组做成一个"模板 → 它所属的组"的索引,两个模板是否互斥,就看它们各自所在的组集合有没有交集;而"必须同时使用"和"不能同时使用"这两组模板 ID,如果本身就有重叠,那就是配置自相矛盾,直接在提交时拦截,不...