(新手友好)MySQL学习笔记(9):索引(常见索引类型,查找结构的发展(二分查找法,二叉搜索树,平衡二叉树,B树,B+树))

目录

索引

常见索引类型

B+树

二分查找法

二叉搜索树和平衡二叉树

B树和B+树


 

索引

index,是存储引擎用于快速找到数据的一种数据结构。

MySQL默认使用InnoDB存储引擎,该存储引擎是最重要,使用最广泛的,除非有非常特别的原因需要使用其他存储引擎,否则优先考虑InnoDB。

索引优点:

  • 减少服务器需要扫描的数据量
  • 帮助服务器避免排序和临时表
  • 索引可以将随机I/O变为顺序I/O,提高查询性能

缺点:

  • 从空间角度考虑,建立索引需要占用物理空间
  • 从时间角度考虑,创建和维护索引都需要花费时间,例如对数据进行增删改时就需要维护索引。

因此在不需要频繁的增删改但需要频繁查的表中创建索引是更好的选择。

我们建立索引就类似于建议一个图中黄色的一个索引表,通过author字段快速定位,然后找到需要的数据,这只是一个例子方便我们理解,不是真正的索引运行。

常见索引类型

  • 哈希索引:基于哈希表实现,查找非常快。但不支持范围查找和排序操作,也不支持部分索引列的查找,只支持等值比较的查询。如果哈希冲突很多的话,索引的维护代价会很高。因此,哈希索引只适用于某些特定场合。在InnoDB中,支持的哈希索引是自适应的,不能人为创建。

哈希索引不支持范围查找的原因:哈希索引只包含哈希值和行指针,通过找哈希值通过行指针来找到要查找的数据,存储时输入的数据通过哈希函数映射出一个哈希值,但是哈希值是无序的,就像1,2映射出的哈希值就可能是5678和1234,因此哈希索引每查询一个就要全盘扫描来寻找下一个要查询的哈希值,因此哈希索引不支持范围查询。

哈希索引不支持排序操作的原因:与不支持范围查找的原因相同,因为每行数据的哈希值不含有任何顺序特性,即使原始字段值是按照某种顺序排列的,经过哈希函数处理后,这些值在哈希索引的存储顺序也是完全被打乱的。所以在对某一列进行排序时哈希索引不能提供任何帮助,因为它的结构中没有保留字段值的顺序信息。

  • 全文索引:用于全文搜索的索引类型(倒排索引),可以执行关键字搜索。全文索引有很多限制,例如当数据量很大,内存无法装载全部索引时,搜索速度会非常慢。同时全文索引的维护成本也很大。MyISAM支持全文索引,InnoDB从1.2版本(MySQL5.6)开始支持全文索引。
  • B+树索引:B+树索引就是传统意义上的索引,时目前关系型数据库中查找最为常见和最为有效的索引。B+树索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据。B+树索引是顺序组织存储的,所以很适合查找范围数据,查到范围中的首个数据后就可以一直查找到范围中最后一个数据,不需要全表扫描。B+树索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)。

B+树

主要阐述一下常见的搜寻方法和B+树怎么发展出来的

二分查找法

从5,10,19,21,31,37,42,48,50,55中查找48,使用二分查找法只需3次。如果顺序查找需要8次。

二叉搜索树和平衡二叉树

二叉搜索树,左子节点小于父节点的值,右子节点大于父节点的值。如果我们需要查找8,需要3次,而顺序查找需要6次。

同样是二叉搜索树,下图的情况查找效率会很低,从而引出平衡二叉树(AVL树),平衡二叉树要求任何节点的子树高度最大差为1。平衡性确保查找的数独可以很快,避免了下图二叉搜索树的极端情况,即树退化成链表

B树和B+树

平衡二叉树随着节点的增加,树的高度会越来越高,会增加磁盘的I/O次数,影响查询效率,从而引出了B树,B树不限制一个节点只能由2个子节点,从而降低树的高度。

B树可以将节点的大小优化为磁盘块的大小,每次读取可以有效加载多个节点,B树常用于数据库等需要高效访问磁盘的场景。

B+树是对B树的升级,B+树只有叶子节点存数据,非叶子节点只存索引。叶子节点包含所有索引,叶子节点构成一个有序链表,范围查找更快。由于非叶子节点只存索引,B+树比B树的非叶子节点可以存更多索引,高度更低,磁盘I/O次数更少。

B+树范围搜索更快的原因:

由两张图我们可以看出B+树的叶子节点构成了一个有序链表,而B树则没有组成一个有序链表,如果要查1—10条数据,B+树找到第1条数据之后就可以沿着链表一直找到第10条,但B树找到第1条数据后可以找到第2条但是第3条记录就需要重新扫描去找,因此B+树的范围索引更快。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87615.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程间通信1(匿名管道)Linux

1 进程间通信的必要性 首先要明确进程间是相互独立的(独享一份虚拟地址空间,页表,资源),那怎么样才能使得两个进程间实现资源的发送?所以,两个进程一定需要看到同一份资源,并且⼀个…

CAN2.0、DoIP、CAN-FD汽车协议详解与应用

一、CAN2.0 协议详解与应用示例 1. 技术原理与特性 协议架构:基于 ISO 11898 标准,采用载波监听多路访问 / 冲突检测(CSMA/CD)机制,支持 11 位(CAN2.0A)或 29 位(CAN2.0B&#xff…

使用nvm管理npm和pnpm

1.使用nvm管理npm // 查看nvm版本 nvm -v // 查看可安装的 node 版本 nvm ls-remote // 安装指定 node 版本 nvm install 24.0.0 // 查看当前已安装的 node 版本及当前使用的版本 nvm list // 使用某个版本 node nvm use 24.0.0 // 卸载指定 node 版本 nvm uninstall 16.20.1…

YOLO11+QT6+Opencv+C++训练加载模型全过程讲解

实现效果: Yolov11环境搭建(搭建好的可以直接跳过) 最好使用Anconda进行包管理,安装可参考【文章】。下面简单过一下如何快速部署环境。如果搭建过或可以参考其他文章可以跳过Yolo11环境搭建这一章节。总体来说Yolov11环境搭建越…

Python 脚本,用于将 PDF 文件高质量地转换为 PNG 图像

import os import fitz # PyMuPDF from PIL import Image import argparse import logging from tqdm import tqdm# 配置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(PDF2PNG)def convert_pdf_…

【CUDA GPU 支持安装全攻略】PyTorch 深度学习开发者指南

PyTorch 的 CUDA GPU 支持 安装五条铁律(最新版 2025 修订)(适用于所有用户)-CSDN博客 是否需要预先安装 CUDA Toolkit?——按使用场景分级推荐及进阶说明-CSDN博客 “100% 成功的 PyTorch CUDA GPU 支持” 安装攻略…

Cyberith 运动模拟器Virtualizer2:提升虚拟现实沉浸体验

奥地利Cyberith公司是一家专注于虚拟现实(VR)互动解决方案的创新型科技企业,以其研发的Virtualizer虚拟现实步态模拟设备而闻名。该公司的核心技术体现在其设计和制造的全方位跑步机式VR交互平台上,使得用户能够在虚拟环境中实现自…

常见的数据处理方法有哪些?ETL中的数据处理怎么完成

在数字化转型纵深推进的背景下,数据作为新型生产要素已成为驱动企业战略决策、科研创新及智能化运营的核心战略资产。数据治理价值链中的处理环节作为关键价值节点,其本质是通过系统化处理流程将原始观测数据转化为结构化知识产物,以支撑预测…

WHAT - 为甲方做一个官网(二)- 快速版

文章目录 一、明确需求优先级(快速决策)二、推荐零代码/低代码工具(附对比)方案1:低代码建站平台(适合无技术用户,拖拽式操作)方案2:CMS系统(适合内容更新频繁…

音视频之H.264视频编码传输及其在移动通信中的应用

系列文章: 1、音视频之视频压缩技术及数字视频综述 2、音视频之视频压缩编码的基本原理 3、音视频之H.264/AVC编码器原理 4、音视频之H.264的句法和语义 5、音视频之H.264/AVC解码器的原理和实现 6、音视频之H.264视频编码传输及其在移动通信中的应用 7、音视…

C#语言入门-task2 :C# 语言的基本语法结构

下面从四个方面对C#的基本语法进行简单介绍: 1. 数据类型 C#的类型可分为值类型和引用类型。值类型变量直接存储数据,引用类型变量则存储对象的引用。 值类型:涵盖整数类型(像int、long)、浮点类型(例如…

c#笔记之类的常量、字段和属性

学习内容: 一、字段 字段是为了对象或者类型存储数据的,可以表达一个对象或者类型的状态;也叫做成员变量;注意字段是在类里面声明的;在方法里声明的是局部变量; 1.1实例字段 用来表示每个实例的状态;比如一个students类;要了解一个学生一般看名字和成绩;所以名字和…

Linux 常用命令(入门)

Linux 常用命令 一、Linux 命令基础 (一)命令格式 Linux 命令的一般格式为:command [-options] [parameter1] … 。其中,command 是命令名,通常是相应功能的英文单词或其缩写;[-options] 是选项,用于对命令进行控制,可省略;parameter1 … 是传给命令的参数,可以是…

CppCon 2016 学习:Parallelism in Modern C++

这段介绍的是 HPX (High Performance ParalleX),一个现代C的通用并行运行时系统,重点包括: 通用性:适用于各种规模的应用,从小型到超大规模分布式系统。统一标准API:符合C标准,方便编写异步、并…

机器学习监督学习实战七:文本卷积神经网络TextCNN对中文短文本分类(15类)

本文介绍了一个基于TextCNN模型的文本分类项目,使用今日头条新闻数据集进行训练和评估。项目包括数据获取、预处理、模型训练、评估测试等环节。数据预处理涉及清洗文本、中文分词、去除停用词、构建词汇表和向量化等步骤。TextCNN模型通过卷积层和池化层提取文本特…

iot-dc3 项目Bug修复保姆喂奶级教程

一.Uncaught (in promise) ReferenceError: TinyArea is not defined 1.触发场景 前端设备模块,点击关联模板、关联位号、设备数据,无反应,一直切不过去,没有报错通知,F12查看控制台报错如下: 2.引起原因 前端导入的库为"@antv/g2": "^5.3.0",在 P…

Spring Boot + MyBatis Plus + SpringAI + Vue 毕设项目开发全解析(源码)

前言 前些天发现了一个巨牛的人工智能免费学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 Spring Boot MyBatis Plus SpringAI Vue 毕设项目开发全解析 目录 一、项目概述与技术选型 项目背景与需求分析技术栈选择…

Vitess数据库部署与运维深度指南:构建可伸缩、高可用与安全的云原生数据库

摘要 Vitess是一个为MySQL和MariaDB设计的云原生、水平可伸缩的分布式数据库系统,它通过分片(sharding)实现无限扩展,同时保持对应用程序的透明性,使其无需感知底层数据分布。该项目于2019年从云原生计算基金会&#…

SpringAI+DeepSeek大模型应用开发——6基于MongDB持久化对话

持久化对话 默认情况下,聊天记忆存储在内存中ChatMemory chatMemory new InMemoryChatMemory()。 如果需要持久化存储,可以实现一个自定义的聊天记忆存储类,以便将聊天消息存储在你选择的任何持久化存储介质中。 MongoDB 文档型数据库&…

Mac电脑-音视频剪辑编辑-Final Cut Pro X(fcpx)

Final Cut Pro Mac是一款专业的视频剪辑工具,专为苹果用户设计。 它具备强大的视频剪辑、音轨、图形特效和调色功能,支持整片输出,提升创作效率。 经过Apple芯片优化,利用Metal引擎动力,可处理更复杂的项目&#xff…