关于数据库索引的简介

来源:互联网 发布:c指针例题编程 编辑:程序博客网 时间:2024/05/30 02:24

一、索引的概念

索引是一种加快检索存储在数据库表中数据的方法。索引类似于书的目录,主要用于提高查询效率,也就是按条件查询的时候,先查询索引,再通过索引找到相关的数据。也就是说,索引建立了“关键词——文件——文件中位置”的映射。当然,索引自身也是通过文件来保存的。

二、索引的特点

    1.索引可以加快数据库的检索速度
    2.索引创建在表上,不能创建在视图上
    3.索引既可以直接创建,也可以间接创建
 

三、索引的优点

  1.创建唯一性索引,保证数据库表中每一行数据的唯一性
  2.大大加快数据的检索速度
  3.加速表和表之间的连接
  4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间


四、索引的缺点

   1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
  2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间
  3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

 


五、索引的分类

   1.从建立索引的方式分

  直接创建索引:利用“CREATE INDEX index_name ON table_name[(column1,column2...column n)]”
  间接创建索引:通过定义主键约束或者唯一性键约束,数据库会自动在相应字段上建立索引,这种索引属于间接创建索引

  2.从索引对数据完整性的影响上分

  普通索引:对数据完整性没有影响的索引

  唯一性索引:唯一索引保证在索引列中的全部数据是唯一的,“CREATEUNIQUE COUSTERED INDEX index_name ON table_name[(column1,column2...column       n)],通过设置主键和唯一性约束而建立的间接索引是唯一索引的特殊情况

  3.从建立索引的列的数目上分

  单个索引:也叫非复合索引,即建立在单个列上的索引,create INDEX index_name ON table_name [(column)];

  复合索引:又叫组合索引,在索引建立在多个字段上,最多16个字段 ”CREATE INDEX index_name ON table_name[column1,column2...column n]"   

  4.从索引对应的列值是否排序上分

  聚簇索引:物理索引(索引的物理记录)存储的顺序与基表的物理顺序相同,数据值的顺序总是按照顺序排列,CREATECLUSTEREDINDEX index_name ON         table_name [(column1,column2...column n) ]

  非聚簇索引:CREATEUNCLUSTERED INDEX index_name ON table_name [(column1,column2...column n)]

  5.按照列值与索引值得对应关系来区分

  稀疏索引 对于某些属于索引列的列值来说共享同一个索引值

  稠密索引 对于索引列的每一个列值,都有一个索引值与其对应


六、聚集索引与非聚集索引详解

  聚集索引要求索引的物理排列顺序与数据库中表内容排列的顺序相同的索引。每个表只能有一个聚集索引,因为对于某张特定的表来说,表内容的排列顺序是一定的。表中记

录必然是按照某一列的值来排列的,那么建立在这一列上的索引就是聚集索引,在不调整数据库记录顺序的情况下,建立在其他列上的索引不是聚集所索引。通俗的讲,也就是

第i条索引对应数据库中第i条记录,第i+1条索引对应数据库的第i+1条记录。

  如果索引的排列顺序与数据排列顺序不一致,那么这个索引就是非聚集索引。

 简单的总结一下聚集索和非聚集索引适用的条件。

索引类型经常分组group by经常使用order by经常查询某一范围内数据经常查询唯一数据列值经常变动列值不经常变动聚集索引适合适合适合不适合不适合适合非聚集索引不适合不适合不适合适合适合不适合

  对于group by和order by由于聚合索引顺序与数据顺序相同,因此操作迅速(对索引group by和order by得到的结果与对数据相同)。查询某一范围数据也是一样的道理。  相反,对于查询唯一一条数据,只需要根据索引得到记录所在位置即可,聚集索引并没有优势。由于聚合索引要保证索引顺序与记录顺序一致,如果列值经常变动,那么聚集索引就要付出更大的维护代价(调整整个数据的顺序)。

七、索引用到的数据结构和算法

1、B树/B+树/B*树

   属于高度很低的搜索树,MySql、SQLServer、Oracle都支持这种结构的索引

2、Hash

   对索引列的键值采用hash函数,hash值作为索引值,如果有重复的索引值则将其放入同一个槽中。也技术hi计算:IndexValue=hash(key)

   Hash索引通畅比B树/B+树/B*树更快,因为只需要一次计算便可以得到索引值,进而直接得到记录所在位置。但Hash也存在一些问题。

   a.多列建立Hash索引时,对于其中单个列的查询无法使用;

   b.hash值有冲突的时候,还需要取出位于一个槽中的数据进行比对才能确定结果

3、位图

   位图索引适合于基数小(取值范围很小,例如性别)并且不常变动的列。下面通过举例说明位图索引。

   例如对于表table中的列x(取值为0或1)和列y(取值为A或B或C)建立位图索引。如果数据库中共有n条记录,那么数据库会建立5个长度为n的串,分别对应于这两列总共可能的5中取值。

   串的产生规则是:对可能取值A对应的位串来说,如果记录i在这一列取值为A,那么串中的i位便为1,否则i位为0,构造出长度为n的串

   如果table中现有4条记录:R1(0,A),R2(1,A),R3(0,B),R4(0,C),位串分别为”1011“、”0100“、”1100”、“0010和”0001“。建立位图索引以后,便可以将对这两列联合查询的操作转化为与的位操作。

   例如,执行select * from table whiere x='0' and y='B'时,便可以直接取出"0"和"B"对应的位串,对两个位串做按位与的操作,结果为1的位对应的记录就是查询的结果。

   

0 0
原创粉丝点击