关系中属性A上的索引是一种数据结构,它能提高在属性A上查找具有某个特定的值的元组的效率(B-树)
索引键-值:a-属性A上分量为a的元组集存放的位置
索引键可以来自关系的任何一个属性或属性组
创建索引
create index yearIndex on movies(year)
查询处理器在处理指定年份的查询时,仅对年份为指定值的movies元组进行测试
create index keyIndex on movies(title,year)
先返回满足title的再返回其中满足year的,按顺序找出满足前面的属性构成的属性子集的元组
如果对电影名的查询多于年份则用(title,year)
若对年份的查询多于电影名则用(year,title)(因为如果使用(title,year)的话,只指定year,一开始判断title的时候依然是返回全部的元组)
删除索引
drop index yearIndex
索引的选择
1.如果属性上存在索引,则为该属性指定一个值或者取值范围能极大地提高查找的执行效率
2.插入,删除,修改会变得更费时
假设关系的元组被分配在磁盘页上
检查一个元组,需要将包含它的整个磁盘页调入主存
检查一个磁盘页上所有元组花费的时间和检查它上面一个元组的时间差不多
所以主要时间花费在于把磁盘页调入主存,以及从主存把数据写回磁盘页
关系上最有用的索引是其键上的索引
1.查询中经常会为主键指定值
2最多只有一个磁盘页需要被读入主存(除了存索引本身的磁盘页)
非键属性但也有用的索引
1.该属性几乎可以看作键,没有多少元组在该属性上具有给定值
2.元组在该属性上是“聚集”的,即通过将具有该属性上公共值的元组分组到尽可能少的磁盘页里来将一个关系聚合到一个属性上
另外有没有用最终还是要看会返回多少磁盘页
比如在year上建了索引,然后相同的year不是聚集的每个磁盘页都分散的有那更不建索引是一样的
计算最佳索引p211
修改操作的开销是查询中访问索引或数据的两倍
从直观上来讲,如果某类查询非常频繁,那么就仅仅创建有助于该查询的索引
索引的自动选择
1.确定查询工作集
2.指定约束条件
3.“调优顾问”会生成一系列候选索引并对它们进行评估(典型的查询被提交给DBMS的查询优化器,查询优化器会在某候选索引集存在的假设下估算查询执行的时间)
4.提交或创建具有最小代价的索引集
在索引的选择上可以使用贪心策略
网友评论