MySQL-索引篇

文章目录

  • 什么是索引?
  • 索引的优缺点
  • 索引底层数据结构选型
    • Hash表
    • 二叉查找树
    • AVL树
    • 红黑树
    • B树&B+树
  • 索引类型总结
  • 主键索引
  • 二级索引
  • 聚集索引与非聚集索引
    • 聚集索引
    • 非聚集索引
  • 覆盖索引与关联索引
    • 覆盖索引
    • 联合查询
    • 最左前缀匹配原则
  • 索引下推
  • 如何正确使用索引
    • 选择合适的字段创建索引
    • 被频繁更新的字段应该慎重创建索引
    • 限制每张表上的索引数量
    • 尽可能考虑建立联合索引而不是单列索引
    • 注意避免冗余索引
    • 字符串类型的字段使用前缀索引而不是普通索引
    • 避免索引失效
    • 删除长期未使用的索引

什么是索引?

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构

索引的优缺点

优点:

  • 使用索引可以大大加快数据的检索速度,减少IO次数
  • 通过创建唯一性索引,可以保证数据库表的每一行数据的的唯一性

缺点:

  • 创建索引和维护索引需要耗费许多时间
  • 索引需要物理文件存储,也会耗费一定空间

问:索引一定能提高查询性能吗?

索引底层数据结构选型

Hash表

问:为什么MySQL不使用Hash表作为索引的结构?
Hash索引不支持顺序和范围查询,并且每次IO只能取一个

二叉查找树

二叉查找树的性能非常依赖于其平衡程度,也不适合作为MySQL的索引底层数据结构

AVL树

红黑树

B树&B+树

索引类型总结

按不同的角度有不同的划分

主键索引

  1. 数据库表主键列使用的索引就是主键索引
  2. 一个表只能有一个主键,主键不能为null,不能重复
  3. InnoDB中,如果没有指定主键,会自动检查是否有唯一索引并且不允许存在null值的字段,如果有设为主键,否则,自动创建一个6byte的自增主键

二级索引

  1. 二级索引的叶子节点所存储数据是主键的值
  2. 唯一索引,普通索引,前缀索引,全文索引都属于二级索引

聚集索引与非聚集索引

聚集索引

索引结构和数据存放到一起的索引,InnoDB中的主键索引就是聚集索引,B+树每个非叶子结点存储索引,叶子节点存储索引和索引对应的数据
优点:

  1. 查询速度非常快
  2. 对排序查找和范围查找优化

缺点:

  1. 依赖于有序的数据
  2. 更新代价大

非聚集索引

非聚集索引就是索引结构和数据分开存放的索引,二级索引就是非聚集索引
优点:

  1. 更新代价较小,因为叶子节点不存放数据

缺点:

  1. 依赖于有序的数据
  2. 可能会二次查询(回表)

问:什么是回表
在使用非主键索引查询时,会先找到主键,再根据主键索引查询完整的数据,这个过程被称为回表

覆盖索引与关联索引

覆盖索引

一个索引包含所有需要查询的字段的值,需要查询的字段刚好是索引的字段,直接根据该索引,就可以拿到所需的数据了,不需要回表查询

联合查询

使用表中多个字段建立索引,就是联合索引

最左前缀匹配原则

在使用联合索引时,MySQL根据索引的字段顺序,从左到右依次匹配查询条件中的字段,如果查询条件与索引中的最左侧字段相匹配,就会根据索引来查

#联合索引 idx(name,class)
# 可以命中索引
SELECT * FROM student WHERE name = 'Anne Henry';
EXPLAIN SELECT * FROM student WHERE name = 'Anne Henry' AND class = 'lIrm08RYVk';
# 无法命中索引
SELECT * FROM student WHERE class = 'lIrm08RYVk';

索引下推

是一项索引优化功能,允许存储引擎在索引遍历过程中,执行部分where字句的判断条件,直接过滤掉不满足条件的记录,从而减少回表次数,提高查询效率

如何正确使用索引

选择合适的字段创建索引

  1. 不为Null的字段
  2. 被频繁查询的字段
  3. 被作为条件查询的字段
  4. 频繁需要排序的字段
  5. 经常需要连接的字段

被频繁更新的字段应该慎重创建索引

限制每张表上的索引数量

建议单张表不超过5个,MySQL优化器在选择如何优化查询时,会对每一个可以用到的索引进行评估,以生成一个最好的执行计划,如果有多个索引可以选择,会增长生成执行计划的时间,也会降低查询效率

尽可能考虑建立联合索引而不是单列索引

索引需要占用磁盘空间,如果是联合索引,多个字段在一个索引上,会节省很大的磁盘空间,且修改数据的效率也会提升

注意避免冗余索引

大多数情况下应扩展已有的索引,而不是创建新索引

字符串类型的字段使用前缀索引而不是普通索引

前缀索引仅限于字符串类型,且相对于普通索引会占用更小的空间

避免索引失效

常见索引失效场景:

  1. 创建了联合索引,但查询条件未遵循最左前缀法则
  2. 在索引列上计算,函数,类型转换等操作
  3. 以%开头的LIKE查询比如LIKE ‘%abc’;
  4. 查询条件中使用了or,or左右有一个列没有索引,涉及索引都会失效
  5. in的取值范围较大时会导致索引失效,走全表扫描
  6. 发生隐式转换(https://javaguide.cn/database/mysql/index-invalidation-caused-by-implicit-conversion.html#sql-%E6%B5%8B%E8%AF%95)

删除长期未使用的索引

不用的索引的存在会造成不必要的索引的损耗

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

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

相关文章

信息检索(35):LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL

LEXMAE: LEXICON-BOTTLENECKED PRETRAINING FOR LARGE-SCALE RETRIEVAL 标题摘要1 引言2 相关工作3 LEXMAE:词典瓶颈屏蔽自动编码器3.1 语言建模编码器3.2 词典瓶颈模块3.3 弱化掩蔽式解码器3.4 词汇加权检索器的预训练目标和微调 4 实验4.1 主要评估4.2 效率分析与…

「云渲染教程」3D渲染时GPU内存不足怎么解决?

在进行三维场景渲染时,如果遇到模型较为复杂,用户们可能会面临图形处理单元(GPU)内存不足的挑战。这种情况通常意味着现有的硬件配置不足以满足渲染任务的需求。为了缓解GPU的工作压力,可以采取一些策略来优化资源的分…

如何使用联合体判断一个机器是大端还是小端

如何使用联合体判断一个机器是大端还是小端 #include<iostream> using namespace std; union Checker//联合体中的数据共享内存 {int val;char ch[2]; }; int main() {Checker checker;checker.val 0x1234;if (checker.ch[0] 0x34)//数组中的数据是由低地址往高地址存放…

Arduino-ILI9341驱动开发TFT屏显示任意内容三

Arduino-ILI9341驱动开发TFT屏显示任意内容三 1.概述 这篇文章介绍使用ILI9341驱动提供的函数控制TFT屏显示字符串、图形、符号等等内容的编辑和展示。 2.硬件 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻…

什么是web3D?应用场景有哪些?如何实现web3D展示?

Web3D是一种将3D技术与网络技术完美结合的全新领域&#xff0c;它可以实现将数字化的3D模型直接在网络浏览器上运行&#xff0c;从而实现在线交互式的浏览和操作。 Web3D通过将多媒体技术、3D技术、信息网络技术、计算机技术等多种技术融合在一起&#xff0c;实现了它在网络上…

QT6 android程序界面强制横屏显示不旋转

QT6开发的Android程序有时候旋转后程序会变形&#xff0c;比如想让其固定位横屏显示&#xff0c;就需要进行特殊设置&#xff0c;本文提供一种简便的设置方法。 一.AndroidManifest.xml文件介绍 Android的Manifest.xml文件是一个重要的配置文件&#xff0c;用于描述应用程序的…

2024.5.9 关于 SpringCloud —— Nacos 的安装与配置

目录 Windos 安装步骤 docker 启动 nacos Windos 安装步骤 1&#xff09;点击下方链接&#xff0c;进入并访问 nacos 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 2&#xff09;按照下图箭头指示下载对应版本的压缩包 3&#xff09;此时我们将得到一个压缩包&…

ARM时钟树结构(GD32)

时钟树的简易框图 初始化配置系统时钟 配置系统初始化时钟&#xff08;参考手册&#xff09; 对应hal库函数 使用72MHz的系统时钟 do -----------while&#xff08;0&#xff09;的使用方法 系统时钟 #include <stdint.h> #include "gd32f30x.h"int main(void)…

分布式事务技术方案

什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现…

Rancher-Kubewarden-保姆级教学-含Demo测试

一、什么是Kubewarden&#xff1f; What is Kubewarden? | Kubewarden 1、就是容器集群的准入策略引擎。 1、使用的策略其实就是k8s原生的security context. 2、使用WebAssembly来编写策略。 1、WebAssembly&#xff0c;可以使用擅长的开发语言来编写策略。&#xff08;下面的…

shared_ptr 引用计数相关问题

前言 智能指针是 C11 增加的非常重要的特性&#xff0c;并且也是面试的高频考点&#xff0c;本文主要解释以下几个问题&#xff1a; 引用计数是怎么共享的、怎么解决并发问题的资源释放时&#xff0c;控制块的内存释放吗weak_ptr 怎么判断对象是否已经释放 文中源码用的是 L…

CSS的基础语法和常见的语法简单归纳

CSS CSS 是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用来控制网页样式和布局的标记语言。通过 CSS&#xff0c;可以定义网页中的元素&#xff08;如文字、图像、链接等&#xff09;的外观和排版方式&#xff0c;包括字体、颜色、大小、间距、…

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决

一般安卓提取apk图标我们有两种常用方法&#xff1a; 1、如果已经获取到 ApplicationInfo 对象&#xff08;假设名为 appInfo&#xff09;&#xff0c;那么我们获取方法为&#xff1a; appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…

静态分析-RIPS-源码解析记录-01

token流扫描重构部分&#xff0c;这一部分主要利用php的token解析api解析出来的token流&#xff0c;对其中的特定token进行删除、替换、对于特定的语法结构进行重构&#xff0c;保持php语法结构上的一致性 解析主要在lib/scanner.php中通过Tokenizer这个类来实现,也就是在main…

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…

git 推送github 选https遇到登录 openSSH问题

使用https需要使用github令牌token作为密码&#xff0c; 使用SSH不需要登录。 还有一个问题&#xff1a; 创建github仓库后没有quick setup页面解决办法 千万不要点击任何多的操作&#xff01;&#xff01;&#xff01;输入仓库名&#xff0c;直接create&#xff01;&#x…

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…

多模态CLIP和BLIP

一、CLIP 全称为Contrastive Language-Image Pre-Training用于做图-文匹配&#xff0c;部署在预训练阶段&#xff0c;最终理解为图像分类器。 1.背景 以前进行分类模型时&#xff0c;存在类别固定和训练时要进行标注。因此面对这两个问题提出CLIP&#xff0c;通过这个预训练…

1.前端环境搭建

1.安装nodejs 因为我们开发Vue项目需要使用npm命令来创建和启动&#xff0c;安装node.js是为了获得这个命令&#xff0c;目前和使用node.js无关 下载地址&#xff1a;http://nodejs.cn/download/ 下载完之后安装&#xff0c;通过cmd查看是否安装成功 node --version2.创建项目…

老板必读:防数据泄露,保卫您的商业秘密

在信息技术高速发展的今天&#xff0c;数据泄露已成为所有企业都必须正视的风险。对于企业而言&#xff0c;数据不仅仅是一堆数字和信息的集合&#xff0c;更是企业的核心竞争力与商业秘密的载体。一旦数据泄露&#xff0c;不仅会导致经济损失&#xff0c;还可能使企业信誉受损…