数据库10-视图与索引
视图
创建视图
特点:
- 虚表,从一个或几个基本表导出的表;
- 只存放视图的定义,不会出现数据冗余
- 基表中数据发生变化,从视图查询出数据也随之改变
- 视图建立后,用户可以像基表一样对视图查询
优点:
- 限制用户直接存取基表的某些列或记录,从而为基表带来附加的安全性;
- 视图可定义在多个基表上或其他视图上,通过视图可得到多个表经计算后的数据,从而隐藏数据的复杂性;
作用:
- 视图能够简化用户的操作:当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作
- 基于多张表连接形成的视图
- 基于复杂嵌套查询的视图
- 含导出属性的视图
- 视图使用户能以多种角度看待同一数据:视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要
- 视图能够对机密数据提供安全保护
- 对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
- 通过WITH CHECK OPTION对关键数据定义操作时间限制
- 利用视图可以清晰地表达查询:复杂查询分步实现;
创建视图
1 | CREATE VIEW <视图名> [列名1,…] AS <子查询> |
- 省略列名时,则由子查询中SELECT目标列中的诸字段组成
- 明确指定视图的所有列名:
- DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。
- 在对视图查询时,按视图的定义从基本表中将数据查出。
- 子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语
删除视图
语法:
1 | DROP VIEW <视图表> |
更新视图
由于视图是不存储数据的虚表,数据是来自其他基表部分数据,对视图的更新最终是对基表的更新。
- 对于直接CURD生成的基表,其视图只读;
- 对于采取统计查询/聚集查询的基表,其视图可删除,不可修改;
- 对于采取表达式计算的列,其更新不允许;
索引
概念
类似于词典的索引,索引是关于数据位置信息的关键字表。
- 数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的记录所在的存储位置。
- 可以为表中的单列或多列创建索引;
- 索引通常采用采用B树,B+树或哈希表等结构。
- 数据库系统检索数据时,根据索引提供的信息,可以直接找到与该条件临近的数据区,而不是一条一条记录地比较,因此可提高查询速度;
使用索引
- 建立索引是加快查询速度的有效手段
- 索引由DBMS内部实现,属于内模式范畴
- 建立索引:DBA或表的属主根据需要建立,有些DBMS自动建立以下列上的索引: PRIMARY KEY和 UNIQUE
- 维护索引:DBMS自动完成
- 使用索引:DBMS自动选择是否使用索引以及使用哪些索引
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。
- 在一个基本表上最多只能建立一个聚簇索引
- 用途:对于某些类型(范围查找)的查询,可以提高查询效率
- 适用范围:很少对基表进行增删操作,很少对其中的变长列进行修改操作
语法:
1 | CREATE CLUSTERED INDEX Stusname ON Student(Sname); |
非聚簇索引
- 数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置;
- 索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(也可以由聚簇索引规定)。
- 在搜索数据值时,先对非聚集索引进行搜索,找到数据值在表中的位置,然后从该位置直接检索数据。
- 由于索引包含描述查询所搜索的数据值在表中的精确位置的条目,这使非聚集索引成为精确匹配查询的最佳方法。
- 关键字为
NONCLUSTERED
单列索引
- 普通索引:允许在定义索引的列中插入重复值和空值;
- 唯一值索引:唯一索引确保索引列不包含重复值,在多列唯一索引的情况下,该索引可以确保索引列中每个值组合是唯一的
- 主键索引:不允许为空的唯一索引;
组合索引
在表中的多个字段组合上创建索引;
1 | CREATE [UNIQUE][CLUSTERED / NONCLUSTERED] INDEX <索引名> ON <表名> (列名1); |
删除索引
删除索引语法:DROP INDEX <索引名>
删除索引实例:DROP INDEX <索引名>
索引的原则
- 选择数据量较大的表建立索引
- 选择列中的数据多而杂的列建立索引
- 建立索引的数量要适量
- 索引要占用磁盘空间
- 维护索引结构系统要花费一定的开销
- 仅用来查询的表来讲课建立多个索引,对更新操作比较频繁的表少建立索引
- 优先考虑主键列建立索引
- 选择合适的时机建立索引
- 建立索引应选择在表中装入数据之后
- 如果要保证装入数据的唯一性,在装入数据前建立唯一性索引