要让Qwen精准分析MySQL执行计划,需四步:①用EXPLAIN FORMAT=JSON获取含统计信息的完整计划并刷新ANALYZE TABLE;②按版本、DDL、JSON、问题四段式结构化输入;③通过possible_keys、key_len计算、覆盖索引合理性三法验证输出真伪;④用新旧JSON对比闭环验证优化效果。
你想让Qwen大模型真正看懂MySQL的EXPLAIN输出,不是简单翻译“type: ALL”为“全表扫描”,而是让它指出哪一行索引失效、为什么key_len是32而不是48、为什么Extra里出现“Using temporary”意味着排序必须落盘——这需要把执行计划的原始字段、统计信息、表结构三者喂给模型,并约束它按数据库内核逻辑推理。
在MySQL客户端中执行:EXPLAIN FORMAT=JSON SELECT ...,必须用FORMAT=JSON而非传统表格格式。JSON格式包含key_length、rows_examined_per_scan、filtered等关键字段,而表格模式会丢失这些决策依据。
执行前先刷新统计信息:ANALYZE TABLE your_table;。MySQL优化器依赖统计信息估算成本,如果表数据已变更但统计未更新,Qwen分析出的“索引未生效”结论可能是假阳性。
【务必导出JSON结果中的"query_plan"和"table_data"两个顶层键】,丢掉"execution_context"这类运行时上下文——Qwen不需要知道你用的是MySQL 8.0.33还是Percona分支,它只依赖确定性计划结构。
不要直接扔一段JSON让模型“分析性能”。需强制结构化输入:
① 第一行写明MySQL版本(如:MySQL 8.0.33);
② 第二行给出表结构DDL(含ENGINE、ROW_FORMAT、所有索引定义);
③ 第三行粘贴完整的EXPLAIN FORMAT=JSON输出;
④ 最后一行用中文提出具体问题,例如:“为什么idx_user_status_time没有被用于ORDER BY?请比对key_len与索引列长度计算值。”
这四段式结构能让Qwen2.5-32B-Instruct准确绑定统计信息与索引定义。若省略表结构,它可能误判VARCHAR(255)字段实际存储长度为255字节,而真实平均长度仅12字节——这直接导致对filtered值的误读。
方法一:验证“索引未使用”的归因是否匹配possible_keys字段。如果Qwen说“应创建联合索引”,但possible_keys为空,说明WHERE条件存在函数操作(如WHERE YEAR(create_time)=2024),此时建索引无效——这是根本性错误,不是索引设计问题。
方法二:检查Qwen对key_len的解读。例如某索引定义为(user_id INT, status ENUM('a','b','c'), create_time DATETIME),Qwen指出“key_len=13说明只用了前两列”,这个判断正确;但若它说“key_len=13证明create_time未参与查询”,这就是错的——DATETIME在utf8mb4下固定占8字节,13=4+1+8,第三列实际已生效。
方法三:警惕“添加覆盖索引”的泛化建议。当Qwen建议INCLUDE (col1,col2)时,立刻反查SELECT字段列表。如果查询中有SELECT *且表有TEXT字段,覆盖索引会导致索引体积暴涨,反而触发更频繁的页分裂——这种建议必须结合Data_length和Index_length实际值判断。
执行优化后的SQL → 运行EXPLAIN FORMAT=JSON → 将新JSON与旧JSON并排输入Qwen → 要求它逐字段对比变化。重点观察:rows是否下降、key_len是否增大、Extra中“Using filesort”是否消失。
如果Qwen输出“优化后仍存在回表”,立即检查select_type是否为DERIVED。这意味着子查询被物化成临时表,此时索引优化无效——必须重写为JOIN或CTE,而不是继续调索引。
这一步操作起来很简单,直接把两次JSON结果拖进Qwen对话框就行。但注意:两次EXPLAIN必须在同一MySQL会话中执行,避免统计信息刷新导致的偏差。