基于大模型的MySQL智能SQL助手
一、项目简介
InnoAI SQL助手 是一套融合大模型与MySQL运维能力的智能工具。简单说就是:你用自然语言描述需求,它自动生成SQL、执行查询、还能给你做业务数据解读;你丢给它一条SQL,它自动跑EXPLAIN、分析性能瓶颈、输出索引优化和改写方案。
三大核心能力:
自然语言转SQL:说人话就能查数据,自动拦截增删改,只读安全
自动查询+AI解读:表格化输出结果,大模型秒变数据分析师
SQL性能调优:解析执行计划,直接给可执行的索引优化方案
技术栈: MySQL 8.0 + Python 3.11 + 腾讯云TokenHub(DeepSeek/Qwen大模型)+ Streamlit
二、整体架构
系统采用四层分层架构,每层职责清晰,方便维护和扩展:
| 层级 | 核心文件 | 职责 |
|---|---|---|
| 接入层 | 终端 / Streamlit Web | 两种使用入口,适配不同场景 |
| 业务层 | main.py | 总调度,串联三大核心业务流程 |
| 能力层 | prompts.py / mysql_client.py | 提示词工程 + 数据库操作封装 |
| 基础设施层 | MySQL 8.0 / TokenHub大模型 | 数据存储 + AI能力输出 |
5个核心文件分工:
-
main.py— 业务总调度 + 命令行交互入口 -
web_main.py— Streamlit Web可视化界面 -
prompts.py— 提示词统一管理 + SQL提取工具 -
mysql_client.py— MySQL连接/查询/执行计划封装 + 安全校验 -
.env— 数据库账号、API密钥等敏感配置(600权限加固)
三、核心功能实现
3.1 自然语言转SQL(NL2SQL)
处理流程:
自然语言输入 → 提示词模板 → 大模型生成SQL → 提取纯净SQL → 7层清洗标准化 → 安全校验 → 执行查询 → AI业务总结
提示词设计是关键,严格约束模型只输出SELECT、只用指定字段、用代码块包裹:
NL_TO_SQL_PROMPT = f"""
你是严谨的 MySQL 8.0 数据库开发工程师。
【表结构参考】
{TABLE_SCHEMA}
【强制输出规则】
1. 只能生成 SELECT 查询语句,禁止增删改
2. 只能使用列出的5个字段,禁止编造字段
3. SQL关键字统一大写,用中文别名
4. 最终SQL包裹在 ```sql ``` 代码块内
5. 只返回纯SQL,不输出任何解释文字
【用户需求】
{user_input}
"""
SQL清洗7层逻辑,解决各大模型输出格式不一致的问题:
-
特殊空格统一替换(全角/零宽/换行 → 普通空格)
-
不可见控制字符清除
-
中文标点批量转英文
-
多空格合并
-
别名内部空格精准清理
-
关键字粘连自动拆分补空格
-
关键字大写标准化
3.2 SQL性能调优分析
输入一条SELECT,系统自动跑EXPLAIN,然后大模型分析执行计划给出优化方案:
SQL_TUNE_PROMPT = f"""
你是资深 MySQL DBA 性能优化专家。
【待分析SQL】{sql_input}
【执行计划数据】{explain_data}
【输出要求】
1. 点明核心性能问题(全表扫描/无索引/文件排序等)
2. 给出可直接执行的建索引SQL
3. 提供SQL改写优化方案
4. 分点罗列,简洁明了
"""
能识别的典型问题:
type=ALL 全表扫描
key=NULL 无索引命中
Using temporary 临时表开销 Using filesort 文件排序
自动建议覆盖索引、联合索引
3.3 安全防护
双重安全机制:
-
提示词层面:明确要求只生成SELECT语句
-
代码层面:执行前正则匹配危险关键字(INSERT/UPDATE/DELETE/DROP/ALTER等),命中直接拦截
@staticmethod
def _check_sql_safety(sql: str) -> None:
danger_keywords = ["INSERT", "UPDATE", "DELETE", "DROP",
"ALTER", "CREATE", "TRUNCATE", "REPLACE"]
for kw in danger_keywords:
if re.search(r'\b' + re.escape(kw) + r'\b', sql_trim):
raise Exception(f"安全拦截:禁止执行 {kw} 类型语句")
四、大模型接入方案
选用腾讯云TokenHub大模型聚合平台,兼容OpenAI接口标准,一套代码可切换多款模型。
优势:
一个密钥调用DeepSeek、Qwen等多款主流模型
兼容OpenAI SDK,开发成本几乎为零
统一计费、统一运维
腾讯云基础设施保障高可用
踩坑提醒:尽量选不带"思考链"的模型(如deepseek-v4-pro、qwen3.5-plus),否则思考内容会混入输出,导致SQL提取失败。
.env配置示例:
# MySQL配置 MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 MYSQL_USER=root MYSQL_PASSWORD=123456 MYSQL_DB=testdb # 大模型配置 LLM_API_KEY=sk-你的密钥 LLM_BASE_URL=https://tokenhub.tencentmaas.com/v1 LLM_MODEL_NAME=deepseek-v4-pro LLM_TEMPERATURE=0
五、环境搭建速览
5.1 基础环境
# 系统初始化 sed -i '7s/enforcing/disabled/' /etc/selinux/config systemctl disable --now firewalld # 安装编译依赖 dnf install -y gcc gcc-c++ make cmake zlib-devel openssl-devel \ ncurses-devel sqlite-devel readline-devel libffi-devel
5.2 Python 3.11 源码编译
tar -zxvf Python-3.11.9.tgz && cd Python-3.11.9 ./configure --prefix=/usr/local/python3.11 --enable-shared make -j$(nproc) && make install # 配置动态链接库和软链接 echo "/usr/local/python3.11/lib" > /etc/ld.so.conf.d/python311.conf ldconfig ln -s /usr/local/python3.11/bin/python3.11 /usr/local/bin/python3 ln -s /usr/local/python3.11/bin/pip3.11 /usr/local/bin/pip3
5.3 MySQL 部署
# 初始化 bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data # 启动并改密码 bin/mysqld_safe --user=mysql & bin/mysql -u root -p mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123456'; # 建测试表 create table order_info( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID', user_id INT COMMENT '用户ID', order_name VARCHAR(200) COMMENT '商品名称', pay_amount DECIMAL(10,2) COMMENT '支付金额', create_time DATETIME COMMENT '下单时间' ) ENGINE=InnoDB;
5.4 安装Python依赖
pip3 install pymysql python-dotenv tabulate langchain langchain-openai streamlit
六、Web可视化界面
创建 systemd 后台常驻服务并且启动服务

用 Streamlit 把命令行工具一键变成Web面板,纯Python开发,不用写一行前端。左侧侧边栏切换功能,右侧展示结果,支持代码复制、表格渲染、AI解读卡片。

两大功能页面:
-
🔍 数据查询与总结 — 输入自然语言 → 生成SQL → 表格展示 → AI解读
-
⚙️ SQL性能调优 — 输入SQL → EXPLAIN分析 → 输出索引/改写方案
七、效果实测
测试1:自然语言查数据
输入:1001、1002、1003每个用户的订单总消费金额与订单笔数,按总消费从高到低排序
生成SQL并且查询结果:

| AI总结: 用户1002为核心高价值用户,客单价约为1003的3倍,建议VIP维系;3位用户订单笔数均为2单,复购节奏相似。 |
测试2:SQL性能调优
输入上面那条SQL,分析结果:
-
❌ 全表扫描(type: ALL),user_id无索引
-
❌ Using temporary + Using filesort,分组排序消耗额外资源
-
✅ 建议建覆盖索引:
ALTER TABLE order_info ADD INDEX idx_user_id_pay_amount (user_id, pay_amount);
八、总结与扩展
项目核心亮点:
-
✅ 四层分层架构,代码清晰易维护
-
✅ 双重安全防护(提示词约束 + 代码拦截)
-
✅ 兼容多款大模型,一套代码无缝切换
-
✅ 命令行 + Web双模式,开箱即用
可扩展方向:
多表JOIN查询支持
对话式多轮数据探索
慢查询日志自动批量优化
用户权限管理与数据隔离
更多推荐
所有评论(0)