数据库的索引与试图与触发器
本章知识点
索引介绍
索引的设立
试图介绍
试图的设立
触发器定义
触发器编写
数据库备份
知识点讲解
索引介绍
查询复杂度:查询的次数,测试复杂度,采用的是悲观态度。复杂度用O(x)表示
常规的查询,顺序查询:安装顺序,查询到结果为结束。复杂度为O(n)。
排序的目的时候为了高效的查询
对于mysql任意一张表,常规使用的查询方法也是顺序查寻。
树结构:
根
节点
内部节点
叶子节点
`
根 A
内部节点 A B C
叶子节点 D E F G
Mysql为了优化查询,提出索引概念。
当用户创建索引的时候,mysql首先复制数据,完成一个新的Btree(平衡树)数据结构,mysql 索引默认用的时候B+tree结构。
平衡树:左树和右树高度相差不能高过1。
1、有一个根节点,根节点为空或者有一个记录和有两个子节点。
2、每个节点当做key和指针相互分割,指针指向子节点。
3、d表示数的宽度,除叶子节点之外,其他每个节点有[d/2,d-1]条数据,而且key从左到又从小到 大排列。
4、在一个节点当做,第n个子树所有key,小于这个节点当做的第n个key,大于这个节点当做的 第n-1个key。
5、所有的叶子节点必须在同一层次
用二分查找O(logn)
索引时候数据结构,可以加快我们查询的效率,但是创建索引需要复制数据,会占用资源。
使用索引的区间:
当我们使用索引后,查询指定数据返回的数据是总数据的3%-5%我们认为是合适的。
少量数据不适合用索引。
索引的设立
索引分类:
普通索引 就是一个普通的索引,可以为空,可以重复。
ALTER TABLE teacher ADD INDEX(column);
唯一索引 可以为空,不可以重复。
ALTER TABLE teacher ADD UNIQUE(column);
ALTER TABLE teacher ADD column type UNIQUE;
主键索引 不可以为空,不可以重复。
ALTER TABLE teacher ADD PRIMARY KEY(column);
只要是主键,就是索引。
多列索引。
ALTER TABLE teacher ADD INDEX(column1,column2,column3);
使用索引:
1、少量数据不使用数据
2、查询次数少不使用索引
3、查询要携带索引字段,通常放在select之后第一个
4、索引提高了查询的效率,占有跟多的资源。
试图介绍
View:当查询的复杂度比较大,多表,多关系,会导致查询语句混乱,不利于sql语句的编写和编 写的sql语句的可读性。于是mysql推出了试图模式。
试图模式是对一个查询的结果进行记录,试图里面只存放语句,不存放结果,类似于虚表。
试图优点:
1、简单,试图构建了一个虚拟的逻辑表,这个表里面的数据来自于指定的查询,而查询可 以是多表联查。在使用的时候,我们可以直接对试图表里面的数据进行查询,不用从原始 表查。
2、安全,数据库有权限设置,但是没有对行和列的权限。所以如果对一个表里的数据设置 不同的权限,mysql本身的权限设置有些不够,我们用试图查询出用户需要的数据,用户基 于试图进行查询。
3、数据独立,一旦试图试图的结构决定,可以屏蔽表结构变化给用用户带来的影响,在原 表当做增加一列。
试图的缺点:
试图会降低查询的效率。尤其在试图当做的查询当做再次使用试图。
试图的设立
需求:
查询所有姓孙的女生
创建
查询所有姓孙的学生
select * from student where name like "孙%"
然后将该查询形成视图
CREATE VIEW student_sun AS (select * from student where name like "孙%");
使用
交友网站对用户联系方式进行限制(没有18888,不要联系我)。
1、创建试图,查询所有用户的个人信息(残缺版)
2、从残缺版里查询所有女生。
查看所有试图
SHOW TABLE STATUS WHERE COMMENT=”view”;
删除试图
DROP VIEW student_sun;
触发器定义
Trigger
事件绑定的过程
以前端js/jq为例子
捕获对象
Document.getElementById
$(“#”)
编写条件
触发条件
Click()
Blur()
判断条件
If(条件){
block
}
执行函数
Function(){
}
当某个事物满足某个条件触发某个功能
触发器编写
以tab1和tab2做为案例
当tab1被插入的时候,自动插入数据到tab2
Tab1
Tab2
创建触发器:
DELIMITER || 声明mysql的结束符,默认结束符是;
CREATE TRIGGER tb2_auto_add AFTER INSERT
ON tb1 FOR EACH ROW
BEGIN
Insert into tb2(name,age) value(“老王”,18);
end
||
DELIMITR ;声明mysql的结束符,默认结束符是;
测试效果
触发器的语句分析
CREATE TRIGGER tb2_auto_add AFTER INSERT
ON tb1 FOR EACH ROW
BEGIN
Insert into tb2(name,age) value(“老王”,18);
end
Create 创建
Trigger 触发器
Tb2_auto_add 触发器名称,必须有意义
AFTER 触发时间
AFTER在触发事件之后
BEFOR 在触发器之前
INSERT 触发的条件
UPDATE 更新事件
DELETE 删除事件
INSERT 插入事件
EACH ROW 任意一行
BEGIN 开始编写触发事件
Insert into tb2(name,age) value(“老王”,18); 触发的事件
END 触发事件结束
查看触发器
触发器的信息都被存放在information_schema数据库当做的triggers表当中
Select * from information_schema.triggers;
查看触发器
Drop trigger tirggerName
使用触发器之前一定要确定数据库关系可以不可以完成需求。
DELIMITER ;
在触发器当中,NEW变量代表触发表。
DELIMITER ||
create trigger tb5_add_tb3_id_1 after insert ON tb3
for each row
begin
insert into tb5(tb3_id) value(NEW.id);
end
||
DELIMITER;
1、安全考虑,考虑到数据被修改的权限问题,我们用触发器代替用户 来修改数据
2、审计功能,对前端操作进行审计
3、实现业务规则
4、同步数据
5、用于科学计算,做数学统计
(1) 三门课
(2) 语文 数学 英语
(3) 任意两门课 成绩大于 90 优秀
(4) 任意两门课 成绩大于 80 良好
(5) 任意两门课 差
数据库备份
数据库的导入和导出
mysqldump
导出数据库
mysqldump -u root -p database table > *.sql
导入
Mysql -u 用户名 -p 数据库名称 < 数据库文件
不在mysql内部执行
知识点回顾
索引介绍
索引的设立
试图介绍
试图的设立
触发器定义
触发器编写
数据库备份