轻松上手MYSQL:探索MySQL索引数据结构的奥秘-让数据库飞起来

​🌈 个人主页:danci_
🔥 系列专栏:《设计模式》《MYSQL》
💪🏻 制定明确可量化的目标,坚持默默的做事。


✨欢迎加入探索MYSQL索引数据结构之旅✨
    👋 大家好!文本学习研究InnoDb索引数据结构和算法,从而弄明白为什么添加索引之后查询速度会有质的提升。

    👋 无论您是刚接触MySQL的初学者,还是希望深入优化性能的资深开发者,这篇文章都将为您揭开MySQL索引的神秘面纱,让您掌握其中的奥秘,进而提升数据库操作的效率和精度。快来一起探索吧!

    🚀 前几天一位朋友跟我聊他面试的一问题:“为数据库表添加索引为何提高查询性能?”。

    💪 这个问题让我深思,所以把部分思考分享出来。欢迎大家评论讨论和互相学习。


1. 什么是索引?

2.InnoDB的数据结构是什么?为什么选这个数据结构?


目录

一、索引

1.1 什么是索引?

1.2 索引类型及应用场景

二、索引数据结构

2.1  数据结构

2.2 普通二叉树

2.3 平衡二叉树

2.4 b-tree

2.5 b+tree


一、索引

1.1 什么是索引?

我经常问面试者,什么是索引?如果是你该怎么回答?先给出自己的答案,再用三个10原则提问自己。


三个10原则:
        10分钟之后再思考一下自己刚刚的回答是否满意,
        10小时之后再思考一下自己刚刚的回答是否满意,
        10天之后再思考一下自己刚刚的回答是否满意,


停几分钟思考一下。

 

定义:索引是为提升查询速度的排好序的数据结构。
        是数据结构应该好理解,


        思考:为什么是排好序的?
 

1.2 索引类型及应用场景

索引类型描述应用场景
普通索引

定义:基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度

特点:允许重复值、允许为空

创建语句:create index `索引名称` on 表名(列名 排序规则) using 使用的数据结构;

唯一索引

定义:与普通索引类似,不同的是创建唯一性索引的目的1是为了提高访问速度,2是为了避免数据出现重复

特点:数据不重复

创建语句:create union index `索引名称` on 表名(列名 排序规则) using 使用的数据结构;

为提升查询速度的同时又要保证数据的唯一性时
主键索引

定义:主键索引是一种特殊的唯一索引

特点:不允许值重复,不允许值为空

创建语句:不能用create index来创建,是用primary key 来创建

mysql中任何一张都有主键索引,如果创建表时没有指定字段为主键,mysql会自动创建一个隐藏的主键索引。
空间索引

定义:空间索引是对空间数据类型的字段建立的索引,使用 SPATIAL 关键字进行扩展

特点:NOT NULL,地理空间数据类型

创建语句:索引类型换成spatial即可


空间索引用于地理空间数据类型 GEOMETRY。在平时的工作中很少用到(我是从来没用过)。
全文索引

定义:全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引

特点:允许重复值和空值,只能用于创建 char,varchar,text 类型的列

创建语句:CREATE FULLTEXT INDEX `索引名称` ON 表名(列名);

用于全文检索时。

但是如果业务中明确需要全文检索,或者需要根据关键词搜索出匹配的内容,那用 ES 就比较好。

 

二、索引数据结构

    创建索引语法:CREATE 索引类型 INDEX 索引名称 ON 表名(列名 索引排序规则)USING 数据数据结构(eg: create unique index `idx_test_col1` on test(col1 asc )using btree)

    用Navicat工具可以很直观看到 using 后面除了btree 还有hash(本次不讨论hash)



    直接给结论:树的高度决定IO的次数,IO次数越少,查询速度越快。

2.1  数据结构

    btree是一种树结构,树有如下数据结构:

  • 普通二叉树
  • 平衡二叉树
  • b-tree
  • b+tree

    树的特点:左子节点小于等于父节点,右子节点大于等于父节点。
    所以左子节点一定小于等于右子节点,所以可以说所有子节点,多左到右是排好序的。

2.2 普通二叉树

    假设用普通二叉树来做为索引的存储结构,假设表的主键是int的自增主键,那么随便数据的插入,根据树的特点,边子节点大于等于父节点,那么普能二叉树结构构建的索引树最终的形态会像一个键表,如下图:

     成了一个链表,根据链表的特点(链表可以看这个 ),如果有100万条数据,那么树的高度就有100万,很显示是不合适的。

2.3 平衡二叉树

       平衡二叉树特点看这个,高度计算:h = log2(N+1),h约等于20,说明最坏的情况要做20次IO才能找到想要的数据。一次查询要走20次IO,如果同一时间内有100次查询就是2000次IO,搞不好服务就挂了,所以也不合适。

2.4 b-tree

    结构如下图:

    从图中可以看出(B-tree详解可参考) 

  • 每个节点存放的索引信息是不重复的
  • 索引信息不重复,那么索引信息和数据信息就放在一起的,所以每个节点能放的索引信息就变没多少。
    mysql默认的一叶数据大小为16kb,假如表每行的数据为1kb,那个每个节点只能放16个索引信息,假设表有100万条数据,16 * 16 * 16 * 16 * 16 = 1048576,树高度也有5

    看似树的高度大大减少了,如上图,如果是范围查询,跨数据叶查询,若查小于等小5的数据,如果先找到0000,0001,0002,要找到0004必须要回到父节点再到0004节点,对于100万条数据的树结构,很有可能要回很多个父节点。实际的IO次数是5的倍数。所以也不合适。

        由此B+ tree出现

2.5 b+tree

    结构如下:

    从图中可以看出(B+Tree详解可参考) 

  • 叶子中包含所有非叶子节点的信息(则非叶子节点能存放更多的索引信息)
  • 叶子节点有一个箭头指向另一个叶子节点

    在mysql中使用B+Tree来作为索引的存储结构还做了修改
    叶子间的箭头是双向指向的,则对于跨数据叶的范围查询就不用返回到父点再找到另一个数据叶的数据了,相对物B- tree大大减少了IO次数。
    非叶子节点只存放索引信息,数据信息全部存放到叶子节点中。
     

     对于高度为3,B+tree能丰放多少呢(上篇计算过详见轻松上手MYSQL:优化MySQL慢查询,让数据库起飞)这里不再计算。



    结论:非叶子节点能存放的索引信息越多,树的高度就越低,IO次数就越少,获取数据的速度就越快

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

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

相关文章

代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理

在数字通信领域,数据安全和匿名性都是非常重要的指标。互联网的不断发展催生了几种协议,每种协议都有独特的优势和挑战。其中,SOCKS5 代理、HTTP代理最为广泛使用,下面给大家一起讨论,HTTP代理与 SOCKS5代理&#xff0…

基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面

代码下载: https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文进行…

Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)

上次介绍了:Linux:基础IO(一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用) 文章目录 1.缓冲区1.1概念1.2作用与意义 2.语言级别的缓冲区2.1刷新策略2.2具体在哪里2.3支持格式化 3.自己来模拟一下缓…

FFMpeg解复用流程

文章目录 解复用流程图复用器与解复用器小结 解复用流程图 流程图,如上图所示。 复用器与解复用器 复用器,就是视频流,音频流,字幕流,其他成分,按照一定规则组合成视频文件,视频文件可以是mp4…

实现贪吃蛇小游戏【简单版】

1. 贪吃蛇游戏设计与分析 1.1 地图 我们最终的贪吃蛇大纲要是这个样子,那我们的地图如何布置呢? 这里不得不讲⼀下控制台窗口的⼀些知识,如果想在控制台的窗口中指定位置输出信息,我们得知道该位置的坐标,所以首先介…

CPN Tools学习——从平面网构建分层 PN

1.先创建平面petri网 创建如下petri网: CPN ide创建petri网真的舒服很多,但是教程又是CPN Tools的,我的想法是看两个版本能不能互通,在前者创建,在后者运行学习。 新增定义: colset E unit with e; 但…

nginx全解

一、Nginx配置文件 1.1 主配置文件 主配置文件位置:nginx.conf tip:安装方式不同,路径不同 #主配置文件格式 ​ main block:主配置段,即全局配置段,对http,mail都有效 ​ #配置Nginx服务器的事件模块相…

深度学习 --- stanford cs231学习笔记三(卷积神经网络CNN)

卷积神经网络CNN 1,有效的利用了图像的空间信息/局部感受野 全连接神经网络中的神经是由铺平后的所有像素计算决定。 由于计算时是把图像的所有像素拉成了一条线,因此在拉伸的同时也损失了图像像素之间固有的空间信息。 卷积层中的神经只由5x5x3(假设fil…

LViT: 语言与视觉Transformer在医学图像分割中的应用| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 LViT: Language Meets Vision Transformer in Medical Image Segmentatio LViT: 语言与视觉Transformer在医学图像分割中的应用 01 文献速递介绍 医学图像分割是医学图像分析中最关键的任务之一。在临床实践中,准确的分割可以帮助医生诊断疾病&…

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 2)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第332p-第p335的内容 熔断降级 开启对Feign远程服务的熔断保护机制 feign.sentinel.enabletrue 这里我们只是调用方加就行 被调用方不用加 正常…

NetSuite Saved Search 之 Filter By Summary

在某些业务场景中,用户需要一个TOP X的报表。例如,过去一段时间内,最多数量的事务处理类型。这就需要利用Saved Search中的Filter By Summary功能。 这在Criteria下的Summary页签里可以定义。其作用是对Result中Summary类型的结果进行过滤。也…

Vue52-scoped样式

一、scoped样式的作用 1-1、scoped样式的作用 vue中组件的样式都是汇总到一起的。容易出现一个问题:类名冲突。 示例: school和student组件的类名都叫demo,则student的样式将覆盖school的样式,因为App.vue中,先引入的…

sklearn 基础教程

scikit-learn(简称sklearn)是一个开源的机器学习库,它提供了简单和有效的数据分析和数据挖掘工具。sklearn是Python语言中最重要的机器学习库之一,广泛用于统计学习和数据分析。 以下是scikit-learn的基础教程,帮助您开…

存储器的性能指标以及层次化存储器

存储器的性能指标 存储器有三个性能指标:速度、容量和位价(每位价格) 1.存储速度 (1)存取时间 想衡量存储速度,最直观的指标就是完成一次存储器读写操作所需要的时间,这叫做存取时间&#x…

Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求

测试表现层的代码如何测试 加载测试的专用属性 首先写一个测试 假定我们进行测试的时候要加一些属性 要去修改一些属性 我们可以写一个只在本测试有效的测试 写在配置里 测试 打印输出 我们把配置文件里面的配置注释掉后 我们同样可以启动 package com.example.demo;impo…

Qt状态机框架

概述 状态机框架提供了用于创建和执行状态图的类。这些概念和符号基于Harel的Statecharts:复杂系统的可视化形式(http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf),也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)(http://…

Web的UI自动化基础知识

目录 1 Web自动化入门基础1.1 自动化知识以及工具1.2 主流web自动化测试工具1.3 入门案例 2 使用工具的API2.1 元素定位2.1.1 id选择器2.1.2 name2.1.3 class_name选择器2.1.4 tag_name选择器2.1.5 link_text选择器2.1.6 partial_link_text选择器2.1.7 xpath选择器2.1.8 CSS选择…

mediamtx流媒体服务器测试

MediaMTX简介 在web页面中直接播放rtsp视频流,重点推荐:mediamtx,不仅仅是rtsp-CSDN博客 mediamtx github MediaMTX(以前的rtsp-simple-server)是一个现成的和零依赖的实时媒体服务器和媒体代理,允许发布,读取&…

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础,想要拥有一个基本美观的大屏,就得考虑页面整体模块的宽高自适应,我们自然就会想到具有强大灵活性flex布局,再借助百分比布局来辅助。至此,大屏页面布局问题即可得到解决。 写在前面&#x…

哪些数据管理知识领域需要做到数据全生命周期管理

一、数据生命周期 数据管理、数据治理、数据安全、元数据管理、数据治理等知识领域,都需要按照数据的生命周期开展管理工作。数据生命周期包括计划、设计/启用、创建/获取、存储/维护、使用、增强和处置。详见下图。 1.数据治理生命周期 1)规划:将数据要求与业务战略连接起…