mysql的索引结构

索引概述

索引( index )是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

优势
劣势
提高数据检索的效率,降低数据库的IO 成本
索引列也是要占用空间的。
通过索引列对数据进行排序,降低数据排序的成本,降低CPU 的消耗。
索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT UPDATE、 DELETE 时,效率降低。

索引结构

MySQL 的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种
索引结构
描述
B+Tree 索引
最常见的索引类型,大部分引擎都支持 B+ 树索引
Hash 索引
底层数据结构是用哈希表实现的 , 只有精确匹配索引列的查询才有效 , 不支持范围查询
R-tree( 空间索
引)
空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text( 全文
索引 )
是一种通过建立倒排索引 , 快速匹配文档的方式。类似于 Lucene,Solr,ES
不同的存储引擎对于索引结构的支持情况。
索引
InnoDB
MyISAM
Memory
B+tree 索引
支持
支持
支持
Hash 索引
不支持
不支持支持
R-tree 索引
不支持
支持
不支持
Full-text
5.6 版本之后支持
支持
不支持
我们平常所说的索引,如果没有特别指明,都是指 B+ 树结构组织的索引。

B+Tree

B+Tree是B-Tree的变种,我们以一颗最大度数(max-degree)为4(4阶)的b+tree为例,来看一

下其结构示意图:
  • 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
  • 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。
B+Tree B-Tree 相比,主要有以下三点区别:
  1. 所有的数据都会出现在叶子节点。
  2. 叶子节点形成一个单向链表。
  3. 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。
MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree ,提高区间访问的性能,利于排序。

B-Tree

B-Tree B 树是一种多叉路衡查找树,相对于二叉树, B 树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree )为 5(5 ) b-tree 为例,那这个 B 树每个节点最多存储 4 key 5
个指针

  1. 5阶的B树,每一个节点最多存储4key,对应5个指针。
  2. 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
  3. B树中,非叶子节点和叶子节点都会存放数据。

Hash

MySQL 中除了支持 B+Tree 索引,还支持一种索引类型 ---Hash 索引。 哈希索引就是采用一定的hash 算法,将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在hash表中。

  1. Hash索引只能用于对等比较(=in),不支持范围查询(between>< ...
  2. 无法利用索引完成排序操作
  3. 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree
MySQL 中,支持 hash 索引的是 Memory 存储引擎。 而 InnoDB 中具有自适应 hash 功能, hash 索引是InnoDB存储引擎根据 B+Tree 索引在指定条件下自动构建的。

问题

为什么InnoDB存储引擎选择使用B+tree索引结构?

  1. 相对于二叉树,层级更少,搜索效率高;
  2. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
  3. 相对Hash索引,B+tree支持范围匹配及排序操作;

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

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

相关文章

学会SpringMVC之自定义注解各种场景应用,提高开发效率及代码质量

目录 一、简介 ( 1 ) 是什么 ( 2 ) 分类 ( 3 ) 作用 二、自定义注解 ( 1 ) 如何自定义注解 ( 2 ) 场景演示 场景一&#xff08;获取类与方法上的注解值&#xff09; 场景二&#xff08; 获取类属性上的注解属性值 &#xff09; 场景三&#xff08; 获取参数修…

访问者模式

图片转载自 #include<iostream> using namespace std; #include<list> /*模板工厂单例化&#xff0c;所有的商品被注册进工厂中*/ /*访问者模式&#xff08;行为型模式&#xff09; 访问者&#xff0c;被访问者 visit accept 让访问变成一种操作&#xff0c;不同…

【论文解读】元学习:MAML

一、简介 元学习的目标是在各种学习任务上训练模型&#xff0c;这样它就可以只使用少量的训练样本来解决新任务。 论文所提出的算法训练获取较优模型的参数&#xff0c;使其易于微调&#xff0c;从而实现快速自适应。该算法与任何用梯度下降训练的模型兼容&#xff0c;适用于…

前端JavaScript深拷贝与浅拷贝

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. 深拷贝的实现 1.1 基本类型和特殊类型的处理 1.2 处理循环引用 1.3 性能优化 1.4 完整的深拷贝实现示…

[qt]vs2022+qt5.13.2代码报错QChartView不明确

报错类似下面&#xff1a; 鼠标指上去错误代码显示QChartView不明确,解决方法 在xxx.ui对应的头文件包含”ui_xxx.h“的前方添加如下代码&#xff1a; #include <qchart.h> QT_CHARTS_USE_NAMESPACE

赋能3D智慧校园!老子云数字孪生可视化,学校运维高效之选!

老子云专注于3D领域&#xff0c;自主研发3D可视化底层&#xff0c;已打造了行业智慧园区、智慧交通、智慧机房、智慧水利等标杆案例&#xff0c;构建了可视化数字孪生智慧体系&#xff0c;其中智慧校园不仅实现了技术上的三维落地&#xff0c;更是成为了管控超百万师生校园安全…

SwiftUI 中的几种毛玻璃效果

Preview Code // // testtt.swift // bill2 // // Created by 朱洪苇 on 2023/8/9. //import SwiftUIstruct testtt: View {var body: some View {ZStack {Image("bg1").blur(radius: 5) // 给背景图加模糊VStack {Text("ultraThinMaterial").padding()…

【Linux从入门到精通】线程 | 线程介绍线程控制

本篇文章主要对线程的概念和线程的控制进行了讲解。其中我们再次对进程概念理解。同时对比了进程和线程的区别。希望本篇文章会对你有所帮助。 文章目录 一、线程概念 1、1 什么是线程 1、2 再次理解进程概念 1、3 轻量级进程 二、进程控制 2、1 创建线程 pthread_create 2、2…

AI绘画Stable Diffusion原理之扩散模型DDPM

前言 传送门&#xff1a; stable diffusion&#xff1a;Git&#xff5c;论文 stable-diffusion-webui&#xff1a;Git Google Colab Notebook部署stable-diffusion-webui&#xff1a;Git kaggle Notebook部署stable-diffusion-webui&#xff1a;Git AI绘画&#xff0c;输入一段…

SpringMVC文件的上传下载JRebel的使用

目录 前言 一、JRebel的使用 1.IDea内安装插件 2.激活 3.离线使用 使用JRebel的优势 二、文件上传与下载 1 .导入pom依赖 2.配置文件上传解析器 3.数据表 4.配置文件 5.前端jsp页面 6.controller层 7.测试结果 前言 当涉及到Web应用程序的开发时&…

Android窗口层级(Window Type)分析

前言 Android的窗口Window分为三种类型&#xff1a; 应用Window&#xff0c;比如Activity、Dialog&#xff1b;子Window&#xff0c;比如PopupWindow&#xff1b;系统Window&#xff0c;比如Toast、系统状态栏、导航栏等等。 应用Window的Z-Ordered最低&#xff0c;就是在系…

uni-app 使用uCharts-进行图表展示(折线图带单位)

前言 在uni-app经常是需要进行数据展示&#xff0c;针对这个情况也是有人开发好了第三方包&#xff0c;来兼容不同平台展示 uCharts和pc端的Echarts使用差不多&#xff0c;甚至会感觉在uni-app使用uCharts更轻便&#xff0c;更舒服 但是这个第三方包有优点就会有缺点&#xf…

医院安全不良事件报告系统源码 PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发

不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…

数字人员工成企业得力助手,虚拟数字人为企业注入高科技基因

随着互联网和人工智能技术的快速发展&#xff0c;以“数字员工”为代表的数字生产力&#xff0c;正在出现在各行各业的业务场景中。数字人员工的出现不是替代人类&#xff0c;而是通过技术提高工作效率&#xff0c;实现更加智能化的服务体验&#xff0c;帮助企业实现大规模自动…

网上企业订货系统功能列表介绍|企业APP订单管理软件

网上企业订货系统功能列表介绍|企业APP订单管理软件 后台功能列表 &#xff08;后台支持手机版本 订货APP,管理订单的APP&#xff09; 后台登陆 输入账号密码登录企业订货管理软件系统 后台首页 显示近日,月,年订单统计&#xff0c;和收款欠款等统计。 订单模块 新建订单 …

人脸识别三部曲

人脸识别三部曲 首先看目录结构图像信息采集 采集图片.py模型训练 训练模型.py人脸识别 人脸识别.py效果 首先看目录结构 引用文121本 opencv │ 采集图片.py │ 训练模型.py │ 人脸识别.py │ └───trainer │ │ trainer.yml │ └───data │ └──…

使用 Sealos 一键部署高可用 MinIO,开启对象存储之旅

大家好&#xff01;今天这篇文章主要向大家介绍如何通过 Sealos 一键部署高可用 MinIO 集群。 MinIO 对象存储是什么&#xff1f; 对象是二进制数据&#xff0c;例如图像、音频文件、电子表格甚至二进制可执行代码。对象的大小可以从几 B 到几 TB 不等。像 MinIO 这样的对象存储…

零基础学前端(三)重点讲解 HTML

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 3. 初学者切忌&#xff0c;不要眼花缭乱&#xff0c;不要四处找其它文档&#xff0c;要坚定一个教授者的方式&#xff0c;将其学通透&#xff…

家政服务接单小程序开发源码 家政保洁上门服务小程序源码 开源完整版

分享一个家政服务接单小程序开发源码&#xff0c;家政保洁上门服务小程序源码&#xff0c;一整套完整源码开源&#xff0c;可二开&#xff0c;含完整的前端后端和详细的安装部署教程&#xff0c;让你轻松搭建家政类的小程序。家政服务接单小程序开发源码为家政服务行业带来了诸…

shell脚本学习笔记02(小滴课堂)

可以在home目录下创建一个shell.sh文件。 按w进入命令行模式。按i进入插入模式。如果想返回命令行模式&#xff0c;按esc即可。然后可以使用x和dd进行删除内容。 在插入模式下我们点击esc键&#xff0c;再去按:键&#xff0c;我们就可以进入到底行模式了&#xff1a; 可以设…