数据库索引是为了增加查询速度而对表字段附加的一种标识。很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。其实远不是那样的,这里将其介绍尽量详细些。
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。
那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句:
SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees >= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = 'Executive')
这条语句涉及3个表的联接,并且包括了许多搜索条件比如大小比较,Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后,扫描的行数只需要134行。在Mysql中可以通过Explain Select来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下,索引带来的性能提升远比它所占据的磁盘空间要重要得多。
那么索引是如何实现的呢?大多数DB厂商实现索引都是基于一种数据结构——B树。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表。B树的定义是这样的:一棵m(m>=3)阶的B树是满足下列条件的m叉树:
1、每个结点包括如下作用域(j, p0, k1, p1, k2, p2, ... ki, pi) 其中j是关键字个数,p是孩子指针
2、所有叶子结点在同一层上,层数等于树高h
3、每个非根结点包含的关键字个数满足[m/2-1]<=j<=m-1
4、若树非空,则根至少有1个关键字,若根非叶子,则至少有2棵子树,至多有m棵子树
看一个B树的例子,针对26个英文字母的B树可以这样构造:
可以看到在这棵B树搜索英文字母复杂度只为o(m),在数据量比较大的情况下,这样的结构可以大大增加查询速度。然而有另外一种数据结构查询的虚度比B树更快——散列表。Hash表的定义是这样的:设所有可能出现的关键字集合为u,实际发生存储的关键字记为k,而|k|比|u|小很多。散列方法是通过散列函数h将u映射到表T[0,m-1]的下标上,这样u中的关键字为变量,以h为函数运算结果即为相应结点的存储地址。从而达到可以在o(1)的时间内完成查找。
然而散列表有一个缺陷,那就是散列冲突,即两个关键字通过散列函数计算出了相同的结果。设m和n分别表示散列表的长度和填满的结点数,n/m为散列表的填装因子,因子越大,表示散列冲突的机会越大。
因为有这样的缺陷,所以数据库不会使用散列表来做为索引的默认实现,Mysql宣称会根据执行查询格式尝试将基于磁盘的B树索引转变为和合适的散列索引以追求进一步提高搜索速度。
转自:http://evaheart.blog.163.com/blog/static/17948088720114185837136/
分享到:
相关推荐
数据库中索引原理 数据库中索引原理 数据库中索引原理 数据库中索引原理
数据库索引设计与优化是数据库管理系统中至关重要的一个环节,它直接影响到数据查询...通过学习《数据库索引设计与优化》这样的专业书籍,我们可以深入理解这些原理,并将其应用于实际工作,提升数据库系统的整体效能。
"数据库索引那些事(数据库索引原理)" 数据库索引是数据库的一种对象,它保存数据库表中一列或多列组合的排序。索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用...
通过两个图形说明了在oracle数据库中b-tree索引和位图索引的工作原理
### 数据库中的索引原理详解 #### 一、索引的概念与分类 索引是数据库管理系统(DBMS)为了提高查询速度而采用的一种数据结构。它就像书籍的目录一样,帮助用户快速定位到所需的数据记录。 ##### 1.1 索引的分类 ...
下面将详细阐述数据库索引的作用、原理以及如何选择和使用索引。 首先,索引能够加快数据检索速度。当我们对一个大型数据库进行查询时,如果没有索引,数据库系统需要进行全表扫描,即逐行检查直到找到符合条件的...
在深入探讨SQL数据库索引原理之前,我们先来理解一下索引的基本概念。索引,类似于书籍中的目录,是数据库中一种特殊的数据结构,用于快速定位数据。它并不存储实际的数据,而是存储了数据行的位置信息,使得数据库...
, 《数据库索引设计与优化》适用于已经具备了SQL 这一关系型语言相关知识,希望通过理解SQL 性能相关的内容,或者希望通过了解如何有效地设计表和索引而从中获益的人员。另外,《数据库索引设计与优化》也同样适用于...
《数据库索引设计与优化》适用于已经具备了SQL 这一关系型语言相关知识,希望通过理解SQL 性能相关的内容,或者希望通过了解如何有效地设计表和索引而从中获益的人员。另外,《数据库索引设计与优化》也同样适用于...
### 数据库索引详解 #### 一、为什么数据库需要索引? 在理解数据库索引之前,我们先来看看索引存在的必要性。想象一下图书馆里有上百万本书籍,如果我们需要找到一本书,比如《架构师之路》,没有索引的情况下,...
本文将深入探讨数据库索引的作用、原理以及何时适合创建索引。 首先,索引的作用在于通过减少全表扫描的次数,显著加快查询速度。在没有索引的情况下,数据库在执行SQL查询时,通常需要遍历整个表来寻找符合搜索...
《Oracle与MySQL数据库索引设计与优化》这本书深入探讨了两个主流关系型数据库管理系统——Oracle和MySQL中的索引设计和优化策略。索引是数据库性能的关键因素,它们能够加速数据检索,提高系统效率,尤其在大数据量...
本书提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地估算SQL运行的CPU时间及...
总的来说,理解和优化数据库索引对于提升SQL Server和Oracle数据库的查询性能至关重要。通过合理地创建、管理和维护索引,可以显著减少查询时间,改善用户体验,并降低服务器资源的消耗。同时,了解并遵循数据库设计...
本书提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地估算SQL运行的CPU时间及...
本书提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地估算SQL运行的CPU时间及...
### 数据库索引详解 #### 一、索引的基本概念 索引是在数据库表中为了加快数据查询速度而创建的一种特殊的数据结构。当我们在数据库中进行数据查询时,如果没有索引,系统通常需要扫描整个表来查找所需的信息,这...