09-索引和视图

09-索引和视图

课程目标

掌握索引原理、索引的应用、 视图的概念、创建视图、修改视图、删除视图。

9.1索引原理

索引被用来快速找出在一个列上某一特定值的行。没有索引,MySQL不得不首先以第一条记录开始,然后读完整个表直到它找出相关的行。表越大,花费时间越多。对于一个有序字段,可以运用二分查找(Binary Search),这就是为什么性能能得到本质上的提高。MyISAM和InnoDB都是用B+Tree作为索引结构

(主键,unique 都会默认的添加索引)

9.2 索引的应用

1.创建索引

如果未使用索引,我们查询 工资大于 1500的会执行全表扫描,如下图9-1所示:

图9-1

什么时候需要给字段添加索引:

表中该字段中的数据量庞大

经常被检索,经常出现在where子句中的字段

经常被DML操作的字段不建议添加索引

索引等同于一本书的目录

主键会自动添加索引,所以尽量根据主键查询效率较高。

如经常根据sal进行查询,并且遇到了性能瓶颈,首先查看程序是否存算法问题,再考虑对sal建立索引,建立索引如下,如下图9-2所示:
create unique index 索引名 on 表名(列名); 

create unique index u_ename on emp(ename);
alter table 表名 add unique index 索引名 (列名); 

create index test_index on emp(sal);

图9-2

2.查看索引,如下图9-3所示:

show index from emp;

图9-3

3.使用索引,如下图9-4所示:

注意一定不可以用select * … 可以看到type!=all了,说明使用了索引

explain select sal from emp where sal > 1500;

条件中的sal使用了索引

图9-4

如上图:假如我们要查找sal大于1500的所有行,那么可以扫描索引,索引时排序的,结果得出7行,我们知道不会再有匹配的记录,可以退出了。
如果查找一个值,它在索引表中某个中间点以前不会出现,那么也有找到其第一个匹配索引项的定位算法,而不用进行表的顺序扫描(如二分查找法)。
这样,可以快速定位到第一个匹配的值,以节省大量搜索时间。数据库利用了各种各样的快速定位索引值的技术,通常这些技术都属于DBA的工作。

4.删除索引

drop index index_name on talbe_name

alter table table_name drop index index_name

alter table table_name drop primary key

其中,前两条语句是等价的,删除掉table_name中的索引index_name。

第3条语句只在删除primary key索引时使用,因为一个表只可能有一个primary key索引,

MySQL> alter table emp drop index test_index;

删除后就不再使用索引了,查询会执行全表扫描,如下图9-5所示:

图9-5

9.3 视图的概念

视图是一种根据查询(也就是select表达式)定义的数据库对象,用于获取想要看到和使用的局部数据。

视图有时也被成为“虚拟表”。

视图可以被用来从常规表(称为“基表”)或其他视图中查询数据。

相对于从基表中直接获取数据,视图有以下好处:

访问数据变得简单

可被用来对不同用户显示不同的表的内容

用来协助适配表的结构以适应前端现有的应用程序

视图作用:

提高检索效率

隐藏表的实现细节【面向视图检索】

如下图9-6所示:

图9-6

9.4 创建视图

如下示例:查询员工的姓名,部门,工资入职信息等信息。

select ename,dname,sal,hiredate,e.deptno from emp e,dept d where e.deptno= e.deptno and e.deptno = 10;

为什么使用视图?因为需求决定以上语句需要在多个地方使用,如果频繁的拷贝以上代码,会给维护带来成本,视图可以解决这个问题

create view v_dept_emp as select ename,dname,sal,hiredate,e.deptno from emp e,dept d where e.deptno = e.deptno and e.deptno = 10;

create view v_dept_avg_sal_grade as select a.deptno, a.avg_sal, b.grade from (select deptno, avg(sal) avg_sal from emp group by deptno) a, salgrade b

where a.avg_sal between b.losal and b.hisal; /*注意MySQL不支持子查询创建视图*/

9.5 修改视图

alter view v_dept_emp as select ename,dname,sal,hiredate,e.deptno from emp e,dept d where e.deptno = 20;

9.6 删除视图

drop view if exists v_dept_emp;

9.7 本章小结

本章主要阐述了MySQL中的视图。

posted @   ღ᭄遇见你²⁰²²  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示