3.2.2 索引管理

3.2.2 索引管理

索引是数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据。当进行数据检索时,系统先搜索索引,从中找到数据的指针,再直接通过指针从表中取数据。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引在逻辑上和物理上都与相关的表的数据无关,作为无关的结构,索引需要存储空间。创建或删除一个索引,不会影响基本的表、数据库应用或其他索引。当插入、更改和删除相关的表的行时,数据库会自动管理索引。

创建索引能提高查询效率,但也会增大修改数据的开销,使用索引时应综合考虑从表中检索数据和修改数据的速度。

索引的优点是查询快,缺点是会占用存储空间,在执行insert、delete、update操作时,会有额外的操作来维护索引。最常见的索引类型有:聚集索引、唯一索引、复合索引、函数索引、位图索引、全文索引等。

3.2.2.1 聚集索引和非聚集索引

聚集(clustered)索引,又称为聚簇索引。数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能有一个聚集索引。打个比方,一个表就像新华字典,聚集索引就像拼音目录,而每个字存放的页码就是数据物理地址,如果要查询一个“我”字,我们只需要查询“我”字在新华字典拼音目录对应的页码,就可以查询到对应的“我”字所在的位置,而拼音目录对应的A~Z的字顺序和新华字典实际存储的字的顺序A~Z也是一样的,如果中文新出了一个字,拼音第一个字母是B,那么它插入的时候也要按照拼音目录顺序插入A的后面。

如果不知道这个字的读音,这时就需要根据“偏旁部首”查找要找的字,然后根据这个字后的页码直接翻到某页来找到要找的字。但结合“部首目录”和“检字表”而查到的字的排序并不是真正的字典正文的排序方法,例如查找“张”字,我们可以看到在查部首之后的“检字表”中“张”的页码是672页,“检字表”中“张”的上面是“驰”,但页码却是63页,“张”的下面是“弩”,页码是390页。很显然,这些字并不是真正地分别位于“张”的上下方,现在看到的连续的“驰”“张”“弩”三字实际上就是它们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们把这种目录纯粹是目录、正文纯粹是正文的排序方式称为非聚集索引。

聚集索引和非聚集索引的区别如下。

(1)一个表只能存在一个聚集索引,而一个表可以存在多个非聚集索引。

(2)聚集索引存储记录是物理上的连续,而非聚集索引是逻辑上的连续,物理存储并不连续。

(3)聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序。非聚集索引就是普通索引,只对数据列创建相应的索引,不影响整个表的物理存储顺序。

3.2.2.2 唯一索引

唯一索引不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用INSERT或UPDATE语句添加数据时进行检查。

3.2.2.3 函数索引

函数索引包含函数或表达式的预先计算的值。如果建立了函数索引,数据库服务器会计算用户定义的函数的值,并将它们作为键值存储于索引中;如果表中的数据更改并导致索引键的某个值也发生变化,数据库服务器就会自动地更新函数索引。

若函数索引中使用的确定性函数发生了变化或被删除,则用户需手动重建函数索引;若函数索引中要使用用户自定义的函数,则函数必须是指定了DETERMINISTIC属性的确定性函数;若函数索引中使用的确定性函数内有不确定因素,则前后计算结果会不同。在查询使用函数索引时,使用数据插入函数索引时的计算结果为KEY值;修改时可能会导致在使用函数索引过程中出现根据聚集索引无法在函数索引中找到相应记录的情况,对此,进行报错处理。

3.2.2.4 索引管理

1.创建索引

因为表的数据是无序的,而索引的数据是有序的,索引会占用存储空间,所以我们最好为索引规划一个自己的表空间。

创建索引表空间:

(1)创建聚集索引。

DM8的默认聚集索引键是ROWID。若指定索引键,表中数据都会根据指定索引键排序。建表后,DM8也可以用创建新聚集索引的方式来重建表数据,并按新的聚集索引排序。

例如,可以对emp表以ename列新建聚集索引:

新建聚集索引会重建这个表及其所有索引,包括二级索引、函数索引,是一个代价非常大的操作。因此,最好在建表时就确定聚集索引键,或在表中数据比较少时新建聚集索引,而尽量不要对数据量非常大的表建立聚集索引。

(2)创建唯一索引。

在表dept的dname列上创建一个唯一索引,索引的名称为dept_unique_index,索引存储表空间为users:

用户可以在希望的列上定义唯一约束,DM8通过自动地在唯一键上定义一个唯一索引来保证唯一约束。

(3)创建函数索引。

基于函数的索引促进了限定函数或表达式的返回值的查询,该函数或表达式的值被预先计算出来并存储在索引中:

使用此函数索引:

也可以通过DM管理工具,来创建索引,如图3-3所示。

2.查看索引

查看索引程序如下:

图3-3 创建索引

3.删除索引

删除索引程序如下:

也可以通过DM管理工具来管理(新增、查看、修改、删除)索引,如图3-4所示。