数据库索引(index)简介

版权声明:本文为博主原创文章,商业转载请联系作者获得授权,非商业转载请注明出处。 https://blog.csdn.net/liitdar/article/details/86503007

本文主要介绍数据库索引(index)的相关知识。

1 概述

1.1 what

数据库索引(index),是数据库管理系统中的一个排序的数据结构,用于协助快速查询、更新数据库表中的数据。

除了实际需要使用的数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据库中实际需要使用的数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引

1.2 how

说明:在这里非常简单的介绍使用索引提高数据查询效率的原理,而深层次的索引实现原理,此处不会讲解。

数据库索引的主要目的就是提高数据的查询效率,那么索引是如何提高查询效率的呢?

通过使用索引,数据库能够快速找出索引列中特定值的那一行;而如果不使用索引,数据库将不得不从第一条记录开始查找相关列的特定值,直到找到对应的那一行为止。在这个过程中,表越大,则可能花费时间就越多。

简单说,如果待查询的列有索引,则数据库就能快速定位到该列的某一个值的位置(并关联出相关记录),而省去了查找无用记录的过程,由此提高了数据查询效率。

需要注意的是,为数据库表添加索引也是有代价的:一是索引会增加数据库的存储空间(创建索引时会在另外的表空间,如 mysql 中的 innodb 表空间,以一个类似目录的结构存储索引信息),二是在插入和修改数据时会花费更多的时间(因为索引也要随之变动)。

2 创建索引

创建索引主要有两种方式:直接创建索引和间接创建索引。虽然这两种方式都可以创建索引,但是它们创建索引的具体内容还是有区别的,所以在实际应用中,我们需要根据具体需求,选择创建索引的方式。

下面分别介绍这两种创建索引的方式。

2.1 直接创建索引

可以使用“CREATE INDEX”语句在表上创建索引,语法如下:

CREATE INDEX 索引名称 ON 表名称 (列名称)

上面的“列名称”就是需要创建索引的列。

使用“CREATE INDEX”语句或者使用创建索引向导来创建索引,是最基本的索引创建方式。这种方式具有柔性,可以定制创建符合自己需要的索引。在使用这种方式创建索引时,可以使用很多选项,例如指定数据页的充满度、进行排序、整理统计信息等,通过这些选项可以优化索引。同时,使用这种方法创建索引,也可以指定索引的类型、唯一性和复合性,即既可以创建聚簇索引,也可以创建非聚簇索引;既可以在一个列上创建索引,也可以在两个或者两个以上的列上创建索引。

2.2 间接创建索引

在表中定义主键(primary key)约束或者唯一键(unique key)约束时,同时也会自动创建索引

主键约束是一种保持数据完整性的逻辑,它禁止表中的记录出现相同的主键记录。在创建主键约束时,系统会自动创建一个唯一性的聚簇索引。在逻辑结构上,主键约束是一种重要的结构,同时,在物理结构上,与主键约束相对应的结构是唯一性的聚簇索引。同样,在创建唯一键约束时,也同时创建了索引,这种索引则是唯一性的非聚簇索引

因此,当使用约束间接创建索引时,索引的类型和特征基本上都已经确定了,用户基本上是不可以定制的。

说明:

  • 当在表上定义主键或者唯一性键约束时,如果表中已经有了使用“CREATE INDEX”语句创建的标准索引时,那么主键约束或者唯一键约束创建的索引会覆盖以前创建的标准索引。即,主键约束或者唯一性键约束创建的索引的优先级高于使用“CREATE INDEX”语句直接创建的索引;
  • 在聚簇索引中,表中行的物理顺序与键值的逻辑顺序相同(一个表只能包含一个聚集索引)。相反,如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序是不匹配的。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

3 键(key)与索引(index)

key 与 index 是不同的层面上的概念。

key 是数据库关系模型理论中的一部份,比如有主键(Primary Key)、唯一键(Unique Key)、外键(Foreign Key)等,用于数据完整性检查与唯一性约束等作用。

index 则处于物理实现层面,如果对表个的任意列建立索引,那么当建立索引的列处于 SQL 语句中的 where 条件中时,就可以进行快速的数据定位,从而实现快速检索。至于唯一索引(Unique Index),只是属于 index 的一种而已,创建了唯一索引表示此列数据不可重复。

所以,在设计表的时候,key 是要处于模型层面的,而当需要进行查询优化,就需要对相关列建立索引了。

另外,也有一种说法,意思是 key(主要指 primary key, unique key, foreign key) 具备“约束(constrain)”和“索引(index)”两种作用;而 index 只具有索引作用。这种说法貌似也是有道理的。

最后,在网上找到了一段不知道是谁写的关于 KEY 和 INDEX 的总结(不保证准确性),可以参考着看一下:

Note that “primary” is called PRIMARY KEY not INDEX. 

KEY is something on the logical level, describes your table and database design (i.e. enforces referential integrity …).

INDEX is something on the physical level, helps improve access time for table operations.

Behind every PK there is (usually) unique index created (automatically).

猜你喜欢

转载自blog.csdn.net/liitdar/article/details/86503007