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

news2025/1/8 4:23:18

在上一章中我们已经讲完了学习和实施工作中需要掌握的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.coloradmin.cn/o/1050786.html

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

相关文章

excel 指定行数据求和

excel 指定行数据求和 1、 SUMPRODUCT SUMPRODUCT函数是在给定的几组数组中&#xff0c;将数组间对应的元素相乘&#xff0c;并返回乘积之和。语法形式为 SUMPRODUCT(array1, [array2], [array3], …)。 2、功能实现 SUMPRODUCT(($B$4:$B$158"成本")*(D4:D158))

安防监控/视频汇聚平台EasyCVR云端录像不展示是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

【ICCV 2023 Oral】High-Quality Entity Segmentation分享

为什么会看这篇文章呢&#xff1f;因为要搞所谓分割大模型&#xff0c;为什么要搞分割大模型&#xff0c;因为最终我们要搞得是&#xff0c;业内领先的全自动标注系统。&#xff08;标完都不需要人工再修正&#xff01;&#xff01;&#xff01;&#xff09; OK&#xff0c;仰…

MySQL架构 InnoDB存储引擎

1. 什么是Mysql&#xff1f; 我们在开发的时候&#xff0c;我们都需要对业务数据进行存储&#xff0c;这个时候&#xff0c;你们就会用到MySQL、Oracal等数据库。 MySQL它是一个关系型数据库&#xff0c;这种关系型数据库就有Oracal、 MySQL&#xff0c;以及最近很火的PgSQL等。…

安全基础 --- MySQL数据库解析

MySQL的ACID &#xff08;1&#xff09;ACID是衡量事务的四个特性 原子性&#xff08;Atomicity&#xff0c;或称不可分割性&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;Durability&#xff09; &…

【IDEA】使用idea调试时查看对象集合的值

1、在实体类上添加toString方法 2、在要查看集合的地方右键View as→toString 3、View Text复制对象集合的值 4、复制map集合的值同理

ThemeForest – Canvas 7.2.0 – 多用途 HTML5 模板

ThemeForest 上的 HTML 网站模板受到全球数百万客户的喜爱。与包含网站所有页面并允许您在 WP 仪表板中自定义字体和样式的 WordPress 主题不同&#xff0c;这些设计模板是用 HTML 构建的。您可以在 HTML 编辑器中编辑模板&#xff0c;但不能在 WordPress 上编辑模板&#xff0…

多网卡场景数据包接收时ip匹配规则

多网卡场景数据包接收时ip匹配规则 mac地址匹配规则 接收数据包时数据包中的目的mac地址匹配接收网卡的mac地址后&#xff0c;数据包才会继续被传递到网络层处理 ip地址匹配规则 图1&#xff1a; 参见&#xff1a;https://zhuanlan.zhihu.com/p/529160026?utm_id0 图2&am…

在vue使用wangEditor(简单使用)

wangEditor不同的版本使用方法都不一样&#xff0c;这里以目前最新的参考官网方法使用2023-09-28 首先安装&#xff0c;参考官网&#xff0c;注意editor跟editor-for-vue两个都要装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --saveyarn add wangedit…

云安全之访问控制的常见攻击及防御

访问控制攻击概述 访问控制漏洞即应用程序允许攻击者执行或者访问某种攻击者不具备相应权限的功能或资源。 常见的访问控制可以分为垂直访问控制、水平访问控制及多阶段访问控制 (上下文相关访问控制)&#xff0c;与其相应的访问控制漏洞为也垂直越权漏洞(普通用户可以访问或…

ElasticSearch - 在 微服务项目 中基于 RabbitMQ 实现 ES 和 MySQL 数据异步同步(考点)

目录 一、数据同步 1.1、什么是数据同步 1.2、解决数据同步面临的问题 1.3、解决办法 1.3.1、同步调用 1.3.2、异步通知&#xff08;推荐&#xff09; 1.3.3、监听 binlog 1.3、基于 RabbitMQ 实现数据同步 1.3.1、需求 1.3.2、在“酒店搜索服务”中 声明 exchange、…

【C++】vector的介绍 | 常见接口的使用

目录 vector的介绍 常见接口 构造函数 尾插push_back() vector的遍历 1.用方括号下标 遍历&#xff1a; 2.调用at()来访问&#xff1a; 3.用迭代器遍历&#xff1a; 4.范围for遍历&#xff1a; vector空间 vector增删查改 覆盖assign() 查找find() 插入insert() …

css自学框架之幻灯片展示效果

这一节&#xff0c;我自学了焦点图效果(自动播放&#xff0c;圆点控制)&#xff0c;首先看一下效果&#xff1a; 下面我们还是老思路&#xff0c;css展示学习三个主要步骤&#xff1a;一是CSS代码&#xff0c;二是Javascript代码&#xff0c;三是Html代码。 一、css代码主要如…

【JavaEE】锁策略

文章目录 前言1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重入锁6. 读写锁Java synchronized 分别对应哪些锁策略1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重…

Scala第八章节

Scala第八章节 scala总目录 章节目标 能够使用trait独立完成适配器, 模板方法, 职责链设计模式能够独立叙述trait的构造机制能够了解trait继承class的写法能够独立完成程序员案例 1. 特质入门 1.1 概述 有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情…

基于Java的图书管理系统设计与实现(源码+lw+部署文档+讲解等)

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

JavaScript系列从入门到精通系列第十篇:JavaScript中的相等运算符与条件运算符

文章目录 一&#xff1a;相等运算符 1&#xff1a; 2&#xff1a;! 3&#xff1a;与! (一)&#xff1a; (二)&#xff1a;! 二&#xff1a;条件运算符 1&#xff1a;语法 2&#xff1a;使用 3&#xff1a;容易挨打的写法 一&#xff1a;相等运算符 用于比较两个值是…

前端框架介绍

一、node.js 配置淘宝镜像源 npm config set registry https://registry.npm.taobao.org可以使用npm config list命令来确认镜像地址是否已成功更改。 如果需要将配置的镜像恢复为默认的npm官方源,可以执行以下命令: npm config delete registry二、vue 1、创建Vue项目 …

算法的时间复杂度分析习题专题

之前写了一篇重点是讲理论&#xff0c;今天重点在于对于题目的分析 题目难度不分先后&#xff0c;有题目来源会直接给出链接或者位置 第一题&#xff1a;消失的数字 题目来源&#xff1a;LeetCode消失的数字 分析 第一种思路分析&#xff1a; 参考代码&#xff1a; #include …

RTSP协议抓包及讲解

文章目录 前言一、RTSP 亲手搭建直播点播1、数据源为视频文件2、数据源为摄像头①、搭建 RTSP 流媒体服务器②、客户端拉流 二、RTSP 协议简介三、手撕 RTSP 协议1、Wireshark 抓包①、搭建环境②、wireshark 抓包 2、RTSP 交互流程①、OPTIONS②、DESCRIBE③、SETUP④、PLAY⑤…