当前位置:   article > 正文

MySQL进阶篇(2)—SQL优化、视图/存储过程/触发器_mysql 触发器优化

mysql 触发器优化

目录

一、SQL优化

1.1 插入数据

1.2 主键优化

1.3 order by优化

1.4 group by优化

1.5 limit优化

1.6 count优化

1.7 update优化

1.8 总结

二、视图/存储过程/触发器

2.1 视图

2.1.1 视图介绍以及语法

2.1.2 视图的检查选项

2.1.3 视图的更新及作用

2.2 存储过程

2.2.1 存储过程的介绍

2.2.2 基本语法

2.2.3 变量

2.2.4 if判断

2.2.5 参数

2.2.6 case

2.2.7 while

2.2.8 repeat

2.2.9 loop

2.2.10 游标

2.2.11 条件处理程序

2.3 存储函数

2.4 触发器

2.4.1 介绍

2.4.2 语法

2.4.3 案例


一、SQL优化

1.1 插入数据

        

 

1.2 主键优化

  • 数据组织方式

        在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT)

  •  页分裂

        页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据多大,会行溢出),根据主键排序

  •  页合并

        当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。

        当页中删除的记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优化空间使用

 

  •  主键设计原则

1.3 order by优化

  • Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序
  • Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高

 

 

1.4 group by优化

1.5 limit优化

1.6 count优化

1.7 update优化

1.8 总结

二、视图/存储过程/触发器

2.1 视图

2.1.1 视图介绍以及语法

  • 介绍

        视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用时动态生成的

        通俗的将,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上

  • 视图的操作语法

 

2.1.2 视图的检查选项

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正自更改的每个行,例如插入、更新、删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,MySQL提供了两个选择:CASCADED和LOCAL,默认值为CASCADED

  • CASCADED

cascaded:翻译过来为 级联 ,指的是数据库参照完整性规则中的一种规则;具体的级联是指:当主表中关键字被修改或删除时,子表中与之关键字相同的记录也随之修改或删除。

         一旦我们在某一个视图创建的时候加了with cascaded check option,那么此时在操作这个视图时会去检查当前视图和当前视图所依赖的所有视图的条件是否满足

        当我们操作当前视图时,cascaded检查选项是,如果当前视图有检查选项,则插入数据要满足包括当前视图条件以及满足当前视图所依赖的视图的条件。如果当前视图没有检查选项,则插入数据要满足当时视图所依赖视图有检查选项及其依赖的视图的条件。

  1. #case1
  2. #创建一个基于students表的视图
  3. create or replace view v1 as select id,name from students where id<=20;
  4. #由于没有检查选项,所以插入id>20的数据也会插入成功
  5. insert into v1 values(21,'john');#插入成功
  6. #case2
  7. #创建一个基于v1的视图,并添加cascaded检查选项
  8. create or replace view v2 as select id,name from v1 where id>10 with cascaded check option;
  9. #添加检查选项后,再插入数据,MySQL就会判断插入数据是否满足条件,
  10. #由于此视图是基于v1的,所以现在可以插入的id值为 10<id<=20
  11. insert into v2 values22'lucy');#插入失败
  12. #case3
  13. #创建一个基于v2的视图
  14. create or replace v3 as select id,name from v2 where id<=15;
  15. #由于v3没有添加检查选项,但v3是基于v2的,所以现在可以插入的id值依然为 10<id<=20
  16. insert into v3 values(18,'Tom');#插入成功
  17. insert into v3 values(24,'kobe');#插入失败
  • LOCAL

        当我们在操作视图时,local检查选项是递归的去找当前视图所依赖的视图是否有检查选项,如果当前视图以及依赖的视图定义了检查选项,将会去判定我们所操作的数据是否满足这个视图的条件。如果在递归的过程中找到某一个视图在定义的时候没有增加检查选项,此时在操作数据时将不对这个条件做检查。

  1. #case1
  2. #创建一个基于students表的视图
  3. create or replace view v1 as select id,name from students where id<=20;
  4. insert into v1 values(21,'john');#插入成功
  5. #case2
  6. #创建一个基于v1的视图,并添加local检查选项
  7. create or replace view v2 as select id,name from v1 where id>10 with local check option;
  8. #添加检查选项后,再插入数据,MySQL就会判断插入数据是否满足条件,
  9. #由于此视图是基于v1的,v1没有检查选项,所以现在可以插入的id值为 id>10
  10. insert into v2 values22'lucy');#插入成功
  11. #case3
  12. #创建一个基于v2的视图
  13. create or replace v3 as select id,name from v2 where id<=15;
  14. #由于v3没有添加检查选项,但v3是基于v2的,所以现在可以插入的id值依然为 id>10
  15. insert into v3 values(18,'Tom');#插入成功

2.1.3 视图的更新及作用

视图的更新

        要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:

  1. 聚合函数或窗口函数(SUM()、MIN()、MAX()、COUNT()等)
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. UNION 或 UNION ALL

作用

  • 简单

        视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件

  • 安全

        数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们呢所能见到的数据

  • 数据独立

        视图可帮助用户屏蔽真实表结构变化带来的影响

2.2 存储过程

2.2.1 存储过程的介绍

        存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的

        存储过程思想上很简单,就是数据库SQL语言层面的代码封装和重用

  •  特点
  1. 封装、复用——>可以把某一业务SQL封装在存储过程中,需要用到的时候直接调用即可
  2. 可以接收参数,也可以返回数据——>在存储过程中,可以传递参数,也可以接收返回值
  3. 减少网络交互,效率提升——>如果涉及到多条SQL,每执行一次都是一次网络传输。而如果封装在存储过程中,只需要网络交互一次可能就可以了

2.2.2 基本语法

  • 创建

  • 调用

  • 查看

  • 删除

注意:在命令行中,执行创建存储过程SQL时,需要通过关键字 delimiter 指定SQL语句的结束符

2.2.3 变量

  • 系统变量

系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)

  • 用户自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量名” 使用就可以。其作用域为当前连接

  • 局部变量

局部变量是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN...END块

2.2.4 if判断

 

2.2.5 参数

 

2.2.6 case

2.2.7 while

2.2.8 repeat

2.2.9 loop

2.2.10 游标

游标(CURSOR)是用来存储查询结果集的数据类型,在存储工程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH和CLOSE,其语法分别如下

 

2.2.11 条件处理程序

条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为:

2.3 存储函数

 

2.4 触发器

2.4.1 介绍

        触发器是与表有关的数据库对象,指在 insert / update / delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

        使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其它的数据库是想死的。现在触发器只支持行级触发,不支持语句级触发

2.4.2 语法

2.4.3 案例

 

  • insert类型

  • update类型

  • delete类型

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/970999
推荐阅读
相关标签
  

闽ICP备14008679号