基于大模型的数据库慢查询自动诊断与修复建议:从执行计划到索引优化的全链路
基于大模型的数据库慢查询自动诊断与修复建议:从执行计划到索引优化的全链路

一、慢查询的"黑箱诊断":DBA 排障的效率瓶颈
数据库慢查询是生产环境最常见的性能问题。一个查询从"正常"变为"慢",可能的原因包括:索引缺失、统计信息过期、数据倾斜、锁等待、缓冲池不足。传统的排障流程是:查看慢查询日志 → 分析执行计划 → 检查索引 → 调整参数。这个流程依赖 DBA 的经验,且每个步骤都需要手动执行。
大模型辅助的慢查询诊断,核心思路是:将查询 SQL、执行计划、表结构和索引信息输入大模型,自动分析性能瓶颈并生成修复建议。大模型可以理解执行计划中"全表扫描"与"索引扫描"的差异,判断"扫描行数远大于返回行数"意味着索引选择性差,并给出具体的索引创建语句。
二、AI 慢查询诊断的架构设计
flowchart TD
A[慢查询日志] --> B[提取 SQL + 执行时间]
B --> C[获取 EXPLAIN 执行计划]
C --> D[收集表结构 + 索引信息]
D --> E[大模型分析: 执行计划 + 上下文]
E --> F{瓶颈类型}
F -->|索引缺失| G[建议创建索引]
F -->|统计信息过期| H[建议 ANALYZE TABLE]
F -->|数据倾斜| I[建议分区或强制索引]
F -->|锁等待| J[建议拆分事务或降低隔离级别]
G & H & I & J --> K[生成修复 SQL + 风险评估]
K --> L[人工审核后执行]
三、AI 慢查询诊断的代码实现
3.1 慢查询信息采集
import pymysql
from dataclasses import dataclass
from typing import List, Optional
@dataclass
class SlowQueryInfo:
sql_text: str
execution_time_ms: float
rows_examined: int
rows_sent: int
explain_rows: List[dict]
table_schema: dict # 表结构
index_info: dict # 索引信息
class SlowQueryCollector:
"""慢查询信息采集器:从 MySQL 获取完整的诊断上下文"""
def collect(self, sql: str, schema: str) -> SlowQueryInfo:
conn = pymysql.connect(host='localhost', db=schema)
with conn.cursor() as cursor:
# 1. 获取执行计划
cursor.execute(f"EXPLAIN FORMAT=JSON {sql}")
explain_json = cursor.fetchone()[0]
# 2. 获取涉及的表结构
tables = self._extract_tables(sql)
table_schema = {}
for table in tables:
cursor.execute(f"SHOW CREATE TABLE {table}")
table_schema[table] = cursor.fetchone()[1]
# 3. 获取索引信息
index_info = {}
for table in tables:
cursor.execute(f"SHOW INDEX FROM {table}")
indexes = cursor.fetchall()
index_info[table] = [self._parse_index(idx) for idx in indexes]
# 4. 获取表统计信息
cursor.execute(
f"SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH "
f"FROM information_schema.TABLES WHERE TABLE_SCHEMA = %s",
(schema,)
)
return SlowQueryInfo(
sql_text=sql,
execution_time_ms=0,
rows_examined=0,
rows_sent=0,
explain_rows=explain_json,
table_schema=table_schema,
index_info=index_info,
)
3.2 AI 诊断引擎
class SlowQueryDiagnoser:
"""大模型驱动的慢查询诊断引擎"""
def diagnose(self, query_info: SlowQueryInfo) -> dict:
prompt = self._build_diagnosis_prompt(query_info)
response = self.llm_client.chat(prompt)
return self._parse_diagnosis(response)
def _build_diagnosis_prompt(self, info: SlowQueryInfo) -> str:
return f"""
你是数据库性能优化专家。请分析以下慢查询并给出修复建议。
## 查询 SQL
```sql
{info.sql_text}
执行计划
{info.explain_rows}
表结构与索引
{self._format_schema_info(info.table_schema, info.index_info)}
分析要求
- 识别执行计划中的性能瓶颈(全表扫描、临时表、文件排序等)
- 判断瓶颈根因(索引缺失、统计信息过期、数据倾斜等)
- 给出具体的修复建议(包含 SQL 语句)
- 评估修复风险(索引创建对写入的影响、锁等待风险等)
输出格式
-
bottleneck: 瓶颈描述
-
root_cause: 根因分析
-
fix_suggestion: 修复建议(包含 SQL)
-
risk_assessment: 风险评估
-
priority: HIGH/MEDIUM/LOW
"""def _format_schema_info(self, table_schema: dict, index_info: dict) -> str:
result = []
for table, ddl in table_schema.items():
result.append(f"### {table}\nsql\n{ddl}\n")
if table in index_info:
indexes = index_info[table]
result.append(f"索引: {', '.join(idx['name'] for idx in indexes)}")
return '\n'.join(result)
### 3.3 索引建议的风险评估
```python
class IndexRiskAssessor:
"""索引创建的风险评估器"""
def assess(self, table: str, index_columns: List[str],
table_rows: int, write_qps: int) -> dict:
# 1. 写入性能影响:每个索引增加约 5-10% 的写入开销
write_impact = len(index_columns) * 0.07 * write_qps
# 2. 存储开销:索引大小约为数据量的 20-40%
estimated_index_size_mb = table_rows * len(index_columns) * 50 / (1024 * 1024)
# 3. 在线创建风险:大表创建索引可能锁表
online_ddl_safe = table_rows < 10_000_000
return {
'write_impact_qps': write_impact,
'estimated_index_size_mb': round(estimated_index_size_mb, 2),
'online_ddl_safe': online_ddl_safe,
'recommendation': (
'可直接在线创建' if online_ddl_safe
else '建议使用 pt-online-schema-change 或 gh-ost 在线创建'
),
}
四、AI 慢查询诊断的边界分析与架构权衡
大模型对执行计划的理解深度。大模型可以识别"ALL"类型扫描为全表扫描,但对复杂执行计划(如多表 JOIN 的嵌套循环、子查询物化)的分析可能不够精确。建议将执行计划解析为结构化数据后再输入大模型,而非直接传入 JSON。
索引建议的适用性。大模型建议创建的索引可能在特定查询模式下有效,但对整体 workload 的影响未知。建议在测试环境使用真实 workload 验证索引效果,避免"治了慢查询但拖慢了整体写入"。
敏感 SQL 的隐私风险。生产 SQL 可能包含业务敏感信息(表名、字段名暗示业务逻辑)。输入大模型前应脱敏,或使用本地部署的模型。
适用边界:AI 慢查询诊断最适合索引优化和统计信息更新等常见场景。对于复杂的锁等待、死锁问题,仍需 DBA 结合 SHOW ENGINE INNODB STATUS 和 Binary Log 进行深度分析。
五、总结
基于大模型的慢查询自动诊断通过"采集 → AI 分析 → 风险评估"的流水线,将 DBA 的排障时间从小时级压缩到分钟级。落地时需关注大模型对执行计划的理解深度、索引建议的全局影响评估、以及敏感 SQL 的隐私保护。建议将 AI 诊断作为初筛工具,关键修复仍需 DBA 审核后执行。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)