前言

做电商运维经常遇到两大痛点:
1. 业务运营、产品不懂 SQL,每次查订单报表都要排队找开发,沟通成本极高;
2. DBA 日常重复分析慢查询 EXPLAIN 执行计划,判断全表扫描、索引缺失、文件排序等瓶颈,机械工作占用大量精力。

为此我基于openEuler + MySQL 8.0.45 + 腾讯云 TokenHub 大模型聚合平台,单人 3 天完成一套「InnoAI SQL 助手」,实现自然语言一键生成只读 SQL、自动查询出报表、AI 解读业务数据、自动解析执行计划输出索引优化方案,同时提供命令行 + Web 可视化双入口,敏感配置隔离、SQL 危险操作拦截,兼顾易用性与数据安全。

本文完整分享架构设计、环境部署、分层代码实现、功能实测、线上后台部署与踩坑总结,全部代码可直接复用。

一、项目整体概述

1.1 核心能力

1. NL2SQL 自然语言查询
- 仅生成 SELECT 只读语句,拦截 INSERT / UPDATE / DELETE / ALTER 等所有危险操作;
- 自动执行 SQL,表格化展示结果,大模型输出通俗易懂的业务总结;
- 严格绑定订单表结构,杜绝模型编造字段产生幻觉。

2. SQL 智能性能调优
- 自动获取 SQL 的 EXPLAIN 执行计划,解析全表扫描、临时表、文件排序等性能缺陷;
- AI 输出可直接复制执行的联合 / 覆盖索引 SQL、优化后重写语句、分级性能问题说明。

3. 双端交互入口
- 命令行终端:openEuler 服务器直接运行脚本,适合运维批量调试;
- Streamlit Web 可视化面板:浏览器访问,零前端代码,提供输入校验、代码一键复制、数据表格渲染;

4. 安全管控机制
- 数据库账号、LLM 密钥存放独立 .env 文件,设置 600 文件权限,代码无硬编码;
- SQL 前置安全校验,关键词黑名单拦截篡改类语句;
- 程序不打印明文密钥、数据库账号,异常捕获不崩溃。

1.2 技术栈清单

分层 技术选型 作用
底层系统 openEuler 2203 SP4 国产企业级服务器操作系统
数据库 MySQL 8.0.45 InnoDB 存储电商订单测试表 order_info
开发语言 Python 3.11.9(源码编译) 项目主体开发
数据库驱动 pymysql MySQL 连接封装
大模型服务 腾讯云 TokenHub 兼容 OpenAI 标准接口,支持 Qwen3.5-Plus、DeepSeek V4-Pro
LLM 调用 langchain-openai 标准化大模型请求封装
Web 可视化 Streamlit 快速搭建交互网页,无需前端开发
配置管理 python-dotenv 读取 .env 环境变量,隔离敏感信息
表格美化 tabulate 终端格式化打印查询结果

1.3 四层整体架构

1. 接入交互层
- 终端 CLI:main.py 交互式菜单;
- Web 页面:web_main.py Streamlit 可视化界面;

2. Python 核心业务层(分层解耦)
- main.py:总调度,封装 NL2SQL、SQL 调优公共逻辑,CLI / Web 共用;
- mysql_client.py:数据库统一封装,连接、查询、EXPLAIN、SQL 安全校验;
- prompts.py:统一管理两套提示词,内置 SQL 提取清洗工具;
- .env:独立配置文件,存放数据库、大模型密钥;

3. 数据持久层
openEuler 虚拟机 MySQL 8.0,testdb 库 order_info 订单测试表;

4. AI 大模型服务层
腾讯云 TokenHub 聚合网关,一套代码无缝切换多款开源大模型,统一鉴权计费。

1.4 3 天开发周期规划

- Day1:openEuler 系统初始化、Python 源码编译、MySQL 8 部署建表、TokenHub API 申请、梳理运维知识点;
- Day2:四层脚本开发、数据库连接封装、NL2SQL 提示词、SQL 调优逻辑、Web 页面联调;
- Day3:多场景业务测试、提示词优化、权限安全加固、systemd 后台服务部署、全量验收。

二、环境完整部署实操(openEuler)

2.1 系统初始化优化

关闭防火墙、SELinux、配置时间同步、安装编译依赖

# 关闭 SELinux
sed -i '7s/enforcing/disabled/' /etc/selinux/config
关闭防火墙并开机禁用
systemctl disable --now firewalld
修改主机名
hostnamectl set-hostname server
bash
配置阿里云时间同步
vim /etc/chrony.conf
server ntp.aliyun.com iburst
systemctl restart chronyd
chronyc sources
安装编译全套依赖
dnf install -y gcc gcc-c++ make cmake zlib-devel openssl-devel ncurses-devel readline-devel wget vim net-tools

2.2 源码编译 Python 3.11.9

避免系统自带 Python 版本过低,源码编译独立环境

cd /usr/local/src
上传 Python-3.11.9 源码包
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
验证
python3 -V
pip3 -V
配置阿里 pip 源
mkdir ~/.pip
vim ~/.pip/pip.conf
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
安装项目依赖
pip3 install pymysql python-dotenv tabulate langchain langchain-openai streamlit

2.3 MySQL 8.0.45 部署初始化

1. 解压安装、创建 mysql 用户、初始化数据库;
2. 修改 root 密码、新建 my.cnf 配置、配置 systemd 自启;
3. 创建 testdb 库、order_info 订单业务表,导入 20 条测试数据。

核心建表语句:

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 COMMENT='电商订单业务表';

插入 20 条电商订单测试数据,覆盖用户、金额、时间、商品品类多维度查询场景。

2.4 腾讯云 TokenHub 大模型配置

1. 腾讯云实名认证,进入 TokenHub 平台创建 API Key;
2. 推荐模型:Qwen3.5-Plus、DeepSeek-V4-Pro(无多余思考链,减少 SQL 解析报错);
3. 记录 API Key、统一 BaseURL 填入 .env 配置文件。

三、项目分层代码设计(核心模块讲解)

项目目录结构

/opt/mysql_ai_tools
├── .env             # 敏感配置(权限600)
├── main.py          # 核心业务调度+CLI终端入口
├── mysql_client.py  # MySQL数据库封装层
├── prompts.py       # 提示词管理+SQL提取工具
├── web_main.py      # Streamlit Web可视化页面
└── __pycache__

3.1 .env 配置文件(安全加固)

# MySQL 配置
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=123456
MYSQL_DB=testdb
TokenHub 大模型配置
LLM_API_KEY=sk-xxxx
LLM_BASE_URL=https://tokenhub.tencentmaas.com/v1
LLM_MODEL_NAME=qwen3.5-plus
LLM_TEMPERATURE=0

加固权限,防止其他用户读取密钥:

chmod 600 /opt/mysql_ai_tools/.env

3.2 mysql_client.py 数据库安全封装

核心亮点:
1. 静态 SQL 安全校验,黑名单拦截增删改、DDL 语句;
2. 封装 execute_query 执行只读查询、get_explain_plan 获取执行计划;
3. 统一异常捕获,自动释放数据库连接,避免连接泄露。

关键安全校验代码片段:

@staticmethod
def _check_sql_safety(sql: str) -> None:
    sql_trim = sql.strip().upper()
    danger_keywords = ["INSERT", "UPDATE", "DELETE", "DROP", "ALTER", "TRUNCATE"]
    for kw in danger_keywords:
        if re.search(r'\b' + re.escape(kw) + r'\b', sql_trim):
            raise Exception(f"安全拦截:禁止执行{kw},仅支持SELECT查询")

3.3 prompts.py 提示词工程层

两套标准化 Prompt 模板:
1. NL_TO_SQL_PROMPT:约束模型仅生成 SELECT、使用给定表字段、SQL 包裹在 ```sql ``` 代码块;
2. SQL_TUNE_PROMPT:传入表结构 + 原始 SQL + EXPLAIN 数据,输出性能问题、建索引语句、优化 SQL;

内置 extract_sql 工具函数,三层正则匹配提取纯净 SQL,兼容各类模型输出格式,解决模型多余文字干扰执行。

3.4 main.py 核心业务调度

两大核心对外函数(CLI / Web 共用无重复代码):

1. nl2sql_query(user_input)
- 流程:自然语言传入 LLM → 提取清洗 SQL → 数据库执行查询 → 调用大模型生成业务总结;
- 返回标准化字典:生成 SQL、查询表头、数据列表、业务解读、错误信息;

2. sql_tune_analyze(raw_sql)
- 流程:清洗 SQL → 获取 EXPLAIN 执行计划 → 传入大模型分析性能瓶颈;
- 返回执行计划明细、完整调优建议、可直接执行索引语句;

内置 clean_sql_spacing 工具,修复中文空格、全角标点、关键字粘连等模型输出语法 bug。

3.5 web_main.py Streamlit 可视化页面

无需前端开发,纯 Python 实现双功能面板:
1. 侧边栏展示项目名称、当前模型、功能切换导航;
2. 面板 1:自然语言转 SQL 查询,输入校验、生成 SQL 代码块、表格展示数据、业务解读;
3. 面板 2:SQL 性能调优,输入 SELECT 语句,展示完整 EXPLAIN 表格、AI 优化方案;
4. 自定义全局 CSS:优化代码复制按钮、表格排版、页面宽度,解决 Streamlit 原生 UI 简陋问题。

四、功能实测演示

4.1 场景 1:自然语言统计用户订单消费

输入需求:1001、1002、1003 每个用户的订单总消费金额与订单笔数,按总消费从高到低排序

AI 自动生成合规 SQL:

SELECT
  user_id AS 用户ID,
  SUM(pay_amount) AS 总消费金额,
  COUNT(id) AS 订单笔数
FROM order_info
WHERE user_id IN (1001, 1002, 1003)
GROUP BY user_id
ORDER BY 总消费金额 DESC

查询结果表格展示,AI 自动输出业务总结:区分高价值用户、分析复购行为、提示样本数据特征。

4.2 场景 2:SQL 性能自动调优

输入上述统计 SQL,工具自动执行 EXPLAIN,识别三大性能问题:
1. type=ALL 全表扫描(user_id 无索引);
2. Extra 存在 Using temporary、Using filesort(分组排序消耗 CPU);
3. 无覆盖索引,查询需回表读取 pay_amount;

AI 直接输出可落地优化方案:

ALTER TABLE order_info ADD INDEX idx_user_id_pay_amount (user_id, pay_amount);

同时给出优化改写 SQL,遵循 COUNT(*) 索引最优实践。

4.3 Web 页面访问效果

服务器 IP:8501 浏览器直接打开,侧边栏切换功能,输入框提交后自动渲染表格、代码块,支持一键复制 SQL 语句。

五、后台常驻部署(systemd 服务)

将 Streamlit 网页配置开机自启,后台持续运行

vim /etc/systemd/system/mysql-ai-web.service
[Unit]
Description=InnoAI SQL Streamlit Web 助手
After=network.target mysqld.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/mysql_ai_tools
ExecStart=/usr/local/python3.11/bin/python3 -m streamlit run web_main.py --server.address 0.0.0.0 --server.port 8501 --server.headless true
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target

启动并设置开机自启

systemctl daemon-reload
systemctl enable --now mysql-ai-web
查看运行状态
systemctl status mysql-ai-web

六、开发踩坑与解决方案

1. 模型输出带思考链,SQL 提取失败
解决:选择无思考链模型(Qwen3.5-Plus),Prompt 强制仅输出 SQL 代码块,多层正则清洗过滤多余文字;

2. 模型生成中文全角逗号、空格导致 MySQL 语法报错
解决:编写 clean_sql_spacing 统一替换全角符号、合并多余空白,标准化关键字格式;

3. .env 密钥明文泄露风险
解决:文件权限设 600,代码全程不打印配置明文,仅内存读取;

4. 数据库连接频繁泄露
解决:封装 close() 方法,所有业务逻辑放在 finally 块强制关闭连接;

5. Streamlit 代码复制按钮失效
解决:自定义 CSS 提升复制按钮层级,修复遮挡问题;

6. MySQL 8 编译 Python 缺失 ssl 模块,大模型 API 调用失败
解决:编译 Python 时安装 openssl-devel 依赖,编译后校验 ssl 模块可用性。

七、项目拓展优化方向

1. 增加 RAG 知识库,注入企业业务口径、表注释,降低模型幻觉;
2. 增加用户登录权限,区分只读 / 管理员账号;
3. 慢查询日志自动采集,批量分析多条慢 SQL;
4. 支持多表关联查询,扩展订单详情、商品表关联场景;
5. 增加 SQL 执行结果缓存,高频查询减少大模型与数据库请求;
6. 支持私有化本地大模型部署,不依赖第三方 API。

八、总结

本项目打通「国产 openEuler 系统 + MySQL 运维 + LLM 大模型 + Web 可视化」完整链路,用极低开发成本解决企业数据库两大高频痛点:业务人员自助查数、DBA 自动化 SQL 性能诊断。

整套工具轻量化、3 天即可落地,安全机制完善,同时提供命令行与网页双交互模式,适合中小企业运维、数据团队直接复用二次开发,是大模型落地数据库运维场景的典型实战案例。


#NL2SQL #MySQL性能优化 #openEuler #Streamlit #大模型实战 #数据库运维 #AI SQL助手 #Python实战

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐