数据库索引、视图与触发器

一、数据库索引

  索引是一种特殊的数据结构,它包含了对数据表里的记录的指针,添加索引可以加速查询。类似于字典的目录。我们创建索引,会创建出一个特殊的文件来存储,所以我们对查询频繁的表或者字段添加索引。

  当使用索引之后,查询指定的返回数据是总数据的3%-5%我们认为是合适的。

1、索引分类:
  ①普通索引 就是一个普通的索引,可以为空,可以重复。

  ALTER TABLE student ADD INDEX(name);
  在这里插入图片描述
  ②唯一索引 可以为空,不可以重复(值不可重复
  ALTER TABLE student ADD UNIQUE(name);
  在这里插入图片描述
  在这里插入图片描述
  ③主键索引 不可以为空,不可以重复
  主键本身就是主键索引,我们创建表,添加了主键,就相当于添加了主键索引
  ALTER TABLE student ADD PRIMARY KEY(id);

  ④多列索引
  这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A,B,C)可以当做A或(A,B)的索引来使用,但不能当做B、C或(B,C)的索引来使用。
  ALTER TABLE student ADD INDEX(name,id,age);

  在这里插入图片描述

2、删除索引
  DROP INDEX name ON student;
  在这里插入图片描述

  DROP INDEX id ON student; 删除复合索引,需要删除创建索引时候的第一个字段

  `在这里插入图片描述

3、查看索引
  SHOW INDEX FROM student;
  在这里插入图片描述

二、数据库视图

视图
  当查询的复杂度比较大,这里指的是多字段,多关系的查询,会导致查询混乱。不利于sql语句的编写,sql语句的可读性,会影响到的是sql的拼接。视图模式就是对查询结果进行记录,视图当中只存放语句,不存放结果,类似于虚表。

视图的优点
  1、简单,视图构建了一个虚拟的逻辑表,这个表的数据来源于指定的查询,而查询可以是多表,在使用的时候直接使用虚表代替复杂的查询。

  2、安全,数据库有权限设置,但是没有对行和列进行设置的。所以,对同一个表当中完整的数据是否展示就是问题了。

  3、数据独立,就相当于在原表的基础上加一列。

视图的缺点
  视图会降低查询的效率,尤其是嵌套视图

1、创建视图
  CREATE VIEW student_view AS (SELECT id,name,age FROM student);
  在这里插入图片描述

2、查看视图
  SHOW TABLE STATUS WHERE COMMENT = “VIEW”\G;
  在这里插入图片描述
3、使用视图
  在这里插入图片描述
4、删除视图
  DROP VIEW student_view;
  在这里插入图片描述

三、触发器

  触发器(trigger),也叫触发程序,是与表有关的命名数据库对象,触发器是一种特殊的存储过程,但是触发器不需要语句调用,也不需要手动启动,他有事件触发,事件包括INSERT,UPDATE,和DELETE语句,当指定表发生指定动作,将激活触发器。

在这里插入图片描述
例如:
  Tb1插入姓名,tb2 获取tb1的数据同时插入。
  以major和course表为例子
  在这里插入图片描述在这里插入图片描述

1、创建触发器流程
  ①修改msyql的语法结束符
  DELIMITER ||将语法分割符修改为||
  在这里插入图片描述
  ②设置触发器

CREATE TRIGGER major_auto_add  创建一个叫做major_auto_add的触发器
AFTER INSERT ON major FOR EACH ROW 在major的任意行发生插入事件之后
BEGIN 开始执行
	INSERT INTO course(NAME)
VALUE
	("hello");
END|| 触发器设置结束

在这里插入图片描述
  ③将mysql的语法结束符修改回来。
  DELIMITER ;将语法分割符修改为;
  在这里插入图片描述
  ④触发触发器
  在这里插入图片描述
在这里插入图片描述在这里插入图片描述
2、查看触发器
  SELECT * FROM INFORMATION_SCHEMA.TRIGGERS\G;
  在这里插入图片描述
3、删除触发器
  DROP TRIGGER major_auto_add;
  在这里插入图片描述

注意:
!!尽量少使用触发器,不建议使用。

  假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。因此我们特别需要注意的一点是触发器的begin end;之间的语句的执行效率一定要高,资源消耗要小。

  触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后。

FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次。

 tigger_event详解:

  ①INSERT型触发器:插入某一行时激活触发器,可能通过INSERT、LOAD DATA、REPLACE 语句触发(LOAD DAT语句用于将一个文件装入到一个数据表中,相当与一系列的INSERT操作);

  ②UPDATE型触发器:更改某一行时激活触发器,可能通过UPDATE语句触发;

  ③DELETE型触发器:删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发。

trigger_order是MySQL5.7之后的一个功能,用于定义多个触发器,使用follows(尾随)或precedes(在…之先)来选择触发器执行的先后顺序。 

创建只有一个执行语句的触发器

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句;

创建有多个执行语句的触发器

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件

ON 表名 FOR EACH ROW

BEGIN

        执行语句列表

END;
posted @ 2019-06-17 16:05  Python及时行乐  阅读(682)  评论(0编辑  收藏  举报