MySQL知识笔记——中级进阶之索引(实施工程师和DBA工作笔记)

在上一章中我们已经讲完了学习和实施工作中需要掌握的MySQL基础知识,但是在实际应用中这些基础只能让我们简单了解流程,以后的工作不只是简单的安装部署系统,我们还要将客户的数据导入数据库中才能完善系统的完整性和可使用性,接下来将详细讲解MySQL的索引、锁、事务等等进阶又重要的知识。

MySQL知识笔记——中级进阶《一》

  • 一、MySQL的索引
    • 1.1、聚集索引
    • 1.2、辅助索引
      • 1.2.1、建表时创建索引
      • 1.2.2、使用create index创建索引
      • 1.2.3、使用alter table语句创建索引
    • 1.3、唯一索引
    • 1.4、联合索引
  • 二、MySQL索引的优化
    • 2.1、ICP
    • 2.2、MRR

一、MySQL的索引

常见的索引算法有顺序查找、二分查找(折半查找)、二叉树查找、平衡二叉树、B树、B+树等。
B树是一种自平衡的搜索树,它允许在对数时间内进行插入、删除和查找操作。B树具有以下特点:

  • B树是一个多路搜索树,每个节点可以包含多个子节点。
  • 所有叶子节点位于相同的层级上,且为空节点(NIL)。
  • 节点中的键值按照升序排列,并且每个键值都与一个指向子树的引用相关联。
  • 每个节点有一个上限和下限,通常称为阶(order),表示节点可以容纳的最小和最大键值数量。
    在这里插入图片描述

理解B树的关键是要明白它的自平衡特性。插入和删除操作可能导致树的不平衡,但B树会通过一系列的旋转和重组操作来保持平衡。这确保了在树中进行查找操作时,每个节点的子树高度保持相对平衡,从而提供了快速的搜索性能。
B+树也是一种自平衡的搜索树,它在B树的基础上进行了一些优化。B+树与B树相比有以下不同之处:

  • 所有键值都保存在叶子节点中,内部节点只包含键值的引用。
  • 所有叶子节点通过指针连接形成一个有序链表,使得范围查询更加高效。
  • 叶子节点之间的指针提供了顺序访问数据的能力,适用于范围查询和顺序遍历。
    在这里插入图片描述

由于B+树的叶子节点形成了一个有序链表,范围查询操作的性能非常高。而B树虽然也可以执行范围查询,但需要在内部节点上进行递归操作,性能相对较低。

总结:

  • B树适用于需要频繁进行随机读写操作的场景,它对于范围查询的性能稍逊于B+树。
  • B+树适用于需要进行范围查询和顺序遍历的场景,它在范围查询方面具有更好的性能。

讲了这么多,接下来将引出B+树索引。B+树索引是基于B+树发展而来的,通常在InnoDB上对某个字段添加索引,就是对这个字段构建一棵B+树。当查询条件是该字段时,查询速度非常快,对比逐行扫描,效率明显高很多。
MySQL的索引按具体作用划分,可分为聚集索引、辅助索引、唯一索引和联合索引。

1.1、聚集索引

InnoDB通过主键聚集数据,如果没有定义主键,那么InnoDB会隐式定义一个ROW ID代替。聚集索引占用的空间最大,因为它保存了全部数据。下面将通过例子理解过程:

use test;
#创建表
create table 't1' (
'id' int not null auto_increment,
'a' int not null,
'b' char(2) not null,
primary key ('id'),
key 'idx_a' ('a')
) engine=innodb default charset=utf8mb4;
# 插入数据
insert into t1(a,b) values(1,'a'),(2,'b'),(3,'c'),(4,'c'),(5,'e'),(6,'f'),(7,'g'),(8,'i');
#查看数据
select * from t1;

在这里插入图片描述
表t1的聚集索引建立在主键ID上,B+树结构图如下:
在这里插入图片描述

1.2、辅助索引

辅助索引我们也常叫为二级索引,一张表可以有多个,与聚集索引不同的是,辅助索引的叶子节点只存放对应索引字段的键值和主键ID
有时需要统计表的总行数,此时优化器可能会选择辅助索引作为统计目标索引,因为它占用的空间最小
在使用二级索引时,因为它只存储了索引字段的值和主键,所以如果需要查询其他列的数据,就需要先通过二级索引中的值找到对应的主键,在通过主键找到聚簇索引中的其他列的数据,这个过程称为回表
为了减少回表次数,可以将语句中经常使用到的所有列以合适的顺序建立一个二级联合索引,这样所有需要的列都被这个二级索引覆盖,就不需要回表了。
当通过辅助索引来检索数据时,InnoDB先遍历辅助索引查找对应记录的主键,然后通过主键索引找到对应的行数据。下图将采用上面的数据表t1举例:在这里插入图片描述

1.2.1、建表时创建索引

create table 't1' (
'id' int not null auto_increment,
'a' int not null,
'b' char(2) not null,
primary key ('id'),
key 'idx_a' ('a')
) engine=innodb default charset=utf8mb4;

1.2.2、使用create index创建索引

#创建索引
create index idx_b on t1(b);
#查看索引
show index from t1\G
#删除索引
drop index idx_b on t1;

1.2.3、使用alter table语句创建索引

#为b字段添加索引
alter table t1 add index idx_b(b);
#删除索引
alter table t1 drop index idx_b;

1.3、唯一索引

唯一索引由唯一约束和二级索引两部分组成,为字段添加唯一索引后,写入该字段的值必须是不同的,否则会报如下错误:

ERROR 1062 (23000): Duplicate entry 'xxx' for key 'xxx'

若在其中指定了前缀,那么前缀的长度必须唯一。

1.4、联合索引

联合索引适用于where条件中的多列组合,并且在某些场景中可以避免回表。

use test;create table 't2' (
'id' int not null auto_increment,
'a' int not null,
'b' char(2) not null,
'c' datetime not null default current_timestamp,
primary key ('id'),
key 'idx_a_b' ('a','b') #选择两个字段做索引
) engine=innodb default charset=utf8mb4;

二、MySQL索引的优化

2.1、ICP

索引条件下推(Index Condition Pushdown)是针对MySQL用于在执行查询时将过滤条件推送到存储引擎层进行处理,减少不必要的数据读取和传输,从而提高查询性能。
ICP是MySQL的一个自动优化功能,一般情况下无需手动配置或启用。当满足以下条件时,MySQL会自动使用ICP进行优化:

  • 查询中包含等值查询、范围查询或部分LIKE查询。
  • 查询中的条件列存在适当的索引。
  • 查询中的其他条件可以在存储引擎层进行检查。

在使用ICP时,需要注意以下几点:

  • 确保表中的查询条件列有适当的索引。索引可以帮助存储引擎更快地定位和过滤数据。
  • 避免在查询中使用不支持ICP的操作,如函数、计算、隐式类型转换等。这些操作会导致ICP无法使用,影响性能。
  • 监控和分析查询执行计划、性能指标和日志,以确定ICP是否起到了优化作用。可以使用MySQL的性能分析工具和查询优化器来帮助评估和调整查询性能。
  • 当需要访问全表时,ICP适用于range、ref、eq_ref和ref_or_null访问方法
  • 可用于(分区)InnoDB表和MyISAM表
  • 在虚拟列上创建的二级索引不支持ICP
  • 引用子查询的条件不能使用ICP
  • 引用存储过程、触发器的条件不能使用ICP
#关闭ICP
set optimizer_switch = 'index_condition_pushdown=off';
#开启ICP
set optimizer_switch = 'index_condition_pushdown=on';
#查看执行计划
explain select c from t3 where a=1 and b like '%j'\G

2.2、MRR

MRR(Multi-Range Read)是MySQL数据库中的一个优化技术。在传统的查询执行中,对于范围查询,MySQL需要逐条读取满足范围条件的记录,这可能导致大量的磁盘I/O操作。而MRR通过批量读取索引和数据页的方式,将范围查询的数据一次性读入内存,减少了磁盘I/O操作的次数,从而提高了查询性能。
MRR是MySQL的一个自动优化功能,一般情况下无需手动配置或启用。当满足以下条件时,MySQL会自动使用MRR进行优化:

  • 查询中包含范围查询(如BETWEEN、IN、>、<等)。
  • 查询的表中的索引可以支持MRR操作。
  • 查询的表的存储引擎支持MRR。

在使用MRR时,需要注意以下几点:

  • 确保表中的索引可以支持MRR操作MRR主要使用索引来批量读取数据,因此需要合适的索引来支持范围查询。
  • 避免在查询中使用不支持MRR的操作,如函数、计算、隐式类型转换等。这些操作可能导致MRR无法使用,影响性能。
  • 监控和分析查询执行计划、性能指标和日志,以确定MRR是否起到了优化作用。可以使用MySQL的性能分析工具和查询优化器来帮助评估和调整查询性能。

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

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

相关文章

LeetCode每日一题:2136. 全部开花的最早一天(2023.9.30 C++)

目录 2136. 全部开花的最早一天 题目描述&#xff1a; 实现代码与解析&#xff1a; 贪心 原理思路&#xff1a; 2136. 全部开花的最早一天 题目描述&#xff1a; 你有 n 枚花的种子。每枚种子必须先种下&#xff0c;才能开始生长、开花。播种需要时间&#xff0c;种子的生…

Selenium 浏览器坐标转桌面坐标

背景&#xff1a; 做图表自动化项目需要做拖拽操作&#xff0c;但是selenium提供的拖拽API无效&#xff0c;因此借用pyautogui实现拖拽&#xff0c;但是pyautogui的拖拽是基于Windows桌面坐标实现的&#xff0c;另外浏览器中的坐标与windows桌面坐标并不是一比一对应的关系&am…

基于微信小程序的同城家政服务预约系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理

概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置&#xff1b; 采用注解的方式可以让我们 固化配置&#xff0c;降低代码编写复杂度、减少配置错误情况的发生&#xff0c;提升编码调试的效率、提高业务的可用性。 为什么说“降低…

MySQL 通过存储过程高效插入100w条数据

目录 一、前言二、创建表三、编写存储过程插入数据四、高效插入数据方案4.1、插入数据时删除表中全部索引4.2、存储过程中使用统一事务插入&#xff08;性能显著提升&#xff09;4.3、调整MySQL系统配置&#xff08;性能显著提升&#xff0c;适合存储过程没有使用统一事务&…

CSS详细基础(三)复合选择器

前两章介绍了CSS中的基础属性&#xff0c;以及一些基础的选择器&#xff0c;本贴开始介绍复合选择器的内容~ ​ 在 CSS 中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基本选择器进行组合形…

我的创作纪念日 不忘初心,砥砺前行

机缘 本来我只是记录一些自己平时安装各种软件或者组件的教程&#xff0c;以及记录平时遇到的一些bug。 没想到一些教程收到了各位同学的喜爱。 收获 这篇VMware虚拟机安装Linux教程(超详细) 深受大家喜爱。写这篇文章的初衷一是为了记录&#xff0c;二是为了分享。自己一步…

uniapp:如何修改路由加载条的样式

路由加载条默认是绿色&#xff0c;通过元素选择工具我们可以知道元素的类名是#router-loadding .loadding&#xff0c;具体设置在h5-dom.js文件里。 我们直接在App.vue里对加载样式进行修改即可&#xff0c;如下图&#xff1a; !important一定记得要加&#xff0c;否则不生效&…

GEO生信数据挖掘(三)芯片探针ID与基因名映射处理

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 处理一个探针对应多个基因 1.删除该行 2.保留分割符号前面的第一个基因 处理多个探针对应一个基因 详细代码案例一删除法 详细代码案例二 多个基因名时保留第一个基因名…

Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境

参考的博客&#xff1a; Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter&#xff0c;并创建虚拟环境 理解和创建&#xff1a;Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址&#xff0c;可…

C++——函数指针与指针函数

函数指针与指针函数 1. 初识 一个区分的小技巧&#xff1a; “函数指针”中函数是用来修饰指针的&#xff0c;所以主体是指针&#xff0c;它主要是用来指向函数的。 “指针函数”中指针是用来修饰函数的&#xff0c;所以主体是函数&#xff0c;该函数的返回类型是指针。 举个…

华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker

华为云云耀云服务器L实例评测 &#xff5c; 实例使用教学之软件安装&#xff1a;华为云云耀云服务器环境下安装 Docker 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀云…

Oracle 11g_FusionOS_安装文档

同事让安装数据库&#xff0c;查询服务器信息发现操作系统是超聚变根据华为openEuler操作系统更改的自研操作系统&#xff0c;安装过程中踩坑不少&#xff0c;最后在超聚变厂商的技术支持下安装成功&#xff0c;步骤可参数该文。 一、 安装环境准备 1.1 软件下载 下载地址:…

基于微信小程序的网络安全科普题库答题系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

识别消费陷阱,反消费主义书单推荐

在消费主义无所不在的今天&#xff0c;商家是如何设置消费陷阱的&#xff1f;人们在做出消费决策时又是如何“犯错”的&#xff1f;如何才能做出更加理性的选择&#xff1f; 本书单适合对经济学、市场营销感兴趣的朋友阅读。 《小狗钱钱》 “你的自信程度决定了你是否相信自已…

线性代数(七) 矩阵分析

前言 从性线变换我们得出&#xff0c;矩阵和函数是密不可分的。如何用函数的思维来分析矩阵。 矩阵的序列 通过这个定义我们就定义了矩阵序列的收敛性。 研究矩阵序列收敛性的常用方法&#xff0c;是用《常见向量范数和矩阵范数》来研究矩阵序列的极限。 长度是范数的一个特…

Android widget 小部件使用指南强化版

Android widget 小部件使用指南强化版 一、简单UI的小部件二、含集合的小部件三、可配置的小部件四、可控制的小部件五、Android 12 Widget 更新 小部件是主屏幕定制的一个重要方面。您可以将它们视为应用程序最重要的数据和功能的“概览”视图&#xff0c;这些数据和功能可以直…

Linux 基本语句_5_创建静态库|动态库

静态库 创建主函数&#xff1a;main.c 应用函数&#xff1a;add.c、sub.c、mul.c 创建calc.h文件作为头文件 生成可执行文件*.o文件 gcc -c add.c -o add.o ....包装*.o文件为静态库 ar -rc libmymath.a add.o sub.o mul.o编译静态库并指明创建静态库的位置 sudo gcc mai…

零基础教程:Yolov5模型改进-添加13种注意力机制

1.准备工作 先给出13种注意力机制的下载地址&#xff1a; https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例&#xff08;不需要接收通道数的注意力机制&#xff09; 1.在models文件下新建py文件&#xff0c;取名叫Sim…

1分钟快速实现Redis数据对比

在上篇「Redis高效、安全的不停机数据迁移方案」的文章中&#xff0c;介绍了NineData在Redis迁移场景下的性能和优势。因为数据在主备、多云和多区域环境之间的迁移流动&#xff0c;难免会产生数据一致性的问题&#xff0c;而结构与数据不一致往往是导致故障的原因之一。所以&a…