*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 获取。