MySQL--优化(索引)

MySQL–优化(SQL语句执行慢,如何分析)

  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+树便于扫库和区间查询,叶子节点是一个双向链表

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出Redis(四):Redis基于RDB、AOF的持久化

引言 Redis是一款基于内存的键值对数据结构存储系统,Redis基于内存且常用来缓存关系型数据库中的数据,但不代表着Redis不能进行持久化,本篇文章将深入浅出的说明Redis基于RDB和AOF的持久化方式 Redis支持两种持久化方式,RDB&…

Redis 缓存机制如何提高应用程序的性能?

在数字时代,一拍脑门儿我们就能感觉到信息的海量和处理速度的迫切。不管是刷个微博、下个单,还是玩个游戏,我们都希望能快上加快,一点不拖泥带水。这时候,缓存技术就扮演了个大英雄的角色,它能让数据存取的…

【排序】详解插入排序

一、思想 插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。具体步骤如下,将数组下标为0的元素视为已经排序的部分,从1开始遍历数组,在遍历的过程中当前元素从…

完美解决VMware中配置suse10虚拟机网络

一、注意!!!配置suse10网络,需要在虚拟机关机状态下进行,否则会配置不成功; 二、配置与主机在同一网段(仅主机模式,网卡一); 在suse系统关机状态下,Vmware中设置”虚拟网…

【每日一题】1976. 到达目的地的方案数-2024.3.5

题目: 1976. 到达目的地的方案数 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整数数组 roads ,其中 roads[i] = […

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用,gofly框架内置校验工具,提供开发效率,开发接口简单调用即可实现验证,下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

Java并发编程-进程和线程

一、进程和线程 1. 进程 什么是进程? 简单来说,进程就是程序的一次启动和执行。进程是操作系统中的一个概念,它代表正在运行的程序的实例。每个进程都有自己的内存空间、代码和数据,以及其他操作系统资源,如文件和设备…

数据结构与算法-希尔排序

引言 在计算机科学中,数据结构和算法是构建高效软件系统的基石。而排序算法作为算法领域的重要组成部分,一直在各种应用场景中发挥着关键作用。今天我们将聚焦于一种基于插入排序的改进版本——希尔排序(Shell Sort),深…

优思学院|质量和企业的盈利能力有何关系?

质量和企业的盈利能力有何关系?三十年前,这个问题就已经被提出。当时的学者们研究了高质量产品如何带来更高的盈利。虽然这听起来像是老生常谈,但它的真理至今仍深深影响着我们的商业决策。 为了更直观地理解,一些学者绘制了以下…

力扣大厂热门面试算法题 - 滑动窗口

最长和谐子序列、重复的DNA序列、找到字符串中所有字母异位词、滑动窗口最大值、最小区间。每题做详细思路梳理,配套Python&Java双语代码, 2024.03.06 可通过leetcode所有测试用例。 目录 594. 最长和谐子序列 解题思路 完整代码 Java Python …

亚信安慧AntDB:数据库自主创新的缩影

AntDB作为一款自主研发的数据库系统,具备了国产化升级改造的核心能力。这款数据库系统通过不懈努力和持续探索,实现了从跟随他人到引领潮流的华丽转身。AntDB不仅仅是一种技术产品,更是体现了自主研发能力的缩影,体现了科技企业在…

基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,…

Spring Test 常见错误

前面我们介绍了许多 Spring 常用知识点上的常见应用错误。当然或许这些所谓的常用,你仍然没有使用,例如对于 Spring Data 的使用,,有的项目确实用不到。那么这一讲,我们聊聊 Spring Test,相信你肯定绕不开对…

网络编程,IO多路复用

1.使用IO多路复用完成TCP并发服务器 #include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.124.10" //服务器IP地址int main(int argc, const char *argv[]) {//1、创建用于连接的套接字int sfd socket…

Elasticsearch从入门到精通-02环境搭建

Elasticsearch从入门到精通-02环境搭建 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f342;博主从本篇正式开始ES学习&#xff0c;希望小伙伴可以一起探讨 &#x1f4d6; 本篇主要介绍和大家一块学习一下ES环境搭建,主要包括Elasticsearch、…

材料物理 (HIT) 笔记-2

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 三…

mysql如何开启远程访问?

MySQL是一种常见的关系型数据库管理系统&#xff0c;广泛应用于各行各业。默认情况下&#xff0c;MySQL仅允许本地访问&#xff0c;即只能在本地主机上进行数据库操作。有时候我们需要通过远程连接访问MySQL数据库&#xff0c;以便实现更灵活的管理和操作。本文将介绍如何在MyS…

Docker快速入门和部署项目

1&#xff0c;Docker是一个&#xff0c;快速构建、运行、管理应用的工具 。 2&#xff0c;前面我们了解过在Linux操作系统的常见的命令以及如何在Linux中部署一个人单体的项目。感受如何呢&#xff1f;&#xff1f;&#xff1f; 命令太多了&#xff0c;记不住 软件安装包名字复…

java数据结构YZP专栏-----二叉树 平衡二叉树(AVL)

主文章&#xff08;数据结构的索引目录—进不去就说明我还没写完&#xff09;https://blog.csdn.net/grd_java/article/details/122377505 模拟数据结构的网站&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 源码(码云)&#xff1a;https://gi…

Python onnxruntime推理yolov5和yolov8(最简易版)

支持yolov5和yolov8双模型 其中ChtDeploy中代码如下&#xff1a; import onnxruntime import numpy as np import cv2class ChtDeploy():def __init__(self, img_path, onnx_path, iou_threshold0.45, conf_threshold0.3, detect_w640, detect_h 640):self.img cv2.imread(im…