1. 慢查询日志里翻出来的那条 SQL,为什么值得用对话方式重做一遍
线上库跑着跑着突然告警,翻开慢查询日志,一条SELECT * FROM orders WHERE customer_id = 100 OR total > 1000稳稳躺在列表里,扫描行数几十万,耗时 120ms 起步。你打开客户端,EXPLAIN看一眼,发现走了全表扫描,于是开始手动加索引、改写法、再验证。这套流程本身没问题,问题在于它太依赖个人经验,而且每换一个数据库,执行计划的读法、索引的语法、优化器的脾气都不一样。
PawSQL MCP 想解决的就是这件事。它把 SQL 优化能力封装成 MCP 协议下的一个服务端,你通过支持 MCP 的客户端(比如 Cursor、Cline、Claude Code 这类工具)用自然语言发起调优请求,服务端负责分析 SQL、给出改写建议、对比执行计划,甚至连到真实库上验证性能变化。兼容 MySQL、PostgreSQL、Oracle、SQL Server,也覆盖 openGauss、MogDB、GaussDB、达梦、OceanBase、TDSQL 这些国产库,一套交互方式走到底。
适合谁用?三类人最直接受益:一是日常写业务 SQL 但不想深啃优化器原理的后端开发;二是需要快速定位慢查询根因的 DBA;三是在多数据库环境下做迁移或兼容适配的团队。你不需要背索引最左前缀,也不需要记住每个库的EXPLAIN字段含义,把 SQL 和表结构丢进去,用中文说清楚你想干什么,剩下的交给 MCP 服务端。
但这里有个前置问题:MCP 客户端要调用模型能力,模型调用需要 Key。如果你同时用多个 AI 工具、多个模型供应商,Key 管理会变成一件很烦的事。TaoToken 在这里的角色是统一 Key 层——一个 Key 打通模型对话、Coding Plan、API 调用,MCP 服务端和客户端都从这里取凭证,省掉到处配环境变量的麻烦。下面从环境准备开始,一步步把这条链路跑通。
2. TaoToken 统一 Key 与 PawSQL MCP 服务端接入前置准备
先说清楚整体架构。PawSQL MCP 服务端是一个本地进程,通过 stdio 或 HTTP 和客户端通信;客户端(Cursor、Cline、Claude Code 等)负责把你的自然语言指令转成 MCP 调用;模型能力由 TaoToken 统一提供。所以你需要准备三样东西:TaoToken 的 API Key、PawSQL MCP 服务端、一个支持 MCP 的客户端。
TaoToken 的 Key 获取路径很直接:访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后在控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。创建时建议按用途命名,比如pawsql-mcp-dev,方便后续轮换。
API 基础地址是 https://taotoken.net/api ,注意这个地址不加 UTM 参数,直接用于代码里的base_url配置。模型 ID 根据你的场景选,做 SQL 优化分析建议用推理能力强的模型,具体可用列表在模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 能看到。
PawSQL MCP 服务端的获取,从官方渠道下载对应平台的包。下载后解压,你会看到一个 Python 启动脚本,通常是pawsql_mcp_server.py。它依赖 Python 3.9 以上环境,建议用虚拟环境隔离:
python3 -m venv pawsql-env source pawsql-env/bin/activate pip install -r requirements.txt数据库连接通过环境变量注入。不同数据库的 DSN 格式不一样,下面这张表是我实测下来比较稳的模板,你可以直接对照改:
| 数据库类型 | DSN 模板 | 说明 |
|---|---|---|
| MySQL | mysql://user:pass@host:3306/dbname | 默认端口 3306 |
| PostgreSQL | postgresql://user:pass@host:5432/dbname | 默认端口 5432 |
| OceanBase | ob://user:pass@host:2881/dbname | 走 OB 协议端口 |
| openGauss | opengauss://user:pass@host:5432/dbname | 兼容 PG 协议 |
| 达梦 | dm://user:pass@host:5236/dbname | 默认端口 5236 |
设置环境变量时,变量名按 PawSQL 的约定来,比如 MySQL 用PawSQL_OB_DSN,OceanBase 也用同一个变量名但值换成ob://开头。这里有个坑:DSN 里的密码如果包含@或:,需要 URL 编码,否则解析会出错。我试过用p@ssw0rd直接写进去,服务端启动时报连接失败,改成p%40ssw0rd就正常了。
TaoToken 的 Key 也要注入环境变量,建议命名TAOTOKEN_API_KEY,base_url 用TAOTOKEN_BASE_URL=https://taotoken.net/api。这样 MCP 服务端和客户端都能从环境里读到,不用硬编码在配置文件里。
3. 可复制配置片段:MCP 服务端 JSON 与客户端 settings 接入
这一节给你可以直接抄的配置。先看 MCP 服务端的启动配置,以 Cursor 为例,打开设置 → Features → MCP Servers → 添加新服务,粘贴下面这段 JSON:
{ "mcpServers": { "pawsql_opt": { "command": "python3", "args": [ "/absolute/path/to/pawsql_mcp_server.py", "--transport", "stdio" ], "env": { "PawSQL_OB_DSN": "mysql://root:yourpassword@127.0.0.1:3306/mydb", "TAOTOKEN_API_KEY": "sk-your-taotoken-key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_MODEL": "your-model-id" } } } }注意args里的路径必须写绝对路径,相对路径在 Cursor 启动子进程时工作目录不确定,会找不到脚本。env里四个变量一个都不能少:DSN 决定连哪个库,API Key 和 base_url 决定模型调用走哪里,Model ID 决定用哪个模型做分析。
如果你用的是 Cline,配置位置在 Cline 的 MCP Servers 设置里,JSON 结构基本一致,只是外层键名可能叫mcpServers或servers,按 Cline 当前版本的提示填。Claude Code 的话,配置写在~/.claude/settings.json或项目级的.claude/settings.json里,结构如下:
{ "mcpServers": { "pawsql_opt": { "command": "python3", "args": ["/absolute/path/to/pawsql_mcp_server.py", "--transport", "stdio"], "env": { "PawSQL_OB_DSN": "ob://root:yourpassword@127.0.0.1:2881/admin", "TAOTOKEN_API_KEY": "sk-your-taotoken-key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_MODEL": "your-model-id" } } } }Codex 用户如果走auth.json方式,把 TaoToken 的 Key 填到对应字段,base_url 指向https://taotoken.net/api,Model ID 按你选的填。三件套——Base URL、Key、Model ID——在任何客户端里都是必须对齐的,缺一个就会在调用时报认证失败或模型不存在。
配置保存后,重启客户端。Cursor 里 MCP Servers 列表旁边会有个状态指示灯,变绿表示连接成功。如果一直是黄色或红色,先看客户端底部的 MCP 日志,常见的是 Python 路径不对或依赖没装全。
还有一个细节:--transport stdio表示走标准输入输出通信,适合本地进程。如果你想把 MCP 服务端跑在另一台机器上,可以改成 HTTP 传输,但那样需要额外配网络和鉴权,本地开发不建议折腾。
4. 验证请求:从慢查询到执行计划对比的完整链路
配置好了,来跑一条真实链路。假设你手头有个订单库,慢查询日志里躺着这条:
SELECT * FROM orders WHERE customer_id = 100 OR total > 1000;在 Cursor 的对话窗口里,直接输入中文指令:
优化这条 SQL,表结构如下: CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, total DECIMAL(10,2) ); 查询:SELECT * FROM orders WHERE customer_id = 100 OR total > 1000;MCP 服务端收到请求后,会做几件事:解析 SQL 语法树、识别OR条件导致的索引失效、生成改写建议、如果配了真实库连接还会跑执行计划对比。返回结果通常包含优化建议和改写后的 SQL:
(SELECT * FROM orders WHERE customer_id = 100) UNION (SELECT * FROM orders WHERE total > 1000);同时建议在两个字段上分别建索引:
CREATE INDEX idx_cust ON orders(customer_id); CREATE INDEX idx_total ON orders(total);执行计划对比是验证的关键。原 SQL 走全表扫描,扫描行数等于表总行数;改写后走索引扫描,扫描行数降到匹配行数。我在一个 50 万行的测试表上实测,原 SQL 耗时 120ms,改写后 8ms 左右,提升约 15 倍。这个数字会随数据分布变化,但方向是一致的。
如果你想验证模型调用是否真的走了 TaoToken,可以在模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 发一条同样的优化请求,对比返回质量。两边应该一致,因为底层是同一个 Key 和同一个模型。
对于长期做 SQL 调优和 Agent 编排的场景,Coding Plan 会更划算,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它适合需要频繁调用模型、跑批量优化任务的团队,按套餐走比按次调用省心。
验证成功后,你可以把这条链路固化下来:慢查询日志导出 → 批量丢给 MCP → 收集改写建议 → 在测试库跑执行计划对比 → 确认提升后上生产。整个过程不需要手动写EXPLAIN,也不需要记每个库的索引语法差异。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
接入过程中最容易卡在几个报错上,我按实际遇到的频率排一下。
401 Unauthorized。这个基本是 Key 问题。先检查TAOTOKEN_API_KEY环境变量有没有正确注入到 MCP 服务端进程里。Cursor 的 MCP 配置里env字段是独立于系统环境变量的,你在 shell 里export了不代表 Cursor 子进程能读到。另一个可能是 Key 复制时带了空格或换行,重新从 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 复制一次,注意不要多选字符。
local proxy failed。这个报错通常出现在客户端尝试连接 MCP 服务端时。原因可能是 Python 脚本路径不对、依赖没装、或者端口被占用。先手动在终端跑一遍python3 /absolute/path/to/pawsql_mcp_server.py --transport stdio,看能不能正常启动。如果报ModuleNotFoundError,说明requirements.txt没装全;如果报连接数据库失败,检查 DSN 格式和数据库白名单。
reading choices 相关报错。这个一般出现在模型返回结构解析阶段,说明模型返回的 JSON 不符合预期。可能是 Model ID 填错了,或者 base_url 指向了不兼容的端点。确认TAOTOKEN_BASE_URL是https://taotoken.net/api,Model ID 从模型对话页面确认可用。如果换了模型还是报,检查请求里max_tokens是不是设得太小,导致返回被截断。
OAuth 相关报错。部分客户端在首次连接 MCP 时会尝试 OAuth 流程,如果服务端没配对应的认证端点就会失败。PawSQL MCP 本地 stdio 模式不需要 OAuth,检查客户端配置里有没有多余的 auth 字段,删掉再试。如果客户端强制走 OAuth,换用支持 stdio 直连的版本。
还有一个隐蔽的坑:DSN 里的数据库用户权限不足。PawSQL MCP 需要读取表结构和统计信息,如果账号只有SELECT权限但没有SHOW INDEX或查询information_schema的权限,优化建议会不完整。给 MCP 服务账号加上PROCESS和SELECT权限,国产库对应权限名可能不同,查一下官方文档。
排查顺序建议:先确认 MCP 服务端能独立启动,再确认客户端能连上服务端,最后确认模型调用能通。三层分开验证,比一股脑改配置高效得多。
6. 把 SQL 优化变成日常对话之后的工作方式
跑通这条链路之后,我自己的习惯变了。以前遇到慢查询,先开客户端、EXPLAIN、翻文档、试索引,一套下来半小时。现在把 SQL 和表结构丢进对话窗口,几秒钟拿到改写建议和执行计划对比,确认没问题再上。省下来的时间用来做更重要的事,比如梳理业务查询模式、设计更合理的表结构。
PawSQL MCP 的三种模式值得按场景切换:快速模式适合简单查询,不用给表结构就能出建议;精准模式适合复杂查询,提供表结构后建议更准;专业模式连真实库,直接验证性能提升。日常开发用快速和精准就够,上生产前用专业模式跑一遍验证。
TaoToken 统一 Key 的价值在多工具场景下更明显。你可能有 Cursor 写代码、Cline 做自动化、Claude Code 跑 Agent,每个工具都要配模型凭证。统一到一个 Key 之后,轮换、限额、审计都集中在一处,不用逐个工具改配置。API 地址 https://taotoken.net/api 和接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里有完整的参数说明,遇到不确定的字段先查文档再改。
最后给一个实用技巧:把常用的优化指令存成片段,比如「分析这条 SQL 的索引使用情况并给出改写建议,表结构如下:」,每次直接粘贴,省去重复描述。MCP 服务端会记住会话上下文,多轮对话里可以追问「如果数据量增长到 1000 万行,这个方案还成立吗」,它会基于已有分析继续推理。这种交互方式比一次性问答更接近真实调优过程。