mysql 存储过程

说白了,MySQL存储过程就是数据库里的一段可复用的代码块,但创建它得注意几个关键点。
先用DELIMITER改默认分隔符防止误执行,参数分输入输出,过程体用BEGIN...END包裹。
去年我们跑那个电商项目,改分隔符不小心删库了,说实话挺坑的。
另外一点,参数类型得跟好,比如OUT s int这个例子,就是统计user表条数,结果存到变量s里。
还有个细节挺关键的,存储过程执行效率高,但调试比普通SQL麻烦,特别是在3 000量级以上数据时。
我一开始也以为随便写就行,后来发现不对,嵌套调用时变量作用域得搞清。
提醒一句,别把存储过程当万能药,它适合写复杂逻辑,但不适合替代索引优化。

MySQL 最全整理(面试题 + 笔记 + 导图),面试大厂不再被 MySql 难倒

上周整理的MySQL资料挺全的。
我重新捋了一下关键点,帮你快速过一遍。

---
一、MySQL面试题核心考点 1 .1 基础部分
表操作区别
DROP TABLE:整表删除,不可回滚。

TRUNCATE TABLE:清空数据,保留结构,不可回滚。

DELETE FROM:删除数据,可回滚,不释放空间。

三范式
第一范式:字段原子化,不可拆分。

第二范式:非主键字段完全依赖主键。

第三范式:非主键字段不传递依赖。

UNION vs UNION ALL
UNION:去重,多表排序需在最后。

UNION ALL:不去重,性能更高。

字符类型
CHAR:固定长度,浪费空间但快。

VARCHAR:可变长度,节省空间但稍慢。

VARCHAR2 :Oracle类型,MySQL等同VARCHAR。

NULL
未知或缺失值,运算结果为NULL。

索引类型
主键索引、唯一索引、普通索引、全文索引。

建立原则:高频查询、高区分度、短字段。

锁机制
乐观锁:版本号控制,冲突多。

悲观锁:表锁/行锁,并发低。

隔离级别:
READ COMMITTED(默认)
REPEATABLE READ
SERIALIZABLE
主从同步
binlog模式:STATEMENT(SQL)、ROW(行级)、MIXED(混合)。

从库故障恢复:重启服务+检查SHOW SLAVE STATUS。

1 .2 实战部分
秒杀表设计
库存拆分表+乐观锁(版本号)。

死锁解决
检测wait_for_lock,回滚事务,调整锁顺序。

存储过程 vs 函数
存储过程:无返回值,可包含SELECT。

函数:必须返回值,不可嵌套。

索引优缺点
优点:加速查询。

缺点:降低写入性能,占用空间。

1 .3 高级进阶
非关系型数据库对比
MongoDB(文档型)、Redis(键值型)、Cassandra(列式)。

主从复制问题
从库延迟:调整binlog_format=ROW、sync_binlog=1
双向复制:需配置io_thread和sql_thread。

---
二、MySQL实际使用技巧 2 .1 性能优化2 1 条 1 . 查询缓存:频繁查询用缓存。
2 . EXPLAIN分析:识别索引是否生效。
3 . LIMIT 1 :确认唯一性时用。
4 . NOT NULL:减少NULL处理开销。
5 . ENUM替代VARCHAR:固定值字段用ENUM。
6 . JOIN表类型一致:避免隐式转换。
7 . IP存UNSIGNED INT:节省空间且计算快。

2 .2 架构设计
Replication:主从同步配置步骤。

数据切分:垂直切分(拆分字段)或水平切分(分表)。

读写分离:代理(ProxySQL)或应用层路由。

---
三、学习脑图逻辑
SQL优化:执行计划(EXPLAIN)、索引失效场景。

锁问题:InnoDB行锁 vs MyISAM表锁。

备份恢复:mysqldump全量+binlog增量。

---
你那个朋友最近在考字节,建议重点刷锁机制、主从复制和SQL优化。
这部分我不确定:char(4 )和varchar(4 )具体差别? 算了,先过这些,你看着办。

mysql输出存储过程语句

哎,MySQL里这玩意儿挺好使。
你要想知道个存储过程咋写的,就用个SHOW CREATE PROCEDURE。

比如有个存储过程叫get_customer_info,你想看它是咋整的。
你就敲这个:
sql SHOW CREATE PROCEDURE get_customer_info;
敲完这行,它就给你返个文本,告诉你get_customer_info是咋写的。
像这样:
sql CREATE PROCEDURE get_customer_info(IN customer_id INT) BEGIN SELECT FROM customers WHERE customer_id = customer_id; END
你看,它给你把整个创建过程都列出来了。
CREATE PROCEDURE就是开头,然后是过程名get_customer_info,后面跟参数,比如IN customer_id INT。
然后BEGIN和END之间就是过程里写的SQL语句。

你要是想看别的库里的存储过程,比如库叫mydb,那就这么写:
sql SHOW CREATE PROCEDURE mydb.get_customer_info;
这样它就从mydb库里找get_customer_info。
你要是不写库名,它就从当前库找。

说实话,这玩意儿特别实用。
有时候你忘了某个存储过程咋写的,就用这个快速看一眼。
用着挺方便的。

mysql 存储过程中的 if exists 判断问题

这就是坑,别信存储过程能解决语法问题。

正确做法:直接在MySQL中手动执行DROP INDEX index_name ON table_name;语句。

实操提醒:检查语法,避免依赖错误的存储过程。