【SQL】索引

1.定义

索引:一种数据结构,典型的是B-树,有键值对,键对应属性的某个值,值对应该键的存放位置。

建立索引的目的:加快查询速度

比如:

SELECT *
FROM Movies
WHERE studioName = 'Disney' AND year = 1990;

如果有studioName上的索引,则不需要搜索Movies中所有的元组,只要根据索引直接取出studioName = 'Disney' 的元组,再判断year值是否符合条件即可。

 

2.声明

CREATE INDEX 索引名 ON 表名(属性名)

CREATE INDEX YearIndex ON Movies(year);

多属性索引

CREATE INDEX KeyIndex ON Movies(title, year);

多属性索引的属性顺序是有意义的,代表了索引的建立层次。如上面例子中,先是title再是year,则先在title上建立索引,可以找到指定的title集合,再在该集合上建立year的索引。

查询较多的属性应该放在前面。

删除索引:

DROP INDEX 索引名

3.索引的选择

建立索引并不一定能够加快查询的速度。

如果更新操作多,则在更新时需要更新索引,导致大量的操作。

数据库操作时,主要的时间都消耗在磁盘页面读取上。

两种数据存储的方式: 

1.不是属性聚集的:同一个属性上相同的值随机存储在磁盘上,这样每取出一个目标元组都要读取一个磁盘页面。如果建立的索引中,查询出来的元组有很多个,则索引并没有多大的优势。

2.是属性聚集的:如果元组在建立索引的属性上聚集,则大量的目标元组都在一个磁盘页面上,采用索引可以大大加快查询速度。

如果不是属性聚集的,则在目标元组比较少时,索引才会节约时间。

采用索引时时间的消耗

1.查询时:载入索引的磁盘页面,载入索引相应键值对中给出的磁盘页面

2.更新时:载入数据磁盘页面,写入数据磁盘页面,载入索引磁盘页面,写入索引磁盘页面

 索引自动选择:

有很多数据库工具用于自动分析选择较好的候选索引。采用贪心法。每次选择一个能够带来正面收益的属性简历索引,之后继续评估剩下的属性。

原文地址:https://www.cnblogs.com/dplearning/p/4888095.html