【从删库到跑路】MySQL数据库的索引(一)——索引的结构(BTree B+Tree Hash),语法等

news2025/1/11 12:54:50

🎊专栏【MySQL】
🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
🎆音乐分享【如愿】
🥰欢迎并且感谢大家指出小吉的问题

文章目录

  • 🍔概述
  • 🍔索引结构
  • ⭐B-Tree多路平衡查找树
    • 🏳️‍🌈构建过程
  • ⭐B+Tree
    • 🏳️‍🌈构建过程
  • ⭐Hash
    • 🏳️‍🌈构建过程
    • 🎈Hash索引特点
  • 🍔索引分类
    • 🏳️‍🌈执行过程
  • 🍔语法
    • 🎈查看索引
    • 🎈创建索引
      • 🎈创建联合索引
    • 🎈删除索引
  • 🍔SQL性能分析
    • ⭐查询命令的执行频率
    • ⭐慢查询日志
      • 🎈查询MySQL慢查询日志查询是否打开
      • 🎈开启MySQL慢查询日志查询开关
      • 🎈设置慢日志的时间为2秒
    • ⭐profile详情
      • 🎈查看当前MySQL是否支持profile操作
      • 🎈开启profiling
      • 🎈查看会话执行的所有的SQL语句的耗时时间
      • 🎈查看指定Query_ID的SQL语句在`各个阶段`的耗时时间
      • 🎈查看指定Query_ID的SQL语句在`各个阶段`的`CPU的`耗时时间
    • ⭐explain执行计划
      • 🎈explain执行计划各个字段的作用

在这里插入图片描述

🍔概述

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

优点缺点
提高数据检索的效率,降低数据库的IO成本索引也要占空间
通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗索引大大提高了查询效率,同时却降低更新表的速度(比如降低进行insert,update,delete操作的效率)

🍔索引结构

MySQL的索引是在存储引擎层实现的,具体分为以下几种结构
在这里插入图片描述
我们平时说的索引,如果没有特殊指明,说的都是B+树组织结构的索引
在这里插入图片描述

⭐B-Tree多路平衡查找树

下面是一颗最大度数为5的B-Tree例子
在这里插入图片描述

🏳️‍🌈构建过程

请看视频讲解
第6.30分钟开始

⭐B+Tree

数据都存放在叶子节点中
叶子节点形成一个单向链表

在这里插入图片描述

🏳️‍🌈构建过程

请看视频讲解
第1.50分钟开始

⭐Hash

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位中,然后存储到hash表中
如果两个(或多个)键值,映射到同一个槽位中,就产生了hash冲突,可以通过链表来解决

🏳️‍🌈构建过程

请看视频讲解
第20秒开始

🎈Hash索引特点

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,……)
  • 无法利用索引完成排序操作
  • 查询效率高,通常仅需要一次检索就可以了,效率往往比B+Tree高

在MySQL中,支持hash索引的是Memory引擎,而InnoDB中具有自适应hash功能
hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的

🍔索引分类

在这里插入图片描述
仅主键索引只能有一个,其他索引可以有多个
🍔在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种

分类含义特点
聚集索引数据和索引放到了一起,索引结构的叶子节点保存了行数据必须有,而且只能有一个
二级索引数据和索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个

在这里插入图片描述

🏳️‍🌈执行过程

请看视频讲解
第5.00分钟开始

🍔语法

🎈查看索引

show index from 表名;

在这里插入图片描述

🎈创建索引

create [unique|fulltext] index 索引名 on 表名 (字段名);

在这里插入图片描述

🎈创建联合索引

create [unique|fulltext] index 索引名 on 表名 (字段名1,字段名2,字段名3...);

在联合索引中,字段的顺序是有讲究的
一般是使用最频繁的字段放到左侧

🎈删除索引

drop index 索引名 on 表名;

🍔SQL性能分析

⭐查询命令的执行频率

show global status like 'Com___';

当前数据库有多少个表,Com后面就有多少个 _

⭐慢查询日志

慢查询日志(Slow Query Log)是一种数据库日志,用于记录执行时间超过预设阈值的慢查询语句。慢查询通常指执行时间较长的SQL查询语句,可能会对数据库性能产生影响。

慢查询日志的主要作用是帮助识别和优化执行时间较长的查询语句。通过启用慢查询日志并设置阈值,数据库系统可以自动将执行时间超过阈值的查询语句记录到慢查询日志中。

通过分析慢查询日志,可以发现潜在的性能问题和优化机会。例如,可以识别出执行时间较长的查询语句,进而对其进行优化,如优化查询语句的结构、添加索引或重新设计数据库模式等。

🎈查询MySQL慢查询日志查询是否打开

show variables like 'slow_query_log';

🎈开启MySQL慢查询日志查询开关

slow_query_log=1;

🎈设置慢日志的时间为2秒

SQL语句执行时间超过2秒,就被认为是慢查询,记录到慢查询日志中

long_query_time=2;

⭐profile详情

有些SQL命令比较简单,但是执行时间接近慢日志设置的时间,这样子的SQL也是性能比较低的
(比如设置慢日志时间为2秒,但是有些简单的SQL命令到了1.9 1.8秒)
此时就要使用profile详情

🎈查看当前MySQL是否支持profile操作

select @@have_profiling;

在这里插入图片描述
如果显示的是NO,我们可以开启profiling

🎈开启profiling

set profiling=1;

🎈查看会话执行的所有的SQL语句的耗时时间

show profiles;

在这里插入图片描述

🎈查看指定Query_ID的SQL语句在各个阶段的耗时时间

在哪里看Query_ID
在这里插入图片描述

show profile for query Query_ID;

注意查询的是各个阶段的耗时
在这里插入图片描述

🎈查看指定Query_ID的SQL语句在各个阶段CPU的耗时时间

show profile cpu for query Query_ID;

⭐explain执行计划

使用explain或desc命令获取MySQL执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序

使用时可以在任意select语句前面加上explain或者desc

explain select 字段列表 from 表名 where 条件;

在这里插入图片描述

🎈explain执行计划各个字段的作用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰

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

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

相关文章

【分布式事务】CAP定理和Base理论

文章目录 1、事务的ACID原则2、分布式服务案例3、CAP定理4、Base理论5、分布式事务模型 1、事务的ACID原则 所有的事务都要满足ACID原则&#xff0c;在单体架构中&#xff0c;只有一个服务&#xff0c;这个服务访问一个数据库&#xff0c;场景简单。基于数据库本身的特性&…

React 组件使用

React 组件是一个 js 函数&#xff0c;函数可以添加 jsx 标记 当前页使用组件&#xff0c;基本使用 注意&#xff1a;组件的名称&#xff0c;第一个字母一定要大写&#xff0c;否则会报错 import { createRoot } from "react-dom/client"; import "./index.c…

深度学习(30)—— DeformableDETR(1)

深度学习&#xff08;30&#xff09;—— DeformableDETR&#xff08;1&#xff09; 原本想在一篇文章中就把理论和debug的过程都呈现&#xff0c;但是发现内容很多&#xff0c;所以就分开两篇&#xff0c;照常先记录理论学习过程&#xff0c;然后是实践过程。 注&#xff1a;…

Flutter学习—— Vscode创建项目

目录 一、Vscode创建项目 二、补充五种项目类型 Application: Module 模块开发&#xff0c; Package开发 Plugin 插件开发 Skeleton 骨架开发 一、Vscode创建项目 1.快捷键 CtrlShiftP 打开命令面板&#xff0c;选择新项目 2.选择需要开发的项目类型 Application 应用开…

勾股dev部署

1.克隆项目 项目的地址&#xff1a; https://gitee.com/gouguopen/dev?_fromgitee_search#-%E5%BC%80%E6%BA%90%E5%8A%A9%E5%8A%9B 可以采用git clone https://gitee.com/gouguopen/dev.git 或者使用下载压缩包的形式 2.进入项目的根目录 cd gougudev 3.下载php依赖 需要…

三种策略改进的沙猫群优化算法(MSCSO),与白鲸、蜣螂、麻雀等多种算法进行比较,MATLAB代码...

沙猫群优化算法(sand cat swarm optimiza⁃ tion,SCSO)是 2022年提出的元启发式优化算法&#xff0c;该算法灵感来源于沙猫的捕食行为&#xff0c;沙猫群会通过搜索阶段和捕食阶段获得食物。其中算法额外使用自适应的rG和R以达到搜索阶段和捕食阶段的无缝 切换。该算法具有寻优…

刷题日记09《图论基础》

图的存储结构 对于图结构而言&#xff0c;常见的存储结构主要有两种&#xff1a;邻接表和邻接矩阵&#xff1a; 邻接表很直观&#xff0c;我把每个节点 x 的邻居都存到一个列表里&#xff0c;然后把 x 和这个列表关联起来&#xff0c;这样就可以通过一个节点 x 找到它的所有相邻…

java 8树结构返回前端

接口&#xff1a; EntityResult getOrgReal(Map<String, Object> mapParam); 实现类&#xff1a; PMethodHandle(runMethodName "TQmsZjxmzbImpl.getOrgReal", timeout 600) Override public EntityResult getOrgReal(Map<String, Object> mapParam…

vs2015 工程组织与动态加载

10.Visual Studio动态加载_哔哩哔哩_bilibili 1.工程组织 ① researcher.cpp #include "nn/nn.h"#include "nn/factory.h" #include "nn/factory_impl/factory_impl.h"#include <iostream>int main() {int ret 0;factory_i* fct new f…

Invalid bound statement (not found),springboot扫描不到jar包中mapper文件的问题处理

参考这位大佬的博客&#xff1a;Invalid bound statement (not found)&#xff0c;springboot扫描不到jar包中mapper文件的问题处理_springboot扫描不到mapper_Jamesharden13的博客-CSDN博客 classpath:和classpath*:的区别_classpath和classpath*区别_明快de玄米61的博客-CSD…

JavaWeb课程设计项目实战(06)——项目编码实践3

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在本教程教程中&#xff0c;我们实现学生列表的显示。 Student 请在bean包下创建Student类&#xff0c;代码如下&#xff1a; package com.cn.bean; /*** 本文作者&#…

MIMIC数据库申请流程

MIMIC是一个公开的临床数据库&#xff0c;之前查找了很多资料&#xff0c;在这里记录一下整个申请流程。 一、CITI证书 要申请mimic数据库的使用权限&#xff0c;首先需要有CITI证书&#xff0c;这是一个国际知名的网络训练课程&#xff0c;其中就有用于健康资讯隐私及保护 (…

Spring 用了哪些设计模式

关于设计模式&#xff0c;如果使用得当&#xff0c;将会使我们的代码更加简洁&#xff0c;并且更具扩展性。本文主要讲解Spring中如何使用策略模式&#xff0c;工厂方法模式以及Builder模式。 策略模式 关于策略模式的使用方式&#xff0c;在Spring中其实比较简单&#xff0c…

408-2009

一、选择题&#xff08;2 分/题&#xff09; 1.为解决计算机主机与打印机之间速度不匹配问题&#xff0c;通常设置一个打印数据缓冲区&#xff0c;主机将要输出的数据一次写入该缓冲取&#xff0c;而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是______。 A.栈 …

iOS--编译连接的过程_2

文章目录 iOS编译&#xff08;一&#xff09;编译器前端 编译器后端执行一次XCode build的流程 IPA包的内容二进制文件的内容iOS Link Map File文件说明1. Link Map File 是什么2. Link Map File 有什么用3. 生成 Link Map File查看Link Map File1&#xff09;路径部分计算机系…

Linux进程间通信(fifo有名管道)

文章目录 前言一、有名管道概念讲解二、命令行创建fifo三、非命令行创建fifo四、fifo和管道对比总结 前言 上篇文章我们讲解了无名管道&#xff0c;这篇文章我们就来讲解一下有名管道。 一、有名管道概念讲解 有名管道(fifo) 有名管道&#xff08;FIFO&#xff09;是一种命…

jmeter请求重试实现思路

文章目录 一、背景二、尝试的解决方案三、最终解决方案&#xff1a;jmeter retrier插件&#xff01; 一、背景 最近系统需要压测一些活动&#xff0c;场景是新建抽奖活动之后&#xff0c;每隔2s查询1次&#xff08;最多3次&#xff0c;3次后还是失败就算失败&#xff09;&…

linux学成之路(基础篇)(二十)rsync服务器

目录 前言 一、概述 监听端口 二、特点 快捷 安全 三、数据的同步方式 四、rsync传输方式 本地传输 远程传输 守护进程 五、命令 作为远程命令 作为rsync服务 选项 六、配置文件 全局配置 模块配置 守护进程传输 七、rsyncinotfy实时同步 一、服务端 二、…

Qgis二次开发-QgsMapLayer(加载矢量、栅格图层)

1.简介 QgsMapLayer是所有地图层类型的基类&#xff0c;这是所有地图层类型(矢量&#xff0c;栅格)的基类&#xff0c;首先定义一个QgsMapCanvas地图画布&#xff0c;然后画布上添加图层&#xff0c;使用以下方法设置图层集合。 //设置当前图层集合 void setLayers (const QL…

算法提高-动态规划-单调队列优化DP

单调队列优化DP AcWing 135. 最大子序和AcWing 1087. 修剪草坪AcWing 1089. 烽火传递AcWing 1090. 绿色通道 关于单调队列的初始化 AcWing 135. 最大子序和 注意hh 0,tt -1 tt 0初始化的时候队列有什么不同&#xff0c;主要还是要理解队列的实际意义 #include <iostre…