*Redis FT.EXPLAIN 命令

FT.EXPLAIN 返回 RediSearch 查询的执行计划,帮助理解查询如何执行和优化。


*语法

FT.EXPLAIN index query
  [DIALECT dialect]
  [PARAMS name value [name value ...]]

*参数说明

参数 类型 必填 说明
index String 索引名称
query String 查询字符串
DIALECT Integer 查询语法版本(1 或 2)
PARAMS Keyword 查询参数替换

*返回值

  • String:查询执行计划字符串(人可读格式)

*时间复杂度

O(1),仅解析查询生成计划,不执行查询。


*示例

*基本查询计划

> FT.EXPLAIN idx:products "redis"
"INTERSECT {\n  redis\n}\n"

*复杂查询计划

> FT.EXPLAIN idx:products "(phone | tablet) @price:[100 500]"
"INTERSECT {\n  UNION {\n    phone\n    tablet\n  }\n  NUMERIC {100.000000 <= @price <= 500.000000}\n}\n"

*使用 DIALECT 2

> FT.EXPLAIN idx:products "@name:(redis*)" DIALECT 2
"TAG:@name {\n  PREFIX {redis*}\n}\n"

*常见错误

错误 原因 解决
Index not found 索引不存在 确认索引名称
Syntax error 查询语法错误 检查查询字符串格式

*最佳实践

  • 查询性能异常时,先用 EXPLAIN 分析执行计划
  • 关注 UNION(并集)和 INTERSECT(交集)操作,复杂的组合可能慢
  • 使用 DIALECT 2 查看新语法执行计划
  • 对比不同查询变体的计划,选择最优写法

*FAQ

Q1: FT.EXPLAIN 和 FT.EXPLAINCLI 有什么区别? A: EXPLAIN 返回字符串格式计划;EXPLAINCLI 返回更易读的格式化输出(带缩进和换行)。

Q2: 执行计划中的 UNION 和 INTERSECT 是什么意思? A: UNION 表示取多个条件的并集;INTERSECT 表示取多个条件的交集。越多 INTERSECT 通常性能越好(过滤快),越多 UNION 可能越慢。

Q3: 可以获取聚合查询的执行计划吗? A: 不能,FT.EXPLAIN 仅适用于 FT.SEARCH 查询。

Q4: 执行计划能反映实际执行时间吗? A: 不能,仅显示逻辑执行计划,不显示实际耗时。实际耗时需通过 FT.PROFILE 获取。