一、视图
1、介绍
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。
2、作用
为什么要使用视图?
-
定制用户数据,聚焦特定数据
同一份数据,不同用户最终的要求不一样,如班主任、授课老师等,他们的关注点往往不同。
-
封装复杂查询,简化开发
几百张表连接查询,语句复杂,封装成视图后,仅一条语句搞定。
-
保护敏感数据
通过视图对外公开数据,不允许访问基表,保护基表数据。
比如:药品的实际进价 → \to →药品的公开进价 → \to →加点 150 150 150% → \to →药品的销售价格
-
组合分散数据,创建视图分区
数据量巨大 → \to →分库、分表(一张表数据可能存储在不同的数据库中)
最终汇总数据时,需要提取所有数据库中所有相同表的数据,可以用关键字
union
实现。 -
列名中文化
不推荐使用视图实现,一般交给前端程序员实现。
3、使用示例
-- 查看部门编号为10的所有员工信息
create view empvu10
as
select empno, ename, job
from emp
where deptno = 10;
-- 查看视图的表结构
desc empvu10;
-- 查询视图数据
select * from empvu10;
-- 给视图列取别名方法一
create view v_dept_sum_avg
as
select dname name, min(sal) minsal, max(sal) maxsal, avg(sal) avgsal
from emp e, dept d
where e.deptno = d.deptno
group by dname;
-- 给视图列取别名方法二(推荐)
create view v_dept_sum_avg
(name, minsal, maxsal, avgsal)
as
select dname, min(sal), max(sal), avg(sal)
from emp e, dept d
where e.deptno = d.deptno
group by dname;
4、视图上的DML操作
在视图上可以执行DML操作,但是基本上不使用。
- 可以通过视图删除基表中数据,只要视图中不出现:聚合函数、
group by
子句、distinct
关键字 - 可以通过视图修改基表中数据,只要视图中不出现:聚合函数、
group by
子句、distinct
关键字、使用表达式定义的列 - 可以通过视图向基表中插入数据,只要视图中不出现:聚合函数、
group by
子句、distinct
关键字、使用表达式定义的列、基表中未在视图中选择的其他列定义为非空并且没有默认值
注:删除视图只是删除视图的定义,数据依然被存储在基表中。
二、索引
1、介绍
索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录。
索引是提高数据库性能的重要方式。
MySQL中,所有的数据类型都可以被索引。
2、作用
索引可以被用来加快查询的速度,但是索引也占用空间,会影响增删改的速度。
因此,对于需要大量查询的表,建议使用索引;对于需要大量增删改的表,不建议使用索引。
3、分类
索引分类:普通索引、唯一性索引、全文索引、单列索引、多列索引、空间索引
4、创建
表简单时,建议创建表时创建索引;表复杂时,建议创建表后创建索引
使用示例:
-- 创建索引方法一:(create table创建)
create table t1 (
id int unique,
name varchar(50),
unique index idx_id(id asc)
);
-- 创建索引方法二:(create index创建【推荐】)
create table t2 (
id int unique,
name varchar(50)
);
create unique index idx_id_2
on t2(id asc);
注意点
-
尽可能重复少的列,多列时重复少的列在前
-
text(char / varchar)全文索引
-
像身份证这种唯一的字段,MySQL中是通过唯一索引来维护的,这与其他数据库不同
-
索引创建原则
主键、外键、唯一约束,建议创建索引
排序列、分组列,建议创建索引
经常作为
where
条件查询的列,建议创建索引
4、删除
删除索引时,需要提供索引所在的表名。
使用示例
drop index idx_id_2 on t2;
5、验证
执行计划:RDBMS数据查询时,会先生成执行计划,然后按计划执行
索引需要结合执行计划、根据执行生成结果的时间进行综合评定。
面试题:何时索引无效
- 条件中有
or
- 对于多列索引,不是使用的第一个,则不会使用索引
like
查询以%
开头- 如果列类型是字符串,那一定要在条件中将数据用引号引用起来,否则不使用索引
- 如果MySQL估计使用全表扫描比使用索引快,则不使用索引
- 小表查询不会使用索引
…………………………
参考网址:https://blog.csdn.net/sc9018181134/article/details/78888022