MySQL基础(四)—存储过程和存储引擎

上一篇 MySQL基础(三)—函数、自定义函数
这一篇是对存储过程和存储引擎的笔记,其中操作的数据库在上一篇文章中有代码,可以去看一下。

1、存储过程

存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并座位一个单元处理。

1.1、存储过程的作用

说到存储过程的作用,咱们先来说一下写了sql命令之后到拿到返回结果,mysql都经历了哪些。
1、首先输入sql命令之后,mysql引擎会首先对sql命令进行语法分析,来检查sql命令是不是正确
2、如果sql命令是正确的,那么sql命令会通过编译转化成msyql可以识别的命令
3、然后开始执行命令
4、最后将结果返回给客户端
有了上述的这个过程,那咱们如果把检查命令和编译省略掉,就能提升sql命令的效率。那么问题来了,
怎么能省略掉前边的步骤呢?就是是用存储过程!
在一条sql命令第一次被执行的时候,同样会经历上述四个步骤。但是从第二次起,就不用再重新检查和编译了。

1.2、存储过程的优点
  • 1、增强了SQL语句的功能和灵活性。在存储过程中可以用变量以及判断等,就可以使用存储过程完成比较复杂的功能。
  • 2、实现了比较快的执行速度。如果在一个操作包含大量的sql命令,效率较低。频繁调用时在使用存储过程效率较高。
  • 3、减少网络流量。如果要执行一个操作,要写一个完成的sql命令进去。但是如果使用存储过程,那就传递参数就好了,这样提交给服务器的内容就少了很多。
1.3、参数的含义
  • 1、IN,表示该参数的值必须在调用存储过程时指定,这个不能被返回。
  • 2、OUT,表示该参数的值可以被存储过程改变,并且可以返回。
  • 3、INOUT,表示该参数的值在调用时指定,并且可以改变和返回。
1.4、过程体
  • 1、过程体由合法的sql语句构成;
  • 2、过程体可以是任意的SQL语句构成;
  • 3、过程体如果为复合结构则使用 BEGIN…END语句;
  • 4、复合结构可以声明变量,循环,控制流程;
1.5、自定义函数和存储过程的区别
  • 1、存储过程实现的功能更复杂一些;函数针对性更强.很少用函数对表做操作,存储过程经常对表做操作。
  • 2、存储过程可以返回多个值,函数只能返回一个。
  • 3、存储过程一般独立的执行;函数可以座位其他SQL语句的组成部分出现。
1.6使用
1.6.1创建不带参数的存储过程
create PROCEDURE sp1() SELECT VERSION();
#调用存储过程
CALL sp1();
#如果该存储过程没有参数,可以省略后边算是方法名的小括号
CALL sp1;
1.6.2创建IN参数的存储过程
#按id删除球员
#这里有个问题,参数名的不要和数据库里边字段的名称相同 
CREATE PROCEDURE deletePlyerById(IN id INT UNSIGNED) 
BEGIN
DELETE FROM player where player.playerId=id;
END 

select * FROM player
select player.playerId FROM player WHERE player.playerName="我是小米1";
select player.playerId FROM player WHERE player.playerName="我是小米";
#调用存储过程删除两个球员
CALL deletePlyerById(59);
CALL deletePlyerById(60);
1.6.3创建OUT、IN参数的存储过程
#删除球员,并且返回数据库里边还有多少球员
CREATE PROCEDURE detelePlayerByIdReturnPlayerSum(IN id INT UNSIGNED,OUT playerSum INT UNSIGNED)
BEGIN
DELETE FROM player WHERE player.playerId=id;
SELECT COUNT(player.playerId) FROM player INTO playerSum;
END

select player.playerId FROM player WHERE player.playerName="李小米%%";

CALL  detelePlayerByIdReturnPlayerSum(57,@playerSum);
SELECT @playerSum

SELECT SUM(player.championNumber) FROM player WHERE player.teamId=2
1.6.4创建多个out类型参数的存储过程
#通过teamid 查询这个球队 有多少个球员,以及这些球员所获得的总冠军总数
CREATE PROCEDURE queryPlayerNumberAndChampionSumByTeamId(IN p_teamId INT ,OUT playerSumForTeam INT UNSIGNED,OUT championSum INT UNSIGNED)
BEGIN
SELECT COUNT(player.playerId) FROM player WHERE player.teamId=p_teamId INTO playerSumForTeam;
SELECT SUM(player.championNumber) FROM player WHERE player.teamId=p_teamId INTO championSum;
END
#调用
CALL queryPlayerNumberAndChampionSumByTeamId(2,@playerSumForTeam,@championSum);
SELECT @playerSumForTeam
SELECT @championSum
1.6.5删除存储过程
DROP PROCEDURE deletePlyerById;

2、MySQL存储引擎

MySQL可以将数据以不同的技术存储在文件中,这种技术被称为存储引擎。每种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。

2.1分类
  • 1、MyISAM
  • 2、InnoDB
  • 3、Memory
  • 4、CSV
  • 5、Archive

数据库引擎特性

2.2修改存储引擎的方法
2.2.1、通过修改MySQL配置文件来实现。
-default-storage-engine=engine(存储引擎的名称)
2.2.2、通过创建数据表命令实现
CREATE TABLE test1(
s1 VARCHAR(10))
engine=MyISAM;

CREATE TABLE test2(
s1 VARCHAR(10))
engine=InnoDB;

查询数据表结构

SHOW    CREATE table test1;
#结果
#CREATE TABLE `test1` (  `s1` varchar(10) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8

SHOW    CREATE table test2;
#结果
#CREATE TABLE `test2` ( `s1` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.2.3、修改数据表的引擎
ALTER TABLE test1 ENGINE=INNODB;

#结果
#CREATE TABLE `test1` (  `s1` varchar(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8

SHOW    CREATE table test1;
#结果
#CREATE TABLE `test1` (  `s1` varchar(10) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8
2.2.4删除表
DROP TABLE test1,test2;

3、结语

MySQL基础先学习到这里,完整的sql文件已经上传到github。
点击查看本节SQL

<think>嗯,用户想了解MySQL存储引擎存储过程的区别以及它们的用法。首先,我需要先回忆一下这两个概念的定义功能,确保自己理解正确。存储引擎,根据引用[1][3],是负责数据存储、检索、更新删除的核心组件,不同引擎有不同的机制,比如InnoDB支持事务,而MyISAM不支持。而存储过程,引用[4]提到,是预编译的SQL代码块,用于处理复杂业务,减少多次数据库连接,提高效率稳定性。 接下来,用户需要两者的区别使用场景。我需要从定义、功能、使用方式、管理方式等方面进行对比。比如,存储引擎是数据存储层面的,影响数据的物理存储方式,而存储过程是业务逻辑处理层面的,属于数据库编程的一部分。然后,使用场景方面,存储引擎的选择更多是基于数据一致性、事务支持、并发性能的需求,而存储过程适用于复杂业务逻辑,减少网络传输,提高效率。 还要注意用户可能的混淆点,比如两者都带“存储”这个词,但实际完全不同。需要明确区分它们的不同作用。此外,用户可能想知道如何选择何时使用存储引擎的不同类型,以及何时使用存储过程来优化业务处理。 另外,用户可能也需要具体的示例来帮助理解。例如,引用[2]提到可以用SHOW ENGINES查询存储引擎,而存储过程的创建使用可能需要示例代码。不过用户的问题中已经要求生成相关问题,所以在回答后需要列出相关问题,比如如何选择存储引擎存储过程的优缺点等。 需要确保回答结构清晰,分点说明区别使用场景,并且引用提供的参考资料来支持观点。同时,检查是否有遗漏的重要区别,比如存储引擎对锁机制的支持不同,存储过程对事务的控制等。可能还要提到InnoDBMyISAM的具体差异,以及存储过程在安全性维护上的优势。 最后,要确保使用正确的中文表达,避免技术术语错误,并且按照用户要求,行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要使用。不过要遵循其他格式要求,如代码块用反引号,引用标识放在适当位置。</think>### MySQL存储引擎存储过程的区别及使用场景 #### 一、核心定义与功能差异 1. **存储引擎** - 定义:数据库底层的数据存储与操作实现机制,决定数据的物理存储方式、索引结构、事务支持等[^3]。 - 功能: - 管理数据存储:如$B+$树索引(InnoDB)或堆表结构(MEMORY) - 控制事务:例如InnoDB支持ACID事务,MyISAM不支持 - 处理并发:通过行级锁(InnoDB)或表级锁(MyISAM) ```sql -- 查询支持的存储引擎 SHOW ENGINES; -- 引用自[^2] ``` 2. **存储过程** - 定义:预编译的SQL代码块,封装业务逻辑以提高执行效率安全性[^4]。 - 功能: - 减少网络传输:复杂操作单次调用完成 - 增强数据安全:通过权限控制避免直接暴露表结构 - 提升性能:编译后代码直接执行 ```sql -- 创建存储过程示例 DELIMITER $$ CREATE PROCEDURE UpdateInventory(IN product_id INT, IN quantity INT) BEGIN UPDATE products SET stock = stock - quantity WHERE id = product_id; END $$ DELIMITER ; ``` #### 二、核心区别对比 | 维度 | 存储引擎 | 存储过程 | |---------------|---------------------------------------|-------------------------------| | **作用层级** | 数据存储与访问机制(物理层) | 业务逻辑封装(应用逻辑层) | | **管理对象** | 表类型(如InnoDB/MyISAM) | SQL代码流程控制(如循环/条件)| | **性能影响** | 决定读写速度、并发能力 | 减少网络延迟,优化复杂计算 | | **典型应用** | 事务处理、索引优化 | 批量数据处理、权限隔离 | #### 三、使用场景选择 1. **存储引擎适用场景** - **InnoDB**:需要事务支持(如银行转账)或高并发写操作 - **MyISAM**:读密集型场景(如日志分析),且无需事务 - **MEMORY**:临时数据缓存,要求极速访问 2. **存储过程适用场景** - **复杂业务逻辑**:例如订单状态更新涉及多表操作 - **高频重复操作**:如每日报表生成,减少代码冗余 - **权限隔离需求**:限制用户直接操作敏感表 #### 、关联与协作 存储引擎存储过程可结合使用: - 在InnoDB引擎中,通过存储过程实现事务性批量操作 - 利用存储过程封装MyISAM表的定期维护任务(如索引重建) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值