zoukankan      html  css  js  c++  java
  • 数据库索引、视图与触发器

    一、数据库索引

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

      当使用索引之后,查询指定的返回数据是总数据的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.TRIGGERSG;
      在这里插入图片描述
    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;
    
  • 相关阅读:
    火狐浏览器处理jquery中:header的问题。
    兼容IE与FF的childNodes问题(ff childNodes)
    前端开发的几个辅助类工具
    固定 vs. 流动 vs. 弹性:哪种布局更适合你?
    由浅入深漫谈margin属性
    Firefox 的 Jetpack 扩展案例分析:Gmail 邮件提醒
    jQuery性能优化
    浅谈.NET中可用的定时器和计时器【上篇】
    现有分布式技术(socket、.net remoting、asp.net webservice、WSE、ES)和wcf的比较及优势
    Mono for Android 4.2初探
  • 原文地址:https://www.cnblogs.com/ilovepython/p/11068853.html
Copyright © 2011-2022 走看看