`

浅谈索引

    博客分类:
  • db
 
阅读更多
数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:

    首先明白为什么索引会增加速度,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树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。
分享到:
评论

相关推荐

    浅谈oracle中重建索引

    ### 浅谈Oracle中重建索引 #### 一、索引的基本概念与作用 在数据库管理系统(DBMS)中,索引是一种特殊的数据结构,它能够加速数据检索的速度。Oracle数据库同样提供了强大的索引功能来优化查询性能。索引通过在...

    索引失效-浅谈MySQL索引失效(组合索引).pptx

    自己整理有关MySQL的索引失效相关的信息,重点在组合索引的失效,有兴趣可以看看,看看是否对你有些许帮助

    浅谈Oracle中索引的使用.pdf

    浅谈Oracle中索引的使用.pdf

    浅谈MYSQL中的索引优化-收藏学习.pdf

    ### 浅谈MYSQL中的索引优化 #### 一、MySQL中的索引与B+树 在MySQL数据库系统中,索引被广泛应用于提高数据检索的效率。索引本质上是一种数据结构,它允许用户快速定位数据库中的记录。在MySQL中,B+树是最常见的...

    浅谈cache memory 王齐.pdf

    缓存利用索引(Index)找到数据所在的行,使用标签验证数据的正确性。缓存块的替换算法用来决定当缓存已满时,新信息应该如何置换已存储的信息。 在x86架构中,常见的缓存层次包括一级缓存(L1 Cache)、二级缓存...

    【转载】浅谈基于索引的SQL语句优化方法

    本文主要探讨的是基于索引的SQL语句优化方法,旨在帮助读者深入理解如何利用索引来提高查询效率。索引是数据库管理系统中的一个重要概念,它能显著加速数据检索过程,尤其是在处理大量数据时。 一、索引的基本原理 ...

    浅谈SQL Server索引结构及其使用.pdf

    在数据库管理系统中,索引是一种用于快速定位数据记录的工具,它在数据的逻辑结构基础上建立了一种物理结构,从而提高了数据查询的速度和效率。SQL Server是微软公司推出的关系型数据库管理系统,其提供了两种类型的...

    浅谈SQL Server中索引的使用.pdf

    SQL Server中索引的使用是数据库性能优化的一个重要方面,它直接影响到数据查询和处理的效率。索引就像书籍的目录,能帮助数据库快速定位到数据所在的位置,从而加快查询速度。在实际应用中,索引的使用要非常慎重,...

    浅谈SQL Server 2012列存储索引技术.pdf

    【SQL Server 2012列存储索引技术】 SQL Server 2012 引入了一种创新的索引技术——列存储索引,它显著提升了数据仓库的查询性能,尤其是在决策支持类查询中,可以实现大约10倍的性能提升。列存储索引的核心理念...

    浅谈Oracle数据库基于索引的SQL语句优化方法.pdf

    此外,索引虽然能够加速查询操作,但也会增加写操作的成本,例如INSERT、UPDATE、DELETE等操作,在创建索引之后会变得更慢,因为索引也需要随之更新。 在进行索引优化时,还要注意以下几点: - 对于数据更新频繁的...

    Oracle 9i 索引管理秘密,顶级专家谈索引管理技巧

    《Oracle 索引管理秘密,顶级专家谈索引管理技巧》这本书汇集了Oracle领域内多位顶级专家的经验与智慧,不仅深入浅出地讲解了索引管理的基础知识,还提供了大量实用的操作指南和最佳实践案例。无论是对于初学者还是...

    浅谈jQuery的应用.pdf

    标题:“浅谈jQuery的应用” 知识点: 1. jQuery简介:jQuery是一个继prototype之后的优秀JavaScript框架,由John Resig创建于2006年初。它简化了JavaScript以及Ajax编程,以“write less, do more”为宗旨,用更...

    浅谈SQL Server数据库应用技巧.pdf

    聚集索引类似于字典的拼音索引,它决定了表中数据的物理存储顺序,因此对于查询来说,如果涉及到表中的大部分或全部数据,则聚集索引非常有效。非聚集索引则类似于字典的部首索引,它不会影响表数据的物理存储顺序,...

    浅谈文字编码和Unicode

    UTF-32则是每个字符固定使用四个字节,尽管它在存储空间上较为浪费,但提供了最简单的字符索引和处理。 Unicode的出现并非一蹴而就,而是逐步取代了许多早期的编码标准。例如,Windows操作系统在NT 3.1版本之后就...

    浅谈数据库索引

    1.什么是索引  数据库索引好比是一本书前面的目录,能加快数据库的查询速度。  例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引...

    浅谈MySQL的B树索引与索引优化

    MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题:为什么MySQL等主流数据库选择B+树的索引结构?如何基于索引结构,理解常见的MySQL索引优化思路?索引结构的选择基于...

    浅谈innodb的索引页结构,插入缓冲,自适应哈希索引

    【MySQL InnoDB 索引页结构】 InnoDB存储引擎的索引是基于B树(B+Tree)实现的,无论是主键还是辅助键。索引页,也称为页节点,是InnoDB存储索引记录的基本单位,其默认大小为16KB。当新记录插入时,InnoDB会保留1/...

    浅谈mysql的索引设计原则以及常见索引的区别

    MySQL的索引设计是数据库优化的关键环节,它直接影响到数据查询的效率。下面将详细讨论索引设计原则以及常见索引的区别。 首先,选择唯一性索引是非常重要的原则。唯一性索引确保了索引项的唯一性,有助于快速定位...

    浅谈ORACLE数据库的性能优化.pdf

    DBA应监控慢查询,通过编写更高效的查询语句、创建合适索引、避免全表扫描、使用绑定变量等方式提高SQL执行效率。 【总结】 Oracle数据库的性能优化是一个综合性的任务,涉及内存管理、磁盘I/O、CPU使用和SQL优化...

    浅谈数据库索引的作用及原理

    数据库索引是数据库管理系统中用于加速查询的一种数据结构,它的主要目标是减少数据检索的时间,提高查询效率。本文将深入探讨数据库索引的作用、原理以及何时适合创建索引。 首先,索引的作用在于通过减少全表扫描...

Global site tag (gtag.js) - Google Analytics