大家好,又见面了,我是你们的朋友全栈君。
目录
视图是一张虚拟表,并不在数据库中以存储数据值集的形式存在。在引用过程中依据基表动态生成。
安全:有的数据是需要保密的,如果直接把表给出来进行操作会造成泄密,那么可以通过创建视图把相应视图的权限给出来即可保证数据的安全。
高效:复杂的连接查询,每次执行时效率比较低,可以考虑新建视图,每次从视图中获取,将会提高效率。
定制数据:将常用的字段放置在视图中。
#查看10号部门所有的员工信息
create view v_emp as select * from emp where deptno=10;
select * from v_emp;
#将基表的ename字段修改了
update v_emp set ename='kitty' where empno=7839;
#将视图包含的deptno均修改为20,在基表中修改
update v_emp set deptno=20;
#结果集为空,基表中不存在10号部门了
select * from v_emp;
# with check option保证视图查询条件不被修改,但其他字段可以修改
create view v_emp as select * from emp where deptno=10 with check option;
#删除视图(DDL操作)
drop view v_emp;
索引是供服务器快速在表中查询一行数据的数据结构,可以比作书籍的目录。mysql中的索引的默认数据结构是B-Tree。
性能从高到低依次是:
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL,其中all表示全表扫描。一般来说,查询至少达到range级别,最好能达到ref级别。否则,sql的查询性能会很慢。
关键词explain:查看sql执行性能
#解释计划任务
#explain:查看sql执行性能
#性能级别:const,查询1row
explain select * from emp where empno=7788;
#性能级别:all(全表扫描),查询14row
explain select * from emp where ename='scott';
代码说明:为什么第1条查询比第2条查询快这么多?第1条语句的条件字段是主键,主键自动创建索引,根据记录地址查找;而第2条语句的条件是普通字段,做的是全表扫描。
create index index_name on tname(fie1...);
#创建普通单列索引,多个列用逗号隔开
create index index_name on emp(ename);
#性能级别:ref,查询1row
explain select * from emp where ename='scott';
#删除索引
drop index index_name on emp;
与普通索引区别是指定列的数据必须是唯一的,主键、唯一约束、外键等都会自动添加索引。
#创建唯一索引,唯一约束也会添加唯一索引
create unique index index_name on tname(fie);
表数据量足够大;
增删改较少的表;
高基数列。什么意思?该列的数据大多数都不一样。
索引需要单独开辟空间进行维护,对数据进行增删改,都需要维护索引。所以索引不易添加过多;
将条件列设置索引(经常作为条件的列);
索引失效的状况:比如or关键字会导致索引失效。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163058.html原文链接:https://javaforall.cn