存储过程
存储过程是一堆sql语句的集。
Sql语句集可以表示为一个业务,(业务的变化比较小,并且业务完整,将一个小功能打包使用,可写成存储过程)
存储过程只是在创建时编译,再次运行时不会再编译,存储过程的速度非常快。
缺陷:存储过程能增加运行效率,但是会给数据库造成压力。尤其是在高并发的情况下,数据库压力倍增((可读性不高因为存储过程面向过程),维护方方便
索引
每张sql数据表默认为聚集索引,(索引也是一个表)
索引可以加快数据库访问效率,但是降低了删除和修改速度(字段修改了,同时索引也需要修改,所以降低了速度)
如果使用多列索引,where条件中字段的顺序非常重要,需要满足最左前缀列,如果where条件的第一个条件不是建表时的第一个表参数时,会出错。
在以下几种情况下 ,mysql 在查询中即使有索引也不会去使用:
在多列索引,查询条件中用的不是最左边的列,那么此时是不会使用索引。
like查询时 % 出现在第一位也不会使用索引
条件中有 or 也不会使用索引
如果 mysql 估计使用全表扫描比使用索引快,它也不会使用索引。
红色关键字示例:
delimiter $ //前后申明将‘ ;’以免和sql的‘ ;’发生冲突 ,一般我们修改结束标识符为$符号,或则双斜杠(\\)
create procedure 存储过程名称([参数列表])
BEGIN
select 2+3 from dual;
select * FROM t_car WHERE price>90000;
END
delimiter $
存储过程变量分为四种
1.全局变量
2.用户变量 set @
3.会话变量
4.局部变量 declare
select into 书写方法
存储过程函数
存储过程函数传入输出 in(表示输入out 表示输出) a1(表示参数) int(参入的参数类型),默认不写为输入in
-- create procedure cctv(in a1 int,in a2 int,out a3 int)
-- begin
-- set a3=a1+a2*2;
-- end
set @o:=null; -- 设置用户变量@o
call cctv(19,2,@o); --传入参数19和2 ,传出参数@o
select @o; --输出得到结果
循环
loop语句
begin_label: loop
sql语句集..
end loop end_label
注意:loop退出循环通常伴随着一个LEAVE 语句 LEAVE 语句 跳出或者跳回到循环
leave语句语法:leave label