数据库索引
数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引是对数据库表中一个或多个列的值进行排序的结构。如果想按特定职员的姓来查找,则与表中搜索所有的行相比,索引有助于更快地获取信息。
索引的优缺点
索引的优点
- 大大加快数据的检索速度
- 创建唯一性索引,保证数据库表中每一行数据的唯一性
- 加速表和表之间的连接
- 在使用分组和排序子句进行数据检查时,可以显著减少查询中分组和排序的时间。
索引的缺点
- 索引需要占物理空间
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
索引的类型
根据数据库的功能,可以在数据库设计器中创建四种索引:普通索引、唯一索引、主键索引和聚集索引。
普通索引
最基本的索引类型,没有唯一性之类的限制。
唯一索引
唯一索引是不允许其中在任何两行具有相同索引值的索引。
当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(Iname)上创建了唯一索引,则任何两个员工都不能同姓。
对某个列建立UNIQUE索引后,插入新纪录时,数据库管理系统会自动检查新纪录在该列上是否取了重复值,在CREATE TABLE命令中的UNIQUE约束将隐式创建UNIQUE索引。
主键索引
简称为主索引,数据库表中一列或列组合(字段)的值唯一表示表中的每一行。该列称为表的主键。
在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键索引。
候选索引
与主索引一样要求字段的唯一姓,并决定了处理记录的顺序,在数据库和自由表中,可以为每个表建立多个候选索引。
聚集索引
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引,即如果存在聚集索引,就不能再指定CLUSTERED关键字。
索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。聚集索引更适用于很少对基表进行增删改操作的形况。
非聚集索引
在非聚集索引中,数据库表中记录的物理顺序与索引顺序可以不相同。一个表中只能由一个聚集索引,但表中的每一列都可以有自己的非聚集索引。
操纵索引
创建索引
CREATE [UNIQUE][CLUSTERED|NONCLUSTERED] INDEX<索引名>
ON<表名>(<列名>[ASC|DESC],<列名>[ASC|DESC]...])
ALTER TABLE tablename ADD INDEX[索引的名字](列的列表);
CREATE TABLE tablename([...],INDEX[索引的名字](列的列表));
与表一样,索引也需要有唯一的名字,且基于一个表来建立,可以根据表中的一列或者多列,当列的顺序都是升序默认可不必标出,当属性列有按照降序排列时,所有属性的升序降序都不要标明。
- UNIQUE——建立唯一索引。
- CLUSTERED——建立聚集索引。
- NONCLUSTERED——建立非聚集索引。
- ASC——索引升序排序。
- DESC——索引降序排序。
修改索引
对于已经建立的索引,如果需要对其重新命名,可以使用ALTER INDEX语句。其一般格式为
ALTER INDEX <旧索引的名字> RENAME TO <新索引名>
删除索引
当某个时期基本表中数据更新频繁或者某个索引不再需要时,需要删除部分索引。SQL语言使用DROP INDEX语句删除索引,其一般格式是:
DROP INDEX <索引名>
删除索引时,DBMS不仅在物理删除相关的索引数据,也会从数据字典删除有关该索引的描述。
索引的实现方式
B+树
B+树的特性:
- 所有的数据都存储在叶子结点的链表中,且链表中的数据都是有序存放的;
- 叶子结点间用指针相连;
- 不可能在非叶子结点命中;
- 非叶子结点相当于时叶子结点的索引,叶子结点相当于时存储数据的数据层;
- 更适合文件索引系统;
B+树的性能:
等于在数据集合做一次二分查找;
与B数的区别:
- B+数只有达到叶子结点才命中。
- B-数可以在非叶子结点命中。