内容简介:本文主要介绍MySQL存储过程参数与返回值的相关知识,包括参数类型、使用方法和最佳实践等内容。风哥教程参考MySQL官方文档MySQL SQL Review、MySQL Server Administration。 01 更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 SQL审核的重要性
SQL审核是保障数据库性能和数据质量的重要环节,通过规范化的审核流程,可以在SQL上线前发现潜在的性能问题和安全隐患。
1.2 SQL审核范围
SQL审核的主要范围包括: 02 学习交流加群风哥微信: itpux-com
1. DDL审核(数据定义语言)
– CREATE TABLE – 表结构设计
– ALTER TABLE – 表结构变更
– DROP TABLE – 表删除
– CREATE INDEX – 索引创建
– 分区表操作
2. DML审核(数据操作语言)
– SELECT – 查询语句
– INSERT – 插入语句
– UPDATE – 更新语句
– DELETE – 删除语句
3. DCL审核(数据控制语言)
– GRANT – 权限授予
– REVOKE – 权限回收
– CREATE USER – 用户创建
4. 存储对象审核
– 存储过程
– 触发器
– 视图
– 函数
Part02-生产环境规划与建议
2.1 DDL审核规则
DDL语句的审核规则: 03 学习交流加群风哥QQ113257174
1. 表设计规范
– 表名必须使用小写字母和下划线
– 表名长度不超过32个字符
– 必须有主键
– 必须有创建时间和更新时间字段
– 字符集必须使用UTF8MB4
2. 字段设计规范
– 字段名必须使用小写字母和下划线
– 禁止使用NULL(使用默认值代替)
– 数值类型根据范围选择合适类型
– 字符串类型优先使用VARCHAR
– 大文本使用TEXT类型
– 时间类型使用DATETIME或TIMESTAMP
3. 索引设计规范
– 单表索引数量不超过5个
– 单个索引字段数不超过5个
– 优先使用联合索引
– 索引字段必须有选择性
– 禁止对频繁更新的字段创建索引
4. 审核示例
# 符合规范的建表语句
CREATE TABLE `user_info` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘主键ID’,
`user_name` VARCHAR(64) NOT NULL DEFAULT ” COMMENT ‘用户名’,
`email` VARCHAR(128) NOT NULL DEFAULT ” COMMENT ‘邮箱’,
`phone` VARCHAR(20) NOT NULL DEFAULT ” COMMENT ‘手机号’,
`status` TINYINT NOT NULL DEFAULT ‘1’ COMMENT ‘状态:1-正常,0-禁用’,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_name` (`user_name`),
UNIQUE KEY `uk_email` (`email`),
KEY `idx_phone` (`phone`),
KEY `idx_status_created` (`status`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’用户信息表’;
输出示例:
Query OK, 0 rows affected (0.05 sec)
# 不符合规范的建表语句(审核不通过)
CREATE TABLE UserInfo (
ID int NOT NULL,
UserName varchar(255),
Email varchar(255),
Phone varchar(20),
Status int
);
审核结果:
[ERROR] 表名必须使用小写字母和下划线
[ERROR] 缺少主键
[ERROR] 字段允许NULL值
[ERROR] 缺少创建时间和更新时间字段
[ERROR] 未指定字符集
[ERROR] 未指定存储引擎
2.2 DML审核规则
DML语句的审核规则:
1. SELECT审核规则
– 禁止SELECT *,必须指定字段
– 大表查询必须带WHERE条件
– WHERE条件必须有索引
– 禁止在WHERE条件中使用函数
– ORDER BY字段必须在SELECT中
– LIMIT分页必须配合ORDER BY
2. INSERT审核规则
– 必须指定字段名
– 批量插入不超过1000条
– 禁止INSERT IGNORE
– 必须处理主键冲突
3. UPDATE审核规则
– 必须带WHERE条件
– WHERE条件必须有索引
– 禁止全表更新
– 批量更新不超过10000条
4. DELETE审核规则
– 必须带WHERE条件
– WHERE条件必须有索引
– 禁止全表删除
– 大批量删除必须分批进行
5. 审核示例
# 符合规范的查询
SELECT id, user_name, email
FROM user_info
WHERE status = 1
AND created_at > ‘2026-01-01’
ORDER BY created_at DESC
LIMIT 100;
输出示例:
+—-+———–+——————+
| id | user_name | email |
+—-+———–+——————+
| 1 | user001 | user001@test.com |
| 2 | user002 | user002@test.com |
| 3 | user003 | user003@test.com |
+—-+———–+——————+
3 rows in set (0.01 sec)
# 不符合规范的查询(审核不通过)
SELECT * FROM user_info;
审核结果:
[ERROR] 禁止使用SELECT *,必须指定字段
[WARNING] 大表查询缺少WHERE条件
EXPLAIN SELECT * FROM user_info;
输出示例:
+—-+————-+———–+————+——+—————+——+———+——+——–+———-+——-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+—-+————-+———–+————+——+—————+——+———+——+——–+———-+——-+
| 1 | SIMPLE | user_info | NULL | ALL | NULL | NULL | NULL | NULL | 100000 | 100.00 | NULL |
+—-+————-+———–+————+——+—————+——+———+——+——–+———-+——-+
[WARNING] 全表扫描,性能较差
Part03-生产环境项目实施方案
3.1 pt-query-advisor
使用Percona Toolkit进行SQL审核: 04 风哥提示:
1. 安装Percona Toolkit
yum install percona-toolkit -y
输出示例:
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
–> Running transaction check
—> Package percona-toolkit.x86_64 0:3.5.4-1.el7 will be installed
…
Installed:
percona-toolkit.x86_64 0:3.5.4-1.el7
Complete!
2. 分析SQL语句
pt-query-advisor –query “SELECT * FROM user_info WHERE status = 1”
输出示例:
# Query: 0B5D5F6B7C8D9E0F1A2B3C4D5E6F7A8B
# NOTE: SELECTing all columns with the asterisk
SELECT * FROM user_info WHERE status = 1
3. 分析慢查询日志
pt-query-advisor /var/lib/mysql/slow.log
输出示例:
# Query 1: 0 QPS, 0x concurrency, ID 0x8F5F6B7C8D9E0F1A at byte 12345
# Scores: V/M = 0.00
# Time range: all events occurred at 2026-04-04 12:00:00
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 1 1
# Exec time 25 5s 5s 5s 5s 5s 0 5s
# Lock time 0 0 0 0 0 0 0 0
# Rows sent 0 0 0 0 0 0 0 0
# Rows examine 25 100000 100000 100000 100000 100000 0 100000
# Query size 0 45 45 45 45 45 0 45
# String:
# Databases production_db
# Hosts localhost
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s ################################################################
# 10s+
# Tables
# SHOW TABLE STATUS FROM `production_db` LIKE ‘user_info’
# SHOW CREATE TABLE `production_db`.`user_info`
# EXPLAIN /*!50100 PARTITIONS*/
SELECT * FROM user_info WHERE status = 1\G
# NOTE: SELECTing all columns with the asterisk
# WARN: Full table scan
3.2 SQL审核系统
构建SQL审核系统: 05更多学习教程公众号风哥教程itpux_com
1. 创建审核表
CREATE TABLE sql_review_records (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘主键ID’,
request_id VARCHAR(64) NOT NULL COMMENT ‘请求ID’,
sql_content TEXT NOT NULL COMMENT ‘SQL内容’,
sql_type VARCHAR(20) NOT NULL COMMENT ‘SQL类型’,
database_name VARCHAR(64) NOT NULL COMMENT ‘数据库名’,
table_name VARCHAR(64) COMMENT ‘表名’,
review_status TINYINT NOT NULL DEFAULT ‘0’ COMMENT ‘审核状态:0-待审核,1-通过,2-拒绝’,
review_result TEXT COMMENT ‘审核结果’,
reviewer VARCHAR(64) COMMENT ‘审核人’,
review_time DATETIME COMMENT ‘审核时间’,
submitter VARCHAR(64) NOT NULL COMMENT ‘提交人’,
submit_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘提交时间’,
PRIMARY KEY (id),
KEY idx_request_id (request_id),
KEY idx_status (review_status),
KEY idx_submitter (submitter),
KEY idx_submit_time (submit_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’SQL审核记录表’;
2. 提交SQL审核
INSERT INTO sql_review_records
(request_id, sql_content, sql_type, database_name, table_name, submitter)
VALUES
(‘REQ202604040001’,
‘CREATE TABLE test_table (id INT, name VARCHAR(50))’,
‘DDL’,
‘production_db’,
‘test_table’,
‘developer001’);
输出示例:
Query OK, 1 row affected (0.01 sec)
3. 自动审核SQL
DELIMITER //
CREATE PROCEDURE auto_review_sql(IN p_request_id VARCHAR(64))
BEGIN
DECLARE v_sql_content TEXT;
DECLARE v_sql_type VARCHAR(20);
DECLARE v_review_result TEXT DEFAULT ”;
DECLARE v_review_status TINYINT DEFAULT 1;
— 获取SQL内容
SELECT sql_content, sql_type INTO v_sql_content, v_sql_type
FROM sql_review_records WHERE request_id = p_request_id;
— DDL审核规则
IF v_sql_type = ‘DDL’ THEN
— 检查是否有主键
IF v_sql_content NOT LIKE ‘%PRIMARY KEY%’ THEN
SET v_review_result = CONCAT(v_review_result, ‘[ERROR] 表必须有主键\n’);
SET v_review_status = 2;
END IF;
— 检查字符集
IF v_sql_content NOT LIKE ‘%utf8mb4%’ THEN
SET v_review_result = CONCAT(v_review_result, ‘[WARNING] 建议使用UTF8MB4字符集\n’);
END IF;
— 检查存储引擎
IF v_sql_content NOT LIKE ‘%InnoDB%’ THEN
SET v_review_result = CONCAT(v_review_result, ‘[WARNING] 建议使用InnoDB存储引擎\n’);
END IF;
END IF;
— DML审核规则
IF v_sql_type = ‘DML’ THEN
— 检查SELECT *
IF v_sql_content LIKE ‘%SELECT *%’ THEN
SET v_review_result = CONCAT(v_review_result, ‘[ERROR] 禁止使用SELECT *\n’);
SET v_review_status = 2;
END IF;
— 检查WHERE条件
IF v_sql_content LIKE ‘%UPDATE%’ AND v_sql_content NOT LIKE ‘%WHERE%’ THEN
SET v_review_result = CONCAT(v_review_result, ‘[ERROR] UPDATE必须带WHERE条件\n’);
SET v_review_status = 2;
END IF;
IF v_sql_content LIKE ‘%DELETE%’ AND v_sql_content NOT LIKE ‘%WHERE%’ THEN
SET v_review_result = CONCAT(v_review_result, ‘[ERROR] DELETE必须带WHERE条件\n’);
SET v_review_status = 2;
END IF;
END IF;
— 更新审核结果
IF v_review_result = ” THEN
SET v_review_result = ‘[OK] SQL审核通过’;
END IF;
UPDATE sql_review_records
SET review_status = v_review_status,
review_result = v_review_result,
reviewer = ‘AUTO_REVIEW’,
review_time = NOW()
WHERE request_id = p_request_id;
END //
DELIMITER ;
4. 执行自动审核
CALL auto_review_sql(‘REQ202604040001’);
5. 查看审核结果
SELECT request_id, sql_content, review_status, review_result, reviewer, review_time
FROM sql_review_records
WHERE request_id = ‘REQ202604040001’;
输出示例:
+—————+—————————————-+—————+——————————————+————-+———————+
| request_id | sql_content | review_status | review_result | reviewer | review_time |
+—————+—————————————-+—————+——————————————+————-+———————+
| REQ202604040001 | CREATE TABLE test_table (id INT, … | 2 | [ERROR] 表必须有主键\n[WARNING] 建议使用… | AUTO_REVIEW | 2026-04-04 12:00:00 |
+—————+—————————————-+—————+——————————————+————-+———————+
Part04-生产案例与实战讲解
4.1 审核流程设计
设计SQL审核流程:
1. 提交阶段
– 开发人员提交SQL
– 系统自动预审
– 生成审核请求ID
2. 自动审核阶段
– 语法检查
– 规范检查
– 性能预估
– 生成审核报告
3. 人工审核阶段
– DBA审核
– 架构师审核(复杂变更)
– 安全审核(敏感操作)
4. 执行阶段
– 审核通过后执行
– 记录执行日志
– 验证执行结果
5. 回滚阶段
– 执行失败自动回滚
– 记录回滚日志
– 通知相关人员
6. 审核流程示例
# 开发人员提交SQL
vim submit_sql.sh
#!/bin/bash
SQL_CONTENT=”ALTER TABLE user_info ADD COLUMN age INT NOT NULL DEFAULT 0 COMMENT ‘年龄'”
DATABASE=”production_db”
SUBMITTER=”developer001″
mysql -u root -p -e “
INSERT INTO sql_review_records
(request_id, sql_content, sql_type, database_name, table_name, submitter)
VALUES
(‘REQ$(date +%Y%m%d%H%M%S)’,
‘$SQL_CONTENT’,
‘DDL’,
‘$DATABASE’,
‘user_info’,
‘$SUBMITTER’);
“
# 执行提交
./submit_sql.sh
输出示例:
Query OK, 1 row affected (0.01 sec)
# DBA审核
mysql -u root -p -e “
UPDATE sql_review_records
SET review_status = 1,
review_result = ‘[OK] 审核通过’,
reviewer = ‘dba001’,
review_time = NOW()
WHERE request_id = ‘REQ202604040001’;
“
输出示例:
Query OK, 1 row affected (0.01 sec)
# 执行SQL
mysql -u root -p production_db -e “
ALTER TABLE user_info ADD COLUMN age INT NOT NULL DEFAULT 0 COMMENT ‘年龄’
“
输出示例:
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 更新执行状态
mysql -u root -p -e “
UPDATE sql_review_records
SET execute_status = 1,
execute_time = NOW()
WHERE request_id = ‘REQ202604040001’;
“
输出示例:
Query OK, 1 row affected (0.01 sec)
Part05-风哥经验总结与分享
5.1 SQL审核最佳实践
SQL审核的最佳实践: 06 from mysql视频:www.itpux.com
1. 审核规范
– 制定详细的SQL编写规范
– 建立审核检查清单
– 定期更新审核规则
2. 自动化
– 实现自动语法检查
– 实现自动规范检查
– 实现自动性能预估
3. 分级审核
– 简单变更自动审核
– 复杂变更人工审核
– 敏感操作多级审核
4. 审核记录
– 记录所有审核操作
– 保存审核历史
– 定期审计审核记录
5. 持续改进
– 收集审核反馈
– 优化审核规则
– 提升审核效率
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
