本项目基于MySQL 8.0 DBA运维核心能力,对接硅基流动开源大模型API,打造了面向电商订单库的智能查询与性能调优一体化系统。
系统支持直接输入业务自然语言,自动生成合规可执行的MySQL查询语句,运行后直接输出结构化结果表格;同时依托大模型能力完成订单数据的业务化解读,还能自动解析SQL执行计划,输出标准化索引优化方案,全程无需人工手写、调试SQL,也不用手动分析执行计划。
它的核心价值在于:
哪怕没有专业SQL开发能力的业务人员,也能自主完成业务数据查询,直接替代人工统计报表、手工分析SQL性能这类高重复的运维工作;深度打通MySQL专业运维能力与大模型自然语言理解能力,完美适配企业轻量化数据自助查询、SQL智能性能优化、数据结果AI解读的一站式落地场景。
关闭selinx和防火墙

通过vi /etc/selinux/config进去 将SELINUX设置为:SELINUX=disabled
重启:reboot 通过getenforce即可查看是否关闭成功

源码编译安装Python3.11.9
配置国内 pip 源及安装项目依赖
下载:https://www.python.org/downloads/release/python-3119/



部署并初始化MySQL 8.0.45
下载:https://downloads.mysql.com/archives/community/

创建数据库和表




在腾讯云官网获取API Key


新建目录及脚本

编写环境变量脚本


更改脚本权限

编写数据库连接脚本

python
# -*- coding: utf-8 -*-
# 文件名:mysql_client.py
# 功能:MySQL8.0数据库统一封装类
# 作用:封装数据库连接、普通查询、EXPLAIN执行计划、SQL安全拦截,统一抛出友好异常,给上层业务调用
import pymysql
import os
import re
from dotenv import load_dotenv
# 加载项目根目录下.env文件的数据库配置
load_dotenv()
class Mysql80Client:
# 数据库操作封装类,所有数据库相关操作统一在此管理
def __init__(self):
# 初始化时读取环境变量,参数缺失则设置兜底默认值,防止程序直接崩溃
self.host = os.getenv("MYSQL_HOST", "127.0.0.1")
self.port = int(os.getenv("MYSQL_PORT", "3306"))
self.user = os.getenv("MYSQL_USER", "root")
self.password = os.getenv("MYSQL_PASSWORD", "")
self.database = os.getenv("MYSQL_DB", "testdb")
# 数据库连接对象,初始为空
self.conn = None
# 实例创建后自动建立数据库连接
self.connect()
def connect(self):
"""创建数据库连接,捕获连接异常并抛出可读错误信息"""
try:
self.conn = pymysql.connect(
host=self.host,
port=self.port,
user=self.user,
password=self.password,
database=self.database,
charset='utf8mb4', # 支持中文、emoji完整字符集
cursorclass=pymysql.cursors.DictCursor # 查询结果以字典返回,方便按字段取值
)
except pymysql.MySQLError as e:
# MySQL专属连接错误,提示账号、地址、密码排查方向
raise Exception(f"数据库连接失败,请检查地址/账号/密码:{e.args[1]}")
except Exception as e:
# 其余未知连接异常统一捕获
raise Exception(f"数据库连接异常:{str(e)}")
@staticmethod
def _check_sql_safety(sql: str) -> None:
"""
静态私有安全校验方法
核心防护:拦截增删改、建表删表等危险操作,仅允许SELECT查询,防止AI生成危险SQL篡改数据
"""
# 去除首尾空格并转为大写,统一匹配规则
sql_trim = sql.strip().upper()
# 危险操作关键字黑名单
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} 类型语句,仅支持 SELECT 查询")
def execute_query(self, sql: str):
"""
执行普通SELECT查询
:param sql: 待执行查询语句
:return: (字段名列表, 全部数据行字典列表)
"""
# 执行SQL前先做安全校验,拦截危险语句
self._check_sql_safety(sql)
try:
# with自动管理游标,用完自动释放资源
with self.conn.cursor() as cursor:
cursor.execute(sql)
# 提取查询结果表头字段
columns = [desc[0] for desc in cursor.description]
# 读取全部查询数据
rows = cursor.fetchall()
return columns, rows
except pymysql.MySQLError as e:
# 捕获SQL语法、表不存在等数据库执行错误
raise Exception(f"SQL执行失败(错误码 {e.args[0]}):{e.args[1]}")
except Exception as e:
# 通用查询异常兜底
raise Exception(f"查询异常:{str(e)}")
def get_explain_plan(self, sql: str):
"""
获取SQL执行计划EXPLAIN,用于性能调优分析
:param sql: 待分析SELECT语句
:return: (执行计划表头, 执行计划详情数据)
"""
# 同样先校验SQL安全性
self._check_sql_safety(sql)
# 拼接EXPLAIN关键字,生成分析语句
explain_sql = f"EXPLAIN {sql}"
try:
with self.conn.cursor() as cursor:
cursor.execute(explain_sql)
columns = [desc[0] for desc in cursor.description]
rows = cursor.fetchall()
return columns, rows
except pymysql.MySQLError as e:
raise Exception(f"获取执行计划失败:{e.args[1]}")
except Exception as e:
raise Exception(f"执行计划异常:{str(e)}")
def close(self):
"""安全关闭数据库连接,释放资源,避免长时间占用连接池"""
# 判断连接存在且未关闭才执行关闭操作
if self.conn and not self.conn._closed:
self.conn.close()
项目执行


web可视化版本
安装 Python 依赖

创建 Streamlit 可视化入口 web_main.py
创建 systemd 后台常驻服务

Windows网页访问测试

192.168.152.133
浏览器访问:192.168.152.133:8501


