索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
如下图:
索引通常采用 B 树或 B+ 树等结构。索引由索引项组成,索引项由来自表中每一行的一个或多列(搜索关键字)组成。B 树按搜索关键字排序,可以在搜索关键字的任何关键字上进行高效搜索。
假设我们不能通过索引定位数据库内的信息,现在需要在学生表中寻找张三,那么我们为了找到他,就得遍历整张表。查找时间将随着表内数据量的增加而增加,这并不会是我们想要看到的结果。
如果引入了索引,我们能直接通过索引定位张三,获得他的相关数据,无论数据量如何增长,查找时间都是O(1),很显然能够减少时间开销。
索引无疑能减少数据查找所需要的时间,但创建索引也是需要付出代价的:
1、索引在数据库中会占用一定的存储空间
2、在对数据进行更新(插入、删除、修改)操作时,为使索引和数据保持一致,还需要对索引进行维护
保证数据库表中每一条数据的唯一性
大大加快数据的检索速度
加速表与表间的连接
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
通过使用索引,可以在查询的过程中,使用优化的隐藏器,提高系统的性能
创建索引和维护索引需要花费时间,而且时间将随数据量的增加而增加
索引需要占物理空间,除了数据表占数据空间以外,每一个索引还要占一定的空间,如果要建立的是聚簇索引,那么需要的空间就会更大
当对表中的数据进行增加、删除、修改操作时,索引也需要进行动态的维护,这就降低了数据的维护速度
聚簇索引是一种存储方法,使表中的数据与索引存储在相邻物理空间,并使行的物理顺序与索引的顺序保持一致。
键值连续的记录集
经常要搜索范围值的列
需要以某种特殊的顺序频繁访问记录、检索相关的记录集
根据值的范围检索行记录
非聚簇索引是:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。
唯一索引确保索引列不包含重复的值
虽然索引能大大地提高效率,但并不是每一个数据列都能使用索引的:
经常需要搜索的列
作为主键的列,强制该列的唯一性和组织表中数据的排列结构
经常用于连接的列,这些列主要是一些外键
经常需要根据范围进行搜索的列上
经常需要排序的列
经常使用在where子句中的列
查询中很少使用的或用作参考的列
很少数据值的列
定义为 text,img,bit数据类型的列
修改性能远远大于检索性能的列。
这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。
选择数据量较大的表建立索引
建立索引的数量要适量
选择合适的时机建立索引
优先考虑主键列建立聚簇索引
为支持连接操作,考虑在外键上建立非聚簇索引
最好选择包含大量非重复值的列建立非聚簇索引
原文地址:http://blog.csdn.net/u012403246/article/details/45715831