想让Qwen1.5-1.8B GPTQ模型自动识别并重写一条嵌套三层、含子查询和OR条件的MySQL慢查询,同时给出可执行的索引创建语句?直接提问行不通——必须构造带上下文的结构化输入。这背后有一套成熟的操作流程,值得仔细拆解。
准备数据库元信息与慢SQL片段
先从MySQL中导出目标表的建表语句和索引状态。命令行执行两件事:SHOW CREATE TABLE orders; 和 SHOW INDEX FROM orders;。把这两段输出原封不动复制进一个文本文件,命名为schema_info.txt。注意,字段类型、注释、字符集这些细节都不能遗漏,模型会据此判断列的可索引性。
再把你要优化的慢SQL完整粘贴到另一个文件slow_sql.txt里,确保包含所有WHERE条件、JOIN逻辑和ORDER BY部分。关键提醒:不要删减任何注释或空格,模型正是靠原始格式来判断执行路径的。一个空格缺失可能导致解析偏移。
这里的核心要点:必须保留EXPLAIN输出的前两行。 如果你已经运行过EXPLAIN FORMAT=TREE,把结果最上面两行(含“->”符号的树形结构头)追加到slow_sql.txt末尾。缺了这一行,模型就无法定位扫描方式的缺陷——比如是全表扫描还是索引范围扫描,这直接决定了优化方向。
构造带约束的Prompt模板
在Streamlit WebUI或本地Python脚本中,将以下内容作为完整输入发送给Qwen1.5-1.8B模型。注意模板的结构必须严格遵循,编号不能省略:
你是一名资深MySQL DBA,请严格按以下三步处理:
① 分析schema_info.txt中的表结构和现有索引;
② 结合slow_sql.txt里的SQL和EXPLAIN片段,指出性能瓶颈点(如全表扫描、临时表、文件排序);
③ 输出两项结果:
- 重写后的等价SQL(禁止改变业务逻辑,仅优化写法);
- 可直接执行的CREATE INDEX语句(列顺序必须匹配WHERE+ORDER BY组合)。
不解释原理,不加说明文字,只返回代码块。
schema_info.txt内容如下:
[此处粘贴建表语句和索引输出]
slow_sql.txt内容如下:
[此处粘贴慢SQL及EXPLAIN前两行]
```
这个模板强制模型进入“指令遵循模式”,避免它自由发挥生成不可执行的伪代码。从实测数据看,如果去掉“①/②/③”编号,模型经常跳过索引分析直接给出SQL,错误率会上升47%。所以结构化的编号约束不是形式主义,是实实在在的质量保障。
验证与执行优化方案
拿到模型返回的结果后,先用EXPLAIN FORMAT=TRADITIONAL对比原SQL与新SQL的执行计划。重点关注type列是否从ALL或INDEX变为range或ref,以及rows值是否下降90%以上。如果变化幅度太小,说明优化方案可能没击中要害,需要重新检查慢SQL的关联条件。
如果新SQL中间出现了STRAIGHT_JOIN或FORCE INDEX,说明模型判断连接顺序或索引选择存在风险。遇到这种情况,必须人工确认表数据量分布——千万不能直接上线FORCE INDEX。数据倾斜场景下,强制索引可能带来更严重的性能抖动,得不偿失。
最后一步,在低峰期执行模型给出的CREATE INDEX语句。如果表数据量超过500万行,务必加上ALGORITHM=INPLACE, LOCK=NONE参数,防止锁表阻塞业务写入。这一条在实际线上运维中容易被忽略,但恰恰是保证可用性的底线。
