5.1索引
在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别,如小时候查字典中使用的索引,它是用于提高数据库数据访问速度的数据库对象。
5.1.1索引的基本概念
在关系数据库中,索引(Index)是一种单独地、物理地对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引是数据库中一种特殊类型的对象,它与数据库中的表有着紧密的关系。
数据库索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。一本书中,利用目录可以快速查找所需内容,而无须翻阅整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。书中的目录是一个标题列表,其中注明了各章节标题所对应的页码; 而数据库中的索引是一个表中所包含的关键字对应的值的列表,其中注明了表中关键字和所包含的各个值在数据库表中对应物理行所在的存储位置,如图5.1所示。
图5.1数据库索引与数据表的示意图
当数据库表中有大量记录时,对表进行查询有两种方式: 第一种方式是对全表进行搜索,将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量的磁盘I/O操作; 第二种方式是在表中建立索引,然后先在索引中根据关键字找到符合查询条件的索引值,再通过保存在索引中的数据库表中数据的相应物理位置所处的页码,快速找到数据表中所对应的记录。从图5.1中可以看到,索引可以避免对数据库表的全表扫描,一些查询可以仅在索引页中扫描少量索引页及数据页,而不是遍历数据库表中所有的数据页。但注意,并不是所有的数据库表建索引就检索快,若要检索表的数据记录比较少,则即使不用索引也可以一次性把所有数据读取出来,只需要做一次读写操作; 如果使用索引,则首先检索索引,至少读取一次索引数据,再根据索引检索结果去读取相应的数据,再读取一次表数据,至少要做两次读写操作,这显然比不用索引至少多读写一次,这样用索引检索数据就不快了。
一般来说,创建索引可以大大提高系统的性能,主要表现在以下方面:
(1) 通过创建索引,可以大大加快数据的检索速度,这是创建索引最主要的原因。
(2) 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
(3) 可以加速表和表之间的连接,在实现数据的参照完整性方面特别有意义。
(4) 在使用分组和排序子句进行数据检索时,利用索引可以减少排序和分组的时间。
(5) 在数据查询的过程中,SQL Server都会对查询语句进行优化。查询优化器如果发现所查数据已建索引,一般来说会根据索引优化所建立的查询执行路径,它将决定选择哪些索引可以使得该查询速度最快。
例如,从“学院”表中提取“学院名称”为“计算机学院”的“学院电话”和“学院地址”,则可使用下面的命令:
SELECT 学院名称,学院电话,学院地址
FROM 学院
WHERE 学院名称='计算机学院'
如果在“学院名称”那列上没有索引,那么SQL Server就可能对数据库中的数据表进行全表扫描,对表中的数据一行一行地查询,观察数据库表中每一行的“学院名称”列的内容。为了找出满足检索条件的那些行,必须访问表中的每一行。对于数据量大的数据表来说,表的检索可能要花费数分钟甚至数小时。
如果在“学院名称”列上创建了索引,就可以提高SQL Server查询所需数据的速度。SQL Server首先搜索针对“学院名称”列所建的索引,找到关键字“学院名称”为“计算机学院”的值,然后根据索引中的物理位置信息确定其在数据表中的物理页和行。由于索引是进行了排序和分类的,并且索引的行和列的数据比较少,所以对索引全部搜索一遍很快,这样就加速了数据的检索。
在数据库中建立索引会提高检索或查找的效率,但这并不是说表中的每个字段都需要建立索引,因为增删记录时除了对表中的数据进行处理外,还需要对每个索引进行维护,索引将额外占用磁盘空间,并且会降低增加、删除和修改的速度。在通常情况下,只对表中经常查询的字段才创建索引。