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;
    
  • 相关阅读:
    阿里DatatX mysql8往 Elasticsearch 7 插入时间数据 时区引发的问题
    通俗易懂 k8s (3):kubernetes 服务的注册与发现
    ReplicaSet 和 ReplicationController 的区别
    使用Go module导入本地包
    k8s之statefulset控制器
    终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩
    Atitit drmmr outline org stat vb u33.docx Atitit drmmr outline org stat v0 taf.docx Atitit drmmr out
    Atitit all diary index va u33 #alldiary.docx Atitit alldiaryindex v1 t717 目录 1. Fix 1 2. Diary deta
    Atitit path query 路径查询语言 数据检索语言 目录 1.1. List map >> spel 1 1.2. Html数据 》》Css选择符 1 1.3. Json 》map》
    Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  • 原文地址:https://www.cnblogs.com/ilovepython/p/11068853.html
Copyright © 2011-2022 走看看