热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Mysql学习——InnoDB索引(B+树)

一、没有索引如何查询通过对InnoDB页的学习,我们可以知道在页中怎么根据主键快速的查找

一、没有索引如何查询


通过对InnoDB页的学习,我们可以知道在页中怎么根据主键快速的查找一条数据,因此,我们现在归纳一下,没有索引的时候,查询一条数据的情况:


  1. 在一个页中查找数据:

    1. 根据主键查找数据:这就是之前说的,可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。

    2. 根据其他普通列查找数据:对于非主键只能从最小的记录一直遍历下去,查找数据。

  2. 在很多页中查找数据:定位到所要找的页,然后再去一个页中查找数据。


二、索引是如何提高查询效率的


索引的本质其实是一个B+树,如图所示:

观察这个图,我们可以发现:


  1. 在页中,每一个主键都是递增的,是一个顺序的单项链表

  2. 下一个页与上一个页互相指向,是一个双向链表

  3. 目录项中会存储所指向页的页号该页中最小的主键


当我们要查找主键为,10的数据的时候,首先会通过2分法,找到1,5,12,209中中间的数,我们发现是5,然后5比10小,10比12大,于是就会找到页号为28的页,在页中找到主键为10的这条数据。


而这就是聚簇索引(主键是默认有索引的),与之相对应的还有二级索引,就是根据其他搜索条件而不是主键去查找数据使用的。二级索引会根据所查找的列,对数据进行排序,这里的数据仅仅只有主键和所创建索引的列,然后还是根据二分法,查找到所需要的主键,再根据主键去查聚簇索引,这称之为回表。


二、索引的代价


索引虽然好,能够提高查询效率,但是代价也很高:


  1. 空间上,每建立一个索引,都会生成一个B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,一棵很大的B+树由许多数据页组成。

  2. 时间上,每次对表中的数据进行增、删、改操作时,都需要去修改各个B+树索引。

    

因此,如果不合理创建索引,创建了太多的索引,很容易造成空间和时间上的浪费。



推荐阅读
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • APM(Application Performance Management,应用性能管理)对于提供互联网服务的企业至关重要。本文将深入探讨APM如何帮助识别和解决导致用户流失的技术问题,以及它在提升整体用户体验方面的作用。 ... [详细]
  • 理解CLASSPATH环境变量及其在Java类定位中的作用
    本文详细探讨了CLASSPATH环境变量的功能,特别是在早期版本的JDK中如何通过设置该变量来指定Java类的位置,以及现代JRE如何简化这一过程。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • LambdaMART算法详解
    本文详细介绍了LambdaMART算法的背景、原理及其在信息检索中的应用。首先回顾了LambdaMART的发展历程,包括其前身RankNet和LambdaRank,然后深入探讨了LambdaMART如何结合梯度提升决策树(GBDT)和LambdaRank来优化排序问题。 ... [详细]
  • 在程序运行过程中,各种编程语言都会动态创建对象,并为其分配内存。当这些对象不再使用时,释放其所占内存变得至关重要,以确保资源的有效利用。本文深入探讨了垃圾回收(GC)的工作原理,包括如何识别、何时及如何回收不再使用的对象。 ... [详细]
  • 如何检查电脑显卡的显存类型
    本文旨在指导用户如何轻松识别自己的电脑或新购显卡的显存类型,无论是GDDR3还是更为先进的GDDR5。通过简单的步骤,即使是计算机新手也能快速掌握方法。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文将指导您如何在Docker环境中高效地搜索、下载Redis镜像,并通过指定或不指定配置文件的方式启动Redis容器。同时,还将介绍如何使用redis-cli工具连接到您的Redis实例。 ... [详细]
  • 本文探讨了在C语言编程中,如何有效避免多文件项目中的重定义问题,通过合理使用预处理器指令和extern关键字,确保代码的健壮性和可维护性。 ... [详细]
  • 在互联网信息爆炸的时代,当用户需求模糊或难以通过精确查询表达时,推荐系统成为解决信息过载的有效手段。美团作为国内领先的O2O平台,通过深入分析用户行为,运用先进的机器学习技术优化推荐算法,提升用户体验。 ... [详细]
  • 在安装Ubuntu 12.10并尝试安装VMware Tools时,遇到了一个常见的错误提示:指定的路径不是有效的3.5.0-17-generic内核头文件路径。本文将提供解决这一问题的具体步骤。 ... [详细]
  • 本文探讨了如何利用Java PDFBox库填写PDF表单,并将其正确地附加到PDDocument中,同时确保表单字段的唯一性。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
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社区 版权所有