数据库索引小结

来源:互联网 发布:苏州软件测试培训 编辑:程序博客网 时间:2024/06/06 03:54

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新表中的数据;

即:在数据之外,数据库维护着满足特定算法的数据结构,这些数据结构以某种方式引用数据,这样就能在这些数据结构上实现高级查找算法,这样的数据结构就是索引;

为表建立索引也是有代价的,索引需要占用额外的存储空间以及更新数据的同时可能要更新索引;


如图:若需要加快第二列的查找速度,例如(SELECT Col1,Col2 FROM TABLE_NAME WHERE Col2 = 22),在没有索引的情况下,数据库管理系统只能顺序搜索,时间复杂度为O(N),这在有着海量数据的数据库内很难实现;在建立索引之后,我们通过搜索索引的这棵二叉搜索树来找到对应数据的地址,这样我们能在log2(N)下查找数据;


根据数据库的功能,索引的种类主要有三种:唯一索引,主键索引,聚集索引

唯一索引:不允许任意两行的索引值相同,例如:在表中员工姓名列上创建唯一索引之后,公司不能有同姓名的员工;

主键索引:数据库中有一列,用于唯一的标识数据库中的每一行,该列被称为主键,在查询中使用主键,能允许主键对数据的快速访问;

聚集索引:在聚集索引中,表中行的物理顺序与键值的索引顺序相同,一个表只能包含一个聚集索引;


数据库占用空间巨大,一般存在于磁盘中,磁盘在每次读取数据时,会从这个位置开始,将后面的一部分数据也读进内存,这就是磁盘预读,依据了计算机科学里的局部性原理:当前数据被访问,其附近的数据被用到的可能性会很大,操作系统一般将主存和磁盘存储区分为大小相等的存储块,每个存储块称为一页;

数据库利用磁盘预读原理,将每个节点的大小设置为一页,这样一个节点只需要一次I/O;

B-Tree中一次检索,需要h-1次I/O(根节点常驻内存);复杂度为O(h)=O(logdN);B-Tree的出度d一般非常大,使得树的深度h很小;而红黑树h明显要深的多,所以效率不及B-Tree;

在MySQL中使用B+Tree,B+树的所有数据存在叶子节点上,非叶子节点上没有指向数据的指针,并且将所有叶子节点用一个链表相连;

所以B+树有两种搜索方法:

1. 与B树相同,从根节点开始搜索,都需要走完树的所有层(B树不一定);

2. 通过链表顺序搜索;


综上,创建索引的优点:

1. 通过创建唯一性索引,保证数据库表中每一行的唯一性;

2. 大大加快对数据的检索速度,也是创建索引主要的原因;

3. 加速表与表之间的连接;

4. 在使用分组和排序子句进行数据减速时,缩短分组和排序的时间;


索引的缺点:

1. 创建索引和维护索引需要时间与空间;

2. 数据更新时索引也要更新,降低数据更新速度;


我们应该在这些列上创建索引:主键列;数据有唯一性的列;经常需要搜索的列;经常用在连接的列;经常需要通过范围进行搜索的列;经常需要排序的列;经常使用在WHERE子句中的列;

我们不应该在这些列上创建索引:在查询中很少使用到的列;数据值很少的列(如:性别列,婚姻状况列),这种采用位图索引效率很高;

对修改性能的要求远高于检索性能的列,修改性能与检索性能是矛盾的;

0 0
原创粉丝点击