MySQL--优化(索引)

MySQL–优化(索引篇)

  1. 定位慢查询
  2. SQL执行计划
  3. 索引
    • 存储引擎
    • 索引底层数据结构
    • 聚簇和非聚簇索引
    • 索引创建原则
    • 索引失效场景
  4. SQL优化经验

索引

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

一、 例子(理解索引的用处)

无索引
  • 当前我们有一张表,里面有很多条数据
  • 现在我们要去查年龄为 45 的数据
  • 在没有索引的情况,age会逐条的进行比对,当找到了 45 也不会停,他会接着往下找,直到整张表多遍历一遍
    在这里插入图片描述
有索引

比如维护了一个索引(二叉搜索数)MySQL 中的索引不是(二叉搜索数),说到二叉树是方便理解

  • 首先找当前二叉树的根节点 36 (拿45跟36作比对,45比36大),走右边找到 37(拿45跟47作比对,45比48小)走左边找到 45
  • 这个效率就有明显的提升,这个就是索引的好处(提升查找效率)

在这里插入图片描述

总结
  1. 我们需要维护一个像(二叉搜索数)
  2. 有个这样一个数据结构,在查找数据的时候可以提升查找效率,减少 IO 的操作

二、索引的底层数据结构

  • 在探讨MySQL索引之前,我们需要先了解几种常见的数据结构:二叉搜索树、红黑树、B树和B+树。每种数据结构都有其独特的工作原理和优缺点。

三、数据结构对比

1、二叉搜索树
  • 虽然二叉搜索树在理想情况下具有较高的查询效率,但一旦数据不平衡,其性能将大幅下降。
    在这里插入图片描述
2、红黑数
  • 红黑树通过自平衡机制解决了这一问题,但由于其每个节点最多只有两个子节点,因此在处理大量数据时,树的高度会显著增加,导致查询效率降低。
  • 那假如 MySQL 某张表的数据是 1千万 ,而红黑树也是一个二叉树,一个节点只能有两个分支,如果把1千万的数据存储到红黑树中,那么这个红黑树就会变得特别的高,要去查找的数据依然要去找很多个层级
    在这里插入图片描述
3、B 树
  • B树是一种多叉树结构,与二叉树相比,它能够减少树的高度,从而提高查询效率。然而,B树在非叶子节点中既存储键也存储数据,这在处理大量数据时可能导致磁盘IO操作增多。
  • B树每个节点可以有多个分支,即多叉。
  • 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key
    在这里插入图片描述
  • 每个key多有指针,图中key20指针所对应的20以内的数据
    在这里插入图片描述
  • 其中每个key对应的数据

在这里插入图片描述

4、B + 树
  • B+树是B树的一种优化版本。
  • 它在非叶子节点中仅存储键和子节点的指针,而将数据全部存储在叶子节点中。
  • 这种设计使得B+树的查询效率更加稳定,且更适合于磁盘等辅助存储器的数据读写操作。
  • 此外,B+树的叶子节点之间通过指针相连,便于进行范围查询和扫库操作。
    在这里插入图片描述

总结

  • 什么是索引
    • 索引(index)是帮助MySQL高效获取数据的数据结构(有序)
    • 提高数据检索的效率,降低数据库的I0成本(不需要全表扫描)
    • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
  • 索引的底层数据结构
    • MySQL的InnoDB引擎采用的B+树的数据结构来存储索
    • B+树 阶数更多,路径更短
    • 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
    • B+树便于扫库和区间查询,叶子节点是一个双向链表

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

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

相关文章

SQL语句

库、表、记录的概念 库(Database):库是一个容器,用于存储表和其他对象(如视图、存储过程等) 表(Table):表是一个由列和行组成的矩阵,其中每列都定义了表中的…

掘根宝典之c语言预处理器(#define,#include,#,##,#undef,#if,#ifdef,#elif,#endif,defined函数)

目录 #define #define(宏定义命令) define与typedef作用域的的区别: #define定义宏 注意 #define 替换规则 注意 宏和函数对比 宏的缺点: 宏和函数的对比 #运算符 注意点 ##运算符 注意点 #include(文…

Svg Flow Editor 原生svg流程图编辑器(二)

系列文章 Svg Flow Editor 原生svg流程图编辑器(一) 说明 这项目也是我第一次写TS代码哈,现在还被绕在类型中头昏脑胀,更新可能会慢点,大家见谅~ 目前实现的功能:1. 元件的创建、移动、形变;2…

面向对象——UML图

一、结构图 静态的 (一)类图 1、图 (二)对象图 1、如何区分对象和类? :对象 对象名:类 类 (三)包图*(带*号的是软考从来没考过的) (四&am…

pytorch 批量归一化BatchNorm的BatchNorm1d和BatchNorm2d理解

BatchNorm即批量归一化,是深度学习中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,是神经网络训练必不可少的一部分。 BatchNorm作用:在进行批量训练过程中,每个batch具有不同的分布,使数据分布…

光明网发布稿件多少钱?新闻投稿低价渠道推荐,附光明网价格明细表

想要在光明网发稿?不知道费用是多少?媒介多多告诉你答案! 在当今数字化时代,媒体平台的重要性日益突出,而光明网作为国内知名的新闻门户网站,吸引了大量的目标受众。许多企业和个人都希望能够在光明网上投…

开源的Java报表库JasperReports介绍

JasperReports 是一个流行的开源 Java 报表库,它允许开发人员创建丰富的、基于 Java 的报表,这些报表可以与多种数据源交互,并且可以很容易地集成到 Java 应用程序中。JasperReports 提供了丰富的功能,包括数据可视化、图表、子报…

<C++>深度剖析菱形继承

​​ 文章目录 什么是菱形继承探究底层 什么是菱形继承 继承关系形如下图的继承即为菱形继承,或者叫钻石继承。 菱形继承的问题:公有继承前提下,如果类A中含有成员变量a,那么类B与类C中都有继承自类A的a,类D中又继承…

膜厚测量仪在半导体应用中及其重要

随着科技的不断发展,半导体行业已成为当今世界的核心产业之一。在这个领域中,半导体膜厚测量仪作为关键设备,其精度和可靠性对于产品质量和生产效率具有至关重要的作用。本文将详细介绍半导体膜厚测量仪的工作原理、应用领域以及其在半导体制…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject? 在游戏开发中,有大量的配置数据需要存储,这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt,excel等等 但是你们有没有想过,假设你使用的是json&#x…

基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

【蓝桥杯-单片机】基础模块LED和按键

文章目录 【蓝桥杯-单片机】Led、按键等基础模块01 前置准备(1)新建工程(4)编写程序 02 基础模块:LED(0)LED原理图(1)对P1整体赋值,控制所有的LED灯&#xff…