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

news2024/10/6 6:44:44

​🌈 个人主页: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.coloradmin.cn/o/1829082.html

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

相关文章

Hadoop的读写流程

Hadoop分布式文件系统(HDFS)是Apache Hadoop项目的核心组件,它为大数据存储提供了一个可靠、可扩展的存储解决方案。本文将详细介绍HDFS的读写数据流程,包括数据的存储原理、读写过程以及优化策略。 一、HDFS简介 HDFS是一个高度容错的分布式文件系统,它设计用于运行在通…

python包管理器--- pip、conda、mamba的比较

1 pip 1.1 简介 pip是一个 Python 的包(Package)管理工具,用于从 PyPI 安装和管理 Python 标准库之外的其他包(第三方包)。从 Python 3.4 起,pip 已经成为 Python 安装程序的一部分,也是官方标准…

【chatbot-api开源项目】开发文档

chatbot-api 1. 需求分析1-1. 需求分析1-2. 系统流程图 2. 技术选型3. 项目开发3-1. 项目初始化3-2. 爬取接口获取问题接口回答问题接口创建对应对象 3-3. 调用AI3-4. 定时自动化回答 4. Docker部署5. 扩展5-1. 如果cookie失效了怎么处理5-2. 如何更好的对接多个回答系统 Gitee…

各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?

2023简直被人工智能相关话题席卷的一年。关于机器学习算法的热度,也再次飙升,网络上一些分享已经比较老了。那么今天借着查询和学习的机会,我也来浅浅分享下目前各种机器学习算法及其应用场景。 为了方便非专业的朋友阅读,我会从算…

揭秘神秘的种子:Adobe联合宾夕法尼亚大学发布文本到图像扩散模型大规模种子分析

文章链接:https://arxiv.org/pdf/2405.14828 最近对文本到图像(T2I)扩散模型的进展促进了创造性和逼真的图像合成。通过变化随机种子,可以为固定的文本提示生成各种图像。在技术上,种子控制着初始噪声,并…

FineReport简单介绍(2)

一、报表类型 模板设计是 FineReport 学习过程中的主要难题所在,FineReport 模板设计主要包括普通报表、聚合报表、决策报表三种设计类型。 报表类型简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 二、聚合报表 2-1 介绍 聚合报表指一个报表中包含多个…

电商秒杀系统

一,细节 二,需要注意的细节 1.库存超卖问题 使用mysql数据库的 悲观锁 机制。在事务中使用 for update 语句,此时数据库会加锁,其他想要当前读的线程都会被阻塞,在事务处理完成之后释放这一条数据。该方法的缺点在于…

排序——希尔排序

希尔排序实际上是插入排序的优化,所以要先介绍插入排序。 目录 插入排序 思想 演示 代码实现 总结 希尔排序 思想 演示 代码 总结 插入排序 思想 又称直接插入排序。它的基本思想是将一个值插入到一个有序序列中。直至将所有的值都插入完。 演示 假设数…

工程设计问题---行星轮系设计问题

该问题的主要目标是使汽车传动比的最大误差最小。为了使最大误差最小,对自动行星传动系统的齿轮齿数进行了计算。该问题包含6个整数变量和11个不同几何约束和装配约束的约束。 参考文献: Abhishek Kumar, Guohua Wu, Mostafa Z. Ali, Rammohan Malliped…

国际统计年鉴(1995-2023年)

数据年份:1995-2023 数据格式:pdf、excel 数据内容:《国际统计年鉴》是一部综合性的国际经济社会统计资料年刊,收录了世界200多个国家和地区的统计数据,并对其中40多个主要国家和地区的经济社会发展指标及国际组织发布…

ARIMA模型与ARIMA-GARCH模型预测时间序列

上世纪 70 年代初,Ljung 等人提出 ARIMA 模型,又称求和自回归移动平均模型。其思想 是针对于非平稳时间序列进行数学建模,将其通过差分运算后 进行相关数据刻画 ,变为一个平稳的新序列,进而进行相关数据的刻画。 自 1…

Element-UI - 解决el-table中图片悬浮被遮挡问题

在开发中,发现element-ui在el-table中添加图片悬浮显示时,会被单元格遮挡的问题。通过查询得到的解决办法,大多是修改.el-table类中相关样式属性,但经过验证发现会影响到其他正常功能的使用。对于此问题解决其实也并不难&#xff…

计算机网络知识点全面总结回顾

物理层 OSI模型:数据链路层(流量控制),从传输层开始端到端;每一层的元素都称为实体,同一层的是对等实体;三个重要概念:服务(下层为上层提供调用)&#xff0c…

非连续分配管理方式(重点)

目录 一. 基本分页存储管理1.1 什么是分页存储1.2 页表 二. 基本地址变换机构三. 具有快表的地址变换机构3.1 什么是快表3.2 引入快表后, 地址的变换过程3.3 局部性原理 四. 两级页表4.1 单级页表存在什么问题?如何解决?4.2 两级页表的原理、逻辑地址结构4.3 如何实现地址变换…

机器学习笔记 - 用于3D点云数据分割的Point Net的训练

一、数据集简述 ​在本教程中,我们将学习如何在斯坦福 3D 室内场景数据集 ( S3DIS )上训练 Point Net 进行语义分割。S3DIS 是一个 3D 数据集,包含来自多栋建筑的室内空间点云,占地面积超过 6000 平方米。Point Net使用整个点云,能够执行分类和分割任务。如果你一直在关注 …

【机器学习】机器学习与教育科技在个性化教学中的融合应用与性能优化新探索

文章目录 引言机器学习与教育科技的基本概念机器学习概述监督学习无监督学习强化学习 教育科技概述学生学习行为分析个性化学习路径推荐智能化教育评估 机器学习与教育科技的融合应用实时学习数据分析数据预处理特征工程 学生成绩预测与优化模型训练模型评估 个性化学习路径推荐…

初始-Nativefier

--无奈只能靠自己 Nativefier 是什么: Nativefier 是一个命令行工具,仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序,应用程序通过 Electron 打包成系统可执行文件(如.app, .exe 等),可以运行在…

AI探索:最佳落地应用场景

如果说今年的风口,那一定是 AI。不过AI像一把双刃剑,既有助益也有风险。我们将从IBM Watson的高飞与坠落,到Google Allo的黯然失色,探索AI应用中的教训。同时,瑞幸咖啡的成功故事展现了凭借策略得当的AI应用&#xff0…

MySQL第三方图形化工具:DBeaver

操纵数据库的语言,基于功能划分为4类: 数据定义:DDL(Data Definition Language)库的创建删除、表的创建删除等 数据操纵:DML(Data ManipulationLanguage)新增数据、删除数据、修改数据等 数据控制:DCL(Data ControlLanguage)新增用户、删除用户、密码…

javaWeb项目-springboot+vue人事管理系统功能介绍

本项目源码:java-springbootvue人事管理系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot…