数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:
首先明白为什么索引会增加速度,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://blog.csdn.net/ant_yan/archive/2008/09/15/2932068.aspx
分享到:
相关推荐
数据库设计是软件开发过程中的关键环节,尤其是在大数据和云计算时代,高效、稳定、灵活的数据库设计对于系统的性能、可扩展性和数据安全性具有决定性影响。本文将深入探讨数据库设计的一些重要技巧,帮助程序员提升...
数据库索引是数据库管理系统中用于加速查询的一种数据结构,它的主要目标是减少数据检索的时间,提高查询效率。本文将深入探讨数据库索引的作用、原理以及何时适合创建索引。 首先,索引的作用在于通过减少全表扫描...
数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在...
为了提升数据库的性能,数据库优化是一个重要的手段,其中应用层面的优化主要依赖于索引优化。 索引对于数据库来说,就如同书籍的索引对于读者一样,能够帮助用户更快地找到所需的数据。合理构造表索引能够有效提高...
### 浅谈Oracle中重建索引 #### 一、索引的基本概念与作用 在数据库管理系统(DBMS)中,索引是一种特殊的数据结构,它能够加速数据检索的速度。Oracle数据库同样提供了强大的索引功能来优化查询性能。索引通过在...
总结而言,高性能的SQL Server数据库应用需要经过精心设计,这包括合理的数据库结构设计、高效的索引策略制定以及对数据库系统的持续监控和调优。一个应用系统是否能够达到最优的性能,取决于其能否充分利用数据库...
对索引使用原则和建立技巧的深入理解可以帮助优化数据库性能。 总结而言,数据库设计是一个系统性的过程,包括前期准备、逻辑设计、表设计、字段设计和索引创建等多个阶段。每个环节都对整体性能产生深远影响。通过...
逻辑设计则关注索引、数据库模式和视图等,确保数据流量分配高效。设计阶段应由专业性能优化专家参与,以制定适合系统需求的方案。 其次,优化应用程序也至关重要。这不仅包括服务器的调整,也涉及网络、操作系统、...
此外,索引的合理使用也是数据库设计中的重要技巧,可以显著提升查询速度。正确选择主键和外键,以及利用聚集和非聚集索引,有助于优化数据库性能。在处理大量数据时,分区和分片策略也可以提高查询效率。 总之,...
同时,GIS的发展也将促进数据库技术的创新,比如空间索引技术的优化、分布式数据库的运用、以及适应移动设备和Web服务的轻量级数据库解决方案。GIS与数据库系统的结合将推动各行各业的信息化进程,促进智慧城市的...
在“架构革新高效可控_浅谈数据库服务和架构演讲V7.zip”这个压缩包中,包含了一份关于数据库服务和架构的演讲稿,标题为“架构革新高效可控”。这份文档可能详细探讨了如何通过架构的创新来提升数据库服务的效率和...
(1)加密字段不能实现索引功能。 (2)表间的连接码字段不能加密。 (3)无法实现对数据制约因素的定义。 (4)密文数据无法实现SQL的排序、分组和分类功能。 (5)SQL语言中的内部函数将对加密数据失去作用。 ...
- 条件的排列顺序需要根据数据分布和字段索引情况优化,以减少不必要的全表扫描。 8. **实践和学习的重要性:**在优化SQL语句的过程中,实践与学习是提升开发水平的必要途径。通过不断的尝试、测试和学习,能够更...
【Oracle数据库性能优化概述】 Oracle数据库作为一款广泛应用于管理信息系统、企业数据处理、互联网和电子商务领域的关系型数据库管理系统,其性能优化对于确保系统的稳定性和高效运行至关重要。随着数据量的快速...
索引是数据库管理系统中的一个重要概念,它能显著加速数据检索过程,尤其是在处理大量数据时。 一、索引的基本原理 索引类似于书籍的目录,通过建立索引,数据库系统可以快速定位到数据存储的位置。非聚簇索引存储...
"浅谈Oracle数据库的碎片整理" 在 Oracle 数据库中,碎片整理是一个非常重要的维护内容。随着时间的推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,对数据库性能产生严重的影响。 碎片的产生是由于...
Oracle数据库是当前市场上占有率极高的...随着技术的不断发展,对Oracle数据库性能的要求越来越高,如何在保证数据库正常高效运行的同时,实现SQL语句和索引的优化,是每个数据库管理员和开发者必须掌握的核心技能。
【Oracle数据库优化设计】主要涉及到数据库的架构优化、内存管理、表设计和索引优化等方面,以下是详细的阐述: 1. **数据库优化设计**:Oracle数据库的优化设计主要包括对数据的逻辑结构进行合理的规划,例如采用...
索引可以看作是数据库中数据的目录,通过索引可以迅速定位到数据所在位置,从而减少数据库在执行查询时的扫描范围,节省资源。在设置索引时,需要结合实际的查询条件来优化,合理的索引可以显著提升系统的性能。 ...