数据库索引、视图与触发器
一、数据库索引
索引是一种特殊的数据结构,它包含了对数据表里的记录的指针,添加索引可以加速查询。类似于字典的目录。我们创建索引,会创建出一个特殊的文件来存储,所以我们对查询频繁的表或者字段添加索引。
当使用索引之后,查询指定的返回数据是总数据的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;