optimize_or_like_chain
OR LIKE/ILIKE/match 谓词优化为单个 multiSearchAny/multiSearchAnyCaseInsensitiveUTF8 (用于 纯子串 %needle% 模式) 或 multiMatchAny (用于其他模式,在允许使用 Hyperscan/Vectorscan 时) 。如果这两种快速路径都不适用——例如 Hyperscan 被禁用或不可用,或者模式是原始 match Regex、不是有效的 UTF-8、包含嵌入的 NUL,或者 haystack 为 FixedString/Enum——则会保留原始 OR 事件链不变,因为基于 RE2 的合并 match 正则分支写法始终比原始的短路 OR 更慢。
该优化仅在启用 analyzer 时生效 (enable_analyzer = 1,默认值) ;使用旧 analyzer (enable_analyzer = 0) 时,OR 事件链保持不变。对于纯 LIKE/ILIKE/match 的 OR 事件链,原始表达式会保留在 indexHint() 中,以支持索引分析;对于包含非 LIKE 分支的混合 OR 事件链,则会有意跳过 indexHint() 包装,以避免仅匹配非 LIKE 分支的范围被剪枝。multiMatchAny 重写会遵循 allow_hyperscan、max_hyperscan_regexp_length、max_hyperscan_regexp_total_length 和 reject_expensive_hyperscan_regexps。
只有当事件链中有足够多的分支共享相同的左侧表达式,并且重写后能够稳定快于短路 OR 求值时,才会进行重写:对于 multiSearchAny 路径,至少需要 optimize_or_like_chain_min_substrings 个分支;对于 multiMatchAny 路径,至少需要 optimize_or_like_chain_min_patterns 个分支。
optimize_or_like_chain_min_patterns
LIKE/ILIKE/match 分支 (前缀/后缀/正则模式) ,这是 optimize_or_like_chain 将事件链重写为 multiMatchAny 所需的最小分支数。该值基于 hits 数据集校准 (参见 tests/performance/optimize_or_like_chain_hits.xml) :对于前缀/正则 LIKE 事件链,只有当分支数达到大约 9 个时,multiMatchAny (Hyperscan) 重写才会比短路 OR 求值更快,因此较短的事件链会保持原样,以避免性能退化。值为 0 或 1 时会禁用此阈值。禁用 optimize_or_like_chain 时,此设置不起作用。另请参见纯子串 (multiSearchAny) 路径对应的 optimize_or_like_chain_min_substrings。
optimize_or_like_chain_min_substrings
%needle%) LIKE/ILIKE 分支,只有当其数量达到该最小值时,optimize_or_like_chain 才会将条件事件链重写为 multiSearchAny/multiSearchAnyCaseInsensitiveUTF8。基于 hits 数据集校准 (参见 tests/performance/optimize_or_like_chain_hits.xml) :当分支数大约达到 4 个时,重写为 multiSearchAny 的性能会优于短路 OR 求值。值为 0 或 1 时会禁用此阈值。禁用 optimize_or_like_chain 时,此设置不起作用。正则表达式 (multiMatchAny) 路径请另见 optimize_or_like_chain_min_patterns。