数据库基础三索引和视图

什么是索引(占据空间):简单的说,索引就是一个指针;对数据库表中一或多个列的值进行排序的结构,可以提高数据检索的性能,允许数据库程序迅速找到表中的数据,而不必
  扫描整个数据库
 
底层原理:当创建索引时,索引的键数据存储在B树结构内。这个索引具有一个根节点,也就是查询的起始点,根节点具有分支, 一个根节点具有多个中间叶级别(a~h等),
中间叶级别具有多个叶级别,如果是聚集索引,则叶级别是他本身,如果是非聚集索引,则叶级别包含指向堆或聚集索引数据页的指针

聚集索引:一个表只能拥有一个聚集索引,聚集索引存储记录是物理上连续存在,经常用在以范围查询来查询的列(between,>,<等运算符)

非聚集索引(默认):一个表或者视图上最多拥有249个非聚集索引,而非聚集索引是逻辑上的连续,物理存储并不连续。经常用在查找在where,join以及order by子句中频繁引用的那些列


重点:创建表索引,可以创建两种类型的索引,一个是聚集的,另一个是非聚集的,使用create index


当我们定义主键的时候,一个默认的索引就会被创建;如果我们不想设置默认的索引,一个可取的方式就是创建空白表,然后再创建索引

单字段索引: create index 索引名称  on 表名(列名)

唯一索引(不允许表中有重复的值): create unique index 索引名称   on 表名(列名)

隐含索引:是数据库服务程序在创建对象时自动创建的。比如,数据库会为主键约束和唯一性约束自动创建索引,where

何时考虑使用索引:一般来说,大多数用于表结合的字段都应该设置索引;经常在order by和group by里引用的字段也应该考虑设置索引,具有大量惟一值的字段,或是在where子句里
会返回很小部分记录的字段,都应该考虑设置索引

何时避免使用索引:不能用于小规模的表,不应该对包含大量null值的字段设置索引,经常被操作的字段不应该设置索引

修改索引: alter index 索引名称

删除索引: drop index 索引名称

(可辣死特的;聚集的)
create [unique] [clustered | nonclustered] index index_name on {
[database_name.[schema_name].|schema_name.] table_or_view_name
}
(column[asc|desc][...n])

参数: [unique] 在每个表上只可以有一个主键。但是,如果你希望强制其他非键列是唯一的,可以为创建的索引指定unique约束。可以在单个表上
创建多个unique索引,并且是可以包含那些包含null值(尽管在每个列组合上只允许一个NULL值)的列

[clustered |nonclustered] 这个参数指定索引类型,你只可以拥有一个clustered索引,但最多可以拥有249个nonclustered索引

index_name 定义了新的索引的名字

{[database_name.[schema_name].|schema_name] table_ot_view_name} 表示要索引的表或视图


column 这个参数指定用作索引键部分的一个或多个列

[asc | desc] 指定了特定的索引的顺序,asc升序,desc降序

视图:是一个虚拟表,对于用户来说,视图在外观和行为上都类似于表,但不需要实际的物理内存;视图可以包含表的全部或部分记录,可以由一个表或多个表创建

视图和表的区别:表占据物理空间,而视图不需要物理空间,他只是从表里引用数据

从一个表创建视图: create view 视图名称   as 
select * | column1 [,column2]
from 表名  [where 条件1[,条件2]] [with check option] [group by]
 
从多个表创建视图: create view 视图名称  as
select * | column1 [,column2]
from 表1,表2,表3  where 条件

从视图创建视图: create 视图2 as select * from 视图1
 
with check option:确保全部的update和insert语句满足视图定义里的条件,如果不满足,就会返回错误
例:创建视图时where条件里面要求name这个字段不能为空,而且加上了with check option,则你给name插入空值时就会报错

从视图创建表: create table 表名  select{*|column1[,column2]}
from view_name [where 条件1[,条件2]] [order by]

创建视图语句中不能包含order by语句,但是可以用group by子句

猜你喜欢

转载自blog.csdn.net/xhf852963/article/details/78929487
今日推荐