索引概述

索引是一种可以加快检索的数据库结构,它包含从表或视图的一列或多列生成的键,以及映射到指定数据存储位置的指针。通过创建设计良好的索引可以显著提高数据库查询和应用程序的性能。从某种程度上说,可以把数据库看作一本书,把索引看作书的目录。借助目录查找信息,显然比没有目录的书方便快捷。除提高检索速度外,索引还可以强制表中的行具有唯一性,从而确保数据的完整性。

索引一旦创建,将由DBMS自动管理和维护。当插入、修改或刷除记录时,DBMS会自动更新表中的索引。编写SQL查询语句时,有索引的表与没有索引的表在使用方法上是一致的。虽然索引具有诸多优点,但要避免在一个表中创建大量索引,否则会影响插入、删除、更新数据的性能,增加索引调整的成本,降低系统的响应速度。

 

索引的类型

聚集索引

在聚集索引中,表中行的物理存储顺序与索引键的逻辑(索引)顺序相同。由于真正的物理存储只有一个,因此,一个表只能包含一个聚集索引。创建或修改聚集索引可能会非常耗时,因为要根据索引键的逻辑值重新调整物理存储顺序。

在以下情况下,可以考虑使用聚集索引。

(1)包含有限数量的唯一值的列,如仅包含100个唯一状态码的列;
(2)使用 BETWeeN>>=、<和<这样的运算符返回某个范围值的查询;
(3)返面大型结果集的查询。

 

非聚集索引

非集索引与聚集索引具有相似的索引结构。不同的是,非聚集索引不影响数据行的物理存储顺序,数据行的物理存储顺序与引键的逻辑(索引)顺序并不一致。每个表可以有多个集索引,而不像聚集索引那样只样有一个。

与聚集索引类似,非聚集也可以提升数据的查询速度、但也会降低插人和更新数据的速度。当更改包含非聚集索引的表数据时,DBMS必须同步更新索引。如果一个表需要频繁地更新数据,不应对它建立太多的非聚集索引。另外,如果硬盘和内存空间有限,也应该限制非聚集索引的数量。

 

唯一索引

唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行在某种方式上具有唯一性。只有当唯一性是数据本身的特征时指定唯一索引才有意义。例如,如果希望确保学生表的“身份证号”列的值唯一,当主键为“学号”时,可以为“身份证号”列创建一个
UNIQUE约束。当尝试在该列中为多个学生输入相同的身份证号,将显示错误消息,禁止输入重复值。使用多列唯一索引,能保证索引键值中多列的组合是唯一的。例如,如果为“姓”和“名”列的组合创建了唯一索引,则表中任意两行记录不会具有完全相同的“姓”和“名”值。

聚集索引和非聚集索引都可以是唯一的,可以为同一个表创建一个唯一聚集索引和多个唯一非聚集索引。

创建 PRIMARY KEY或 UNIQUE约束时会为指定列自动创建唯一索引。由
UNIQUE约束自动生成的唯一索引和独立于约束手工创建的唯一索引没有本质区别,二者数据验证的方式是相同的,查询优化器也不会区分唯一索引是由约束自动创建的还是手动创建的。但是,如果目的是要实现数据完整性,则应为列创建
UNIQUE或 PRIMARY KEY约束,这样做才能使索引的目标明确。

 

视图索引

视图也称为虚表,由视图返回的结果集格式与基本表相同,都由行和列组成,在SQL语句中使用视图与使用基本表的方式相同。标准视图的结果集不是永久地存储在数据库中。每次查询引用标准视图时,
SQL Server会在内部将视图的定义替换为该查询,直到修改后的查询仅引用基本表。

对标准视图而言,查询动态生成的结果集开销很大,特别是涉及对太量行进行复杂处理的视图(如聚合大量数据或联接许多行)。如果在查询中频繁地用这类视图,可通过对视图创建唯聚集索引来提升性能。这类索引称为视图索引,对应的视图称为索引视图。索引视图是可以有效改善标准视图的查询性能。对视图创建唯一聚集索引后,结果集将直接存储在数据库中,就像带有聚集索引的基本表一样。

如果很少更新基础表数据,则索引视图的使用效果最佳。如果经常更新基础表数据,维护索引视图的开销可能超过使用索引视图所带来的性能收益。如果基础表数据以批处理的形式定期更新,但在两次更新之间主要作为只读数据处理,可考虑在更新前删除所有索引视图,更新完毕后再重新生成,这样可提升批处理的更新性能。

 

全文索引

全文索引是目前搜索引擎的关键技术之一。试想在1兆大小的文件中搜索一个词,可能需要几秒,在100兆的文件中可能需要几十秒,在更大的文件中搜索开销会更大。为加快此类检索速度,出现了全文索引技术,也称倒排文档技术。其原理是先定义一个词库,然后在文章中查找并存储每个词条出现的频率和位置,相当于对文件建立了一个以词库为目录的索引,这样查找某个词的时候就能很快的定位到该词出现的位置。

 

XML索引
可以对xml数据类型列创建XML索引。XML索引对列中xml实例的所有标记、值和路径进行索引,从而提高查询性能。在下列情况下,可考虑创建XML索引。

(1)对xml列进行查询在工作中很常见。但需要注意的是,xml列如果频繁修改,可能会造成很高的索引维护开销。
(2)xml列的值相对较大,而检索的部分相对较小。生成索引避免了在运行时分析所有数据,能实现高效的查询处理。

 

索引的设计

既然索引有如此多的优点,能否为表中的每一列创建一个索引呢?这种想法有其合理性,但也非常不明智,因为索引也有许多不利之处:

(1)创建和维护索引要耗费时间,随数据量的增加时间也会增加。
(2)索引需要占用物理存储空间。如果建立聚集索引,需要的存储空间会更大。
(3)当修改表中数据时,索引要同步更新,降低了数据的更改速度。

 

因此,应仔细考虑哪些列上需要创建索引,哪些列上不能创建索引。索引设计不佳和缺少引是影响数据库和应用程序性能的重要瓶颈。设计高效的索引对于获得良好的数据库和应用程序性能极为重要,可考虑以下索引设计准则。

(1)一个表如果建有太量索引会影响 INSERT、 UPDATE和DELE语何的性能,要减少或删除不必要的索引。
(2)避免对频繁更新的表创建过多的索引,并且索引的列要尽可能少。
(3)使用多个索引可以提高更新少而数据量大的查询性能,因为查询优化器有更多的索引可供选择,从而可以确定最快的访问方法。
(4)对数据量小的表进行索引可能不会产生优化效果,查询优化器遍历索引数据时花费的时间可能比直接查询基本表的时间还长。
(5)视图包含聚合、表联接,或聚合和表联接的组合时,视图索引可以显著提升性能。
(6)使用数据库引擎优化顾问来分析性能瓶颈,并据此调整索引。

 

 

参考资料:[1]陈志泊,王春玲,许福,范春梅.数据库原理及应用教程(第3版)[M].北京:人民邮电出版社,2014:91-94.

 

技术
©2019-2020 Toolsou All rights reserved,
Redis 计数器 高并发的应用pytorch之ResNet18(对cifar10数据进行分类准确度达到94%)在Vue中使用Web Worker函数基本定义和使用‘未完待续 如何建设数据安全体系?最优化方法总结:公式解、数值优化、求解思想c++内存 指针越界检测机制_CrtMemBlockHeadePython垃圾回收与内存泄露蚂蚁集团香港IPO获得中国证监会批准Keras保存与加载模型(JSON+HDF5)