热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

极客–深入浅出索引

索引是怎样工作的?索引的出现是提高数据查询效率,就像教科书中的目录一样。索引的常见模型哈希表哈希表是一种以键值存储的结构,我们只需要输入待查找的键即为key,就可以找到对应的值Va

索引是怎样工作的?

索引的出现是提高数据查询效率,就像教科书中的目录一样。


索引的常见模型


  • 哈希表



    • 哈希表是一种以键值存储的结构,我们只需要输入待查找的键即为key,就可以找到对应的值Value.哈希的思路很简单,把值放大数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置



    • 多个key值经过哈希函数换算,会出现同一个值的情况。处理这种情况的方法是拉链法



    • 哈希索引做区间查询的速度很慢



    • 哈希表这种结构适用于等值查询场景,比如Memcached及其他一些,NoSQL引擎





  • 有序数组



    • 有序数组在等值查询和范围查询场景性能都非常优秀



    • 如果使用有序数组使用身份证号递增的顺序,按照二分法查询,如果从查询效率,有序数组是最好的,但是插入一个记录需要挪动后面所有的记录成本太高



    • 有序数组适用于静态存储引擎





  • 搜索树



    • 二叉搜索树:父节点的左子树所有节点的值小于父节点的值,右子树所有节点的值大于父节点的值,为了维持O(log(N))的时间复杂度,就需要保证这棵树更新时间复杂度为O(log(N))

    • 二叉树的搜索效率是最高的,但是实际大多数的数据库存储却不使用二叉树,其原因。索引不止存在内存中,还要写在磁盘上。

    • 如果一棵树100万个节点的平衡二叉树,树高20.一次查询可能需要访问20个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要10ms左右的寻址空间,也就是说,对于100万行表,如果使用二叉树来存储,单独访问一个行可能需要20个10ms,这个查询速度太慢了

    • 为了减少查询尽量少的读取磁盘,就必须查询过程访问尽量少的数据块,那么,我们就不该用二叉树,而是用N叉树




以 InnoDB 的一个整数字段索引为例,这个 N 差不多是 1200。这棵树高是 4 的时候,就可以存 1200 的 3 次方个值,这已经 17 亿了。考虑到树根的数据块总是在内存中的,一个 10 亿行的表上一个整数字段的索引,查找一个值最多只需要访问 3 次磁盘



N叉树由于读写上的性能特点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中


Innodb索引模型



  • Innodb中表根据主键顺序以索引方式存放的,这种存储方式的表为索引组织表,Innodb使用B+树索引模型,所以数据都是存储在B+树中



  • 每一个索引在Innodb里面对应一棵B+树



  • 主键索引叶子节点存放的是整行数据,二级索引叶子节点存储的是二级索引




基于主键索引和普通索引的查询区别是什么?



  • 根据主键索引查询方式,只需要搜索ID这棵树B+树

  • 则需要先搜索K索引树,得到ID值500,再到ID索引树搜索一次,这个过程称为回表


索引维护

B+树为了维护索引有序性,在插入新值的时候需要必要的维护

image



  • 如果插入ID为700直接在R5后面插入即可,如果插入400需要逻辑上面挪动后面的数据,如果R5所在数据页已经满了,根据B+树算法,这时候需要申请一个数据页,然后挪动部分数据过去,这个过程叫做页分裂,这种情况下性能会下降



  • 除了性能外,页分裂操作还会影响数据页利用率,原本放在一个页的数据分为两页,整体空间利用率降低50%



  • 当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。



  • 自增主键每次插入一条新纪录都是追加操作,都不涉及到挪动其他记录,也不会触发叶分裂



  • 只有一个索引,该索引必须是唯一索引的时候可以考虑业务字段作为主键




Innodb使用了B+树结构,B+树能够很好地配合磁盘读写特性,减少单次查询磁盘访问次数。由于Innodb是索引组织表,一般情况下我会建议你创建一个自增主键,这样非主键索引占用空间最小



  • 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段


最左前缀原则

B+树这种索引结构,可以利用索引的最左前缀,来定位记录,联合索引考虑空间与复用


索引下推

检索出表中“名字第一个字是张,而且年龄是 10 岁的所有男孩”。那么,SQL 语句是这么写的:

mysql> select * from tuser where name like '张%' and age=10 and ismale=1;

Mysql5.6引入索引下推优化,可以索引遍历过程中,对索引包含的字段先做判断,直接过滤掉不满足的记录,减少汇报次数。InnoDB在(name,age)索引下推的过程中判断age的存在,减少一次次数



推荐阅读
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本文为初学者提供了一条清晰的学习路线,帮助他们逐步成长为优秀的Web开发人员。通过十个关键步骤,涵盖从基础到高级的各个方面,确保每位学习者都能找到适合自己的学习方向。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 本文将深入探讨MySQL与MongoDB在游戏账户服务中的应用特点及优劣。通过对比这两种数据库的性能、扩展性和数据一致性,结合实际案例,帮助开发者更好地选择适合游戏账户服务的数据库方案。同时,文章还将介绍如何利用Erlang语言进行高效的游戏服务器开发,提升系统的稳定性和并发处理能力。 ... [详细]
  • 前两天有位朋友邀请我回答个问题,为什么MongoDB(索引)使用B-树而Mysql使用B+树?我觉得这个问题非常好,从实际应用的角度来学习数据结构,没有比这更好的方法了。因为 ... [详细]
  • MySQL 数据库索引技术原理初探
    概述什么是索引一本书500页的书,如果没有目录,直接去找某个知识点,可能需要找一会儿,但是借助前面的目录,就可以快速找到对应知识点在书的哪一页。这里的目录就是索引。所以,为什么会有 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 如何在不同数据库中提取前N%的记录
    本文详细介绍了如何在SQL Server、Oracle和MySQL等不同数据库中提取前N%的记录。通过具体的示例和代码,帮助读者理解和掌握这些方法。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间【使用内存空间临时保存】关系型数据库:利用二者的关系来描述实体的信息。【利用二维表字段名 ... [详细]
author-avatar
林伯勋玉萍竣梅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有