告别手写 SQL!自研 InnoAI SQL 助手:自然语言转 MySQL、一键 SQL 调优,openEuler 完整落地教程
一,研发目的
1.业务、运营不懂 SQL,天天找开发写统计查询;
2.慢 SQL 逐个手动 EXPLAIN 分析、手动设计索引优化。
为此我基于openEuler + MySQL8.0.45 + Python3.11 + 腾讯云 TokenHub 大模型,单人 3 天开发一套轻量化智能 SQL 运维工具:InnoAI SQL 助手。 无需掌握 SQL,业务人员输入自然语言即可自动生成、执行只读 SQL;支持上传任意 SELECT 语句,自动解析执行计划输出索引优化方案,同时提供命令行 + Streamlit Web 双端交互,适配中小企业数据查询、数据库性能调优场景。
二,项目整体介绍
2.1核心功能
功能 1:自然语言转 MySQL 只读查询(NL2SQL)
- 输入中文业务描述,大模型自动生成合规
SELECT语句,强制拦截 INSERT/UPDATE/DELETE/ALTER等危险操作; - 自动执行 SQL,表格化展示查询结果;
- 调用大模型生成通俗易懂的业务数据分析总结,替代人工报表解读。
功能 2:SQL 自动性能调优
- 接收任意 SELECT 语句,自动执行
EXPLAIN获取完整执行计划; - AI 识别全表扫描、文件排序、无索引、临时表等性能瓶颈;
- 直接输出可落地的建索引 SQL + 优化后改写 SQL。
双端使用入口
- 命令行终端:openEuler 服务器交互式菜单,适合运维本地快速排查;
- Web 可视化面板:Streamlit 搭建网页,浏览器直接访问,图形化输入、一键复制 SQL、表格展示数据,非技术人员友好。
2.2技术架构分层

整体四层解耦架构,职责清晰,易于二次开发:
- 接入交互层:命令行 main.py + Streamlit Web 页面 web_main.py;
- Python 核心业务层
main.py:总调度,封装 NL2SQL、SQL 调优核心逻辑,双端共用;mysql_client.py:MySQL 统一封装,连接管理、SQL 安全拦截、EXPLAIN 获取;prompts.py:统一管理大模型提示词,内置 SQL 提取清洗工具;.env:独立配置文件,存储数据库、大模型密钥,600 权限加固防泄露;
- 底层数据持久层:openEuler 虚拟机 MySQL8.0.45,内置电商订单测试表
order_info; - AI 大模型服务层:腾讯云 TokenHub 聚合平台,兼容 DeepSeek V4 Pro、Qwen3.5-Plus,一套代码无缝切换模型。
2.3软硬件环境清单
| 分类 | 环境 | 版本参数 |
|---|---|---|
| 硬件 | 虚拟机 / 云 ECS | CPU≥2 核,内存≥4GB,磁盘≥20GB |
| 系统 | Linux | openEuler 2203_SP4 / RHEL9 |
| 数据库 | MySQL | 8.0.45 |
| 开发语言 | Python | 3.11.9(源码编译安装) |
| 大模型平台 | TokenHub | 兼容 OpenAI 接口标准 |
| Python 依赖 | pymysql、python-dotenv、langchain-openai、streamlit、tabulate | 数据连接、AI 调用、网页可视化 |
2.4环境全套部署流程(openEuler)
2.4.1 OpenEuler虚拟机的下载与安装(前面作者已经发过该怎么安装OpenEuler虚拟机,在这里就不演示了)
2.4.2 系统初始化配置
# 关闭SELinux
[root@server]vi /etc/selinux/config
enforcing --> disabled
[root@server]systemctl disable --now firewalld
# 修改主机名
[root@server]hostnamectl set-hostname server
[root@server]bash
# 配置阿里云时间同步
[root@server]vim /etc/chrony.conf
server ntp.aliyun.com iburst #在配置文件里面找一个空白地方写下这句话
[root@server]systemctl restart chronyd
[root@server]chronyc sources
# 安装编译依赖
[root@server]dnf install -y gcc gcc-c++ make cmake zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel libffi-devel tk-devel wget tar vim tree net-tools openssh-server
2.4.3源码编译安装 Python3.11.9
1>使用Xftp8上传python压缩包(注意在/usr/local/scr底下上传)

[root@server]cd /usr/local/src
# 上传Python-3.11.9.tgz源码包
[root@server]tar -zxvf Python-3.11.9.tgz
[root@server]cd Python-3.11.9
# 编译配置
[root@server Python-3.11.9]./configure --prefix=/usr/local/python3.11 --enable-shared
[root@server Python-3.11.9]make -j$(nproc) && make install
# 动态链接库配置
[root@server Python-3.11.9]echo "/usr/local/python3.11/lib" >/etc/ld.so.conf.d/python311.conf
ldconfig
# 全局软链接
[root@server Python-3.11.9]ln -s /usr/local/python3.11/bin/python3.11 /usr/local/bin/python3
[root@server Python-3.11.9]ln -s /usr/local/python3.11/bin/pip3.11 /usr/local/bin/pip3
[root@server Python-3.11.9]bash
# 验证
[root@server Python-3.11.9]python3 -V
[root@server Python-3.11.9]pip3 -V
[root@server Python-3.11.9]python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
# 配置阿里pip源
[root@server]mkdir ~/.pip
[root@server]vim ~/.pip/pip.conf
#配置文件里面应该写的东西
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
# 安装项目依赖
[root@server]pip3 install --upgrade pip
[root@server]pip3 install pymysql python-dotenv tabulate langchain langchain-openai streamlit
2.4.4MySQL8.0.45 部署与业务表初始化
1>解压 MySQL 二进制包,创建 mysql 用户、初始化数据库;
2>配置 systemd 开机自启;
3>创建测试库testdb、订单业务表order_info,导入 20 条测试订单数据
# 解压部署MySQL
[root@server~]tar -xvf mysql-8.0.45-linux-glibc2.28-x86_64.tar.xz
[root@server~]mv mysql-8.0.45-linux-glibc2.28-x86_64 /usr/local/mysql
[root@server~]cd /usr/local/mysql
[root@server mysql]groupadd mysql #创建名为mysql的用户组
# 创建mysql的系统用户,将其添加到mysql组中,并设置其不可登录,以限制该用户的登录权限
[root@server mysql]useradd -r -g mysql -s /sbin/nologin mysql
[root@server mysql]mkdir data #创建用于存放MySQL数据文件目录
[root@server mysql]chmod -R 750 data
# 设置mysql目录的账户及工作组,生产环境中不要使用root
[root@server mysql]chown -R mysql:mysql /usr/local/mysql
# 初始化,记录初始密码
[root@server mysql]bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data #注意需要复制最后的密码
# 后台启动
[root@server mysql]bin/mysqld_safe --user=mysql &
#重新开启一个终端
[root@server ~]# ps -ef | grep mysql # 查看进程运行状态
[root@server ~]# cd /usr/local/mysql
# 返回第一个终端,修改root密码
[root@server mysql]bin/mysql -u root -p
mysap> alter user 'root'@'localhost' identified with mysql_native_password by '123456';
#刷新
mysap>flush privileges;
mysql> use mysql; # 查看账户信息
mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
mysql>exit #退出数据库的程序
[root@server mysql]# ps -ef | grep mysql
[root@server mysql]# kill -9 pid号 # 在当前终端关闭运行的mysql
#设置MySQL的配置文件
[root@server mysql]# vim /etc/my.cnf # 新建配置文件,输入以下内容:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
tmpdir = /tmp
socket = /tmp/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
default-storage-engine=INNODB
log_error = error.log
# 配置启动脚本
[root@master mysql]# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=65535
LimitNPROC=65535
Restart=on-failure
RestartPreventExitStatus=1
TimeoutSec=0
[Install]
WantedBy=multi-user.target
[root@master mysql]# systemctl daemon-reload
[root@master mysql]# systemctl enable --now mysqld.service
#设置MySQL的命令识别
[root@server mysql]# vim ~/.bash_profile # 设置环境变量需添加如下语句
export PATH=$PATH:/usr/local/mysql/bin
[root@server mysql]# source ~/.bash_profile

1>测试

2>创建测试库
#创建测试库testdb、订单业务表order_info,导入 20 条测试订单数据
mysql> create database testdb;
mysql> use testdb;
-- 创建订单业务表
mysql> 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条标准测试数据
mysql> INSERT INTO order_info(user_id,order_name,pay_amount,create_time)
VALUES
(1001,'智能手机',2999.00,'2026-05-01 10:20:00'),
(1001,'有线入耳耳机',199.00,'2026-05-02 14:10:00'),
(1002,'14英寸轻薄笔记本电脑',5499.00,'2026-05-03 09:30:00'),
(1002,'无线蓝牙鼠标',89.00,'2026-05-03 09:35:00'),
(1003,'平板学习机',1799.00,'2026-05-04 11:05:00'),
(1003,'平板专用保护壳',49.00,'2026-05-04 11:08:00'),
(1004,'机械游戏键盘',349.00,'2026-05-05 16:42:00'),
(1004,'电竞头戴耳机',459.00,'2026-05-05 16:48:00'),
(1005,'大屏智能电视',3299.00,'2026-05-06 08:15:00'),
(1005,'电视壁挂支架',129.00,'2026-05-06 08:20:00'),
(1006,'无线快充充电器',129.00,'2026-05-03 13:22:00'),
(1006,'降噪蓝牙耳机',399.00,'2026-05-03 13:25:00'),
(1007,'电竞显示器',1899.00,'2026-05-07 10:10:00'),
(1007,'显示器增高支架',79.00,'2026-05-07 10:15:00'),
(1008,'折叠平板支架',39.00,'2026-05-04 15:30:00'),
(1008,'便携充电宝',159.00,'2026-05-04 15:33:00'),
(1009,'台式游戏主机',6999.00,'2026-05-08 09:05:00'),
(1009,'电竞防滑鼠标垫',59.00,'2026-05-08 09:08:00'),
(1010,'手机钢化膜',29.00,'2026-05-05 17:12:00'),
(1010,'桌面收纳支架',45.00,'2026-05-05 17:16:00');
-- 验证数据
mysql> select * from order_info;
+----+---------+-------------------------------+------------+---------------------+
| id | user_id | order_name | pay_amount | create_time |
+----+---------+-------------------------------+------------+---------------------+
| 1 | 1001 | 智能手机 | 2999.00 | 2026-05-01 10:20:00 |
| 2 | 1001 | 有线入耳耳机 | 199.00 | 2026-05-02 14:10:00 |
| 3 | 1002 | 14英寸轻薄笔记本电脑 | 5499.00 | 2026-05-03 09:30:00 |
| 4 | 1002 | 无线蓝牙鼠标 | 89.00 | 2026-05-03 09:35:00 |
| 5 | 1003 | 平板学习机 | 1799.00 | 2026-05-04 11:05:00 |
| 6 | 1003 | 平板专用保护壳 | 49.00 | 2026-05-04 11:08:00 |
| 7 | 1004 | 机械游戏键盘 | 349.00 | 2026-05-05 16:42:00 |
| 8 | 1004 | 电竞头戴耳机 | 459.00 | 2026-05-05 16:48:00 |
| 9 | 1005 | 大屏智能电视 | 3299.00 | 2026-05-06 08:15:00 |
| 10 | 1005 | 电视壁挂支架 | 129.00 | 2026-05-06 08:20:00 |
| 11 | 1006 | 无线快充充电器 | 129.00 | 2026-05-03 13:22:00 |
| 12 | 1006 | 降噪蓝牙耳机 | 399.00 | 2026-05-03 13:25:00 |
| 13 | 1007 | 电竞显示器 | 1899.00 | 2026-05-07 10:10:00 |
| 14 | 1007 | 显示器增高支架 | 79.00 | 2026-05-07 10:15:00 |
| 15 | 1008 | 折叠平板支架 | 39.00 | 2026-05-04 15:30:00 |
| 16 | 1008 | 便携充电宝 | 159.00 |2026-05-04 15:33:00 |
| 17 | 1009 | 台式游戏主机 | 6999.00 | 2026-05-08 09:05:00 |
| 18 | 1009 | 电竞防滑鼠标垫 | 59.00 | 2026-05-08 09:08:00 |
| 19 | 1010 | 手机钢化膜 | 29.00 | 2026-05-05 7:12:00 |
| 20 | 1010 | 桌面收纳支架 | 45.00 | 2026-05-05 17:16:00 |
+----+---------+-------------------------------+------------+---------------------+
20 rows in set (0.00 sec)
mysql> exit;
2.3.5腾讯云 TokenHub 大模型密钥申请
- 腾讯云官网注册、实名认证,进入 TokenHub 大模型平台;
- API Key 管理创建密钥,推荐模型:
deepseek-v4-pro、Qwen3.5-Plus(无多余思考链,避免 SQL 解析报错); - 记录
API Key、统一接口地址https://tokenhub.tencentmaas.com/v1,写入项目.env配置文件。


2.5项目完整源码解析
2.5.1 项目目录结构
[root@server mysql]# cd
[root@server ~]# mkdir -p /opt/mysql_ai_tools
[root@server ~]# cd /opt/mysql_ai_tools
[root@server mysql_ai_tools]# touch main.py mysql_client.py prompts.py web_main.py
.env
[root@server mysql_ai_tools]# tree -La 1
├── backup
├── .env #敏感配置文件(数据库+大模型密钥,权限600)
├── main.py # 项目核心调度、命令行交互入口
├── mysql_client.py # MySQL数据库封装、SQL安全拦截
├── prompts.py # 大模型提示词统一管理、SQL提取工具
└── web_main.py # Streamlit Web可视化页面
2.5.2 编写环境变量脚本 (权限加固)
[root@server ~]# vim /opt/mysql_ai_tools/.env
# MySQL数据库配置
# 数据库服务IP,本地运行填127.0.0.1,远程服务器替换对应公网/内网地址
MYSQL_HOST=127.0.0.1
# MySQL默认通信端口,未手动修改固定3306
MYSQL_PORT=3306
# 数据库登录用户名,测试环境默认root
MYSQL_USER=root
# 数据库登录密码,根据自己本地MySQL密码修改
MYSQL_PASSWORD=123456
# 项目专用数据库名,SQL查询仅操作该库下order_info表
MYSQL_DB=testdb
# 腾讯云TokenHub大模型配置
# TokenHub平台分配的API密钥,用于鉴权调用大模型,切勿泄露
LLM_API_KEY=sk-xxxx你的密钥 #这里主播没有放自己的密钥,写的时候放自己的密钥
# TokenHub统一接口地址,固定/v1后缀,兼容OpenAI标准SDK
LLM_BASE_URL=https://tokenhub.tencentmaas.com/v1
# 当前调用模型标识,切换DeepSeek v4 Pro只需改为deepseek-v4-pro
LLM_MODEL_NAME=deepseek-v4-pro
# 模型温度参数,0代表输出最严谨稳定,适合生成标准SQL,不产生随机偏差
LLM_TEMPERATURE=0
#配置文件权限加固,防止密钥泄露:
[root@server ~]# chmod 600 /opt/mysql_ai_tools/.env

2.5.3编写数据库连接脚本
[root@server ~]# vim /opt/mysql_ai_tools/mysql_client.py



2.5.4编写sql转换脚本
[root@server ~]# vim /opt/mysql_ai_tools/prompts.py



2.5.5. 编写程序入口脚本
[root@server ~]# vim /opt/mysql_ai_tools/main.py









三,项目测试
3.1功能实测演示
[root@server ~]# python3 /opt/mysql_ai_tools/main.py
============= InnoAI SQL 助手 =============
1. 自然语言生成SQL,自动查询并AI总结数据
2. 输入SQL语句,AI分析执行计划并给出调优方案
0. 退出程序
请输入功能序号:1

3.2 SQL性能调优实测
待优化 SQL:用户分组统计消费金额语句
- 自动获取 EXPLAIN 执行计划,识别
type:ALL全表扫描、Using temporary、Using filesort性能问题; - AI 输出覆盖索引创建语句
idx_user_id_pay_amount; - 提供优化后改写 SQL,消除临时表与文件排序,大数据量下大幅提升查询速度。
四.Web可视化
4.1安装python依赖
[root@server ~]# /usr/local/python3.11/bin/pip3 install langchain-openai streamlit
pymysql python-dotenv sqlparse tabulate
# 检查
[root@server ~]# /usr/local/python3.11/bin/python3 -c "import
langchain_openai;print('3.11依赖全部正常')"
3.11依赖全部正
4.2创建 Streamlit 可视化入口 web_main.py
[root@server ~]# vim /opt/mysql_ai_tools/web_main.py







4.3Web 后台常驻 systemd 服务配置
[root@server ~]# vim /etc/systemd/system/mysql-ai-web.service
[Unit]
Description=InnoAI SQL Streamlit Web Tool
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
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
#启动服务
[root@server ~]# systemctl daemon-reload
[root@server ~]# systemctl enable --now mysql-ai-web
4.4Windows网页访问测试
查看自己的ip
[root@server ~]# hostname -I
192.168.72.130
浏览器访问IP:192.168.72.130:8501

五,总结
本项目打通Linux 运维 + MySQL 性能调优 + Python 开发 + 大模型 NL2SQL四大技术栈,完整实现 AI 赋能数据库运维的轻量化解决方案。全部部署脚本、源码可直接复制运行,适合开发、DBA 学习 NL2SQL 落地思路,也可直接改造用于企业内部自助数据查询平台。
项目无复杂依赖,3 个工作日即可完成全套搭建,命令行 + Web 双交互模式兼顾运维效率与业务易用性,同时完善的 SQL 安全机制保障生产环境数据安全。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)