对于更复杂的应用,简简单单的CURD实现不了的,又或者说实现起来性能没有那么多好,便捷性没有那么高。举个例子,假如我们想学习索引对于千万级数据优化效果,又或者我想输入一个学生的学号,就能获取学生在该学校所有的成绩分析图谱。又或者我想输入一个用户id,获取用户在平台中的活动数据,统计数据,每个月份的收益计划等。如果仅仅靠CURD实现的话,性能先别说,可能要在业务代码写很多for循环。遇到这种场景,使用存储过程。
举个例子,生成1000万条测试数据,代码如下
<?php
require_once 'Db.php';
$db = Db::init([],true);
$sql = 'DROP PROCEDURE IF EXISTS test';//如果存在名为test的存储过程,则删除
$db->query($sql);
$sql = "
CREATE PROCEDURE test(IN total INT(11))//创建名为test的存储过程,输入参数为整数,接受长度最长为11位
BEGIN //开始符
DECLARE number INT DEFAULT 0; //设置变量number,默认值为0
WHILE number < total DO //开始while循环 当number小于传入来的total时,循环体继续续
INSERT INTO study VALUES(NULL,MD5(FLOOR(RAND() * 10000)),FLOOR(RAND() * 2));//循环体执行的sql语句
SET number = number + 1;//每次循环时 number +1
END WHILE;//结束while循环
END //结束符
";
$data = $db->query($sql);
$sql = "CALL TEST(100)"; //执行存储引擎
$result = $db->query($sql);
var_dump($result);
执行前
image.png
执行后
image.png
以后每次想要创建多少条测试数据 只需要 call test(数目) 即可 这样子就可以减少大量的业务代码,而且性能更好.可以把需要的储存过程代码记录到数据库中,对应相应的业务.拿出执行即可.