SQL 格式化
把一整行的长语句按关键字换行缩进,便于阅读慢查询日志和审计记录。
SQL 格式化
本地处理,语句不上传。适合整理慢查询日志里粘出来的长语句。
为什么要把 SQL 排版清楚
从慢查询日志、ORM 打印、监控平台里取出来的语句通常是一整行,嵌套几层之后几乎无法阅读。排成缩进格式之后,能一眼看出 FROM 后面跟了几张表、JOIN 条件写在哪、WHERE 里有多少个条件,排查性能问题时省时间。
格式化之外更该看的三件事
一是 SELECT *。取回用不到的列会增加网络传输和内存占用,覆盖索引也可能失效,生产环境应显式列出字段。
二是 WHERE 条件里对字段做函数运算,比如 WHERE DATE(create_time) = ...,这会让索引失效,应改成范围比较。
三是隐式类型转换。字段是字符串类型却用数字比较,或者字符集不一致的字段做 JOIN,都会导致索引不可用,执行计划里表现为全表扫描。
审计场景下的用途
数据库审计产品会记录全部 SQL 语句,运维和审计人员核对时,格式化的语句更容易判断是否存在越权访问、批量导出或危险操作。等保测评里数据库审计是必查项,审计记录的完整性和可读性都在检查范围内。
常见写法与风险
| 写法 | 问题 | 建议 |
|---|---|---|
| SELECT * | 传输多余列,可能使覆盖索引失效 | 显式列出需要的字段 |
| WHERE 中对字段用函数 | 索引失效,走全表扫描 | 改写为范围条件 |
| LIKE '%关键词' | 前置通配符无法使用索引 | 改用全文索引或搜索引擎 |
| 大表无 LIMIT 的 UPDATE | 长事务锁表,影响业务 | 分批执行并加 LIMIT |
| 隐式类型转换 | 索引失效,结果可能不符合预期 | 保证比较双方类型一致 |
| 字符串拼接 SQL | SQL 注入风险 | 使用参数化查询 |
相关产品与指南
常见问题
格式化会改变 SQL 语义吗?▼
不会。工具只调整空白和关键字大小写,不改动标识符、字符串字面量和运算符。但格式化后的语句仍建议在测试库上执行一次确认,特别是含存储过程或多语句的情况。
支持存储过程和函数体吗?▼
对含 BEGIN END 的过程体支持有限,主要针对单条查询和 DML 语句。复杂过程建议用数据库客户端自带的格式化功能。
字符串里的内容会被误改吗?▼
不会。工具会先把单引号包裹的字符串整体保护起来,格式化完成后再原样还原,里面的关键字不会被转成大写。
为什么格式化后行数变多了?▼
因为按 SELECT、FROM、WHERE、JOIN、GROUP BY 等子句分段换行,每个 AND、OR 条件也单独一行。这是为了便于逐条核对条件。
慢查询日志里的语句能直接用吗?▼
可以,但要先去掉日志里的额外字段。慢查询日志通常还带执行时间、锁定时间、扫描行数等前缀,需要只保留 SQL 部分再粘贴。