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)

删除长期未使用的索引

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

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

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

相关文章

iOS Xcode Debug View Hierarchy 查看视图层级结构

前言 我们难免会遇到接手别人项目的情况,让你去改他遗留的问题,想想都头大,😂可是也不得不面对。作为开发者只要让我们找到出问题的代码文件,我们就总有办法去解决它,那么如何快速定位问题对应的代码文件呢…

r语言数据分析案例-北京市气温预测分析与研究

一、选题背景 近年来,人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放,大量温室气体强烈吸收地面辐射中的红外线,造 成温室效应不断累积,使得地球温度上升,造成全球气候变暖。 气象温度的预测一直以来都是…

python视频转码脚本

今天有一个临时的需求,就是需要将一个wmv的初步转码成mp4的格式。找了一圈,免费的工具少,即使有免费的工具,在功能上也是有所限制,或者会给你塞广告或者附带安装其它流氓小游戏或者杀毒程序。 我并非不支持正版&#…

前端笔记-day05

文章目录 01-结构伪类选择器02-结构伪类选择器-公式用法03-伪元素选择器04-盒子模型-组成05-盒子模型-边框线06-盒子模型-单方向边框线07-盒子模型-内边距08-盒子模型-padding多值写法09-盒子模型-尺寸计算10-盒子模型-版心居中11-清除默认样式12-元素溢出overflow13-外边距合并…

贪心算法-----柠檬水找零

今日题目:leetcode860 题目链接:点击跳转题目 分析: 顾客只会给三种面值:5、10、20,先分类讨论 当收到5美元时:不用找零,面值5张数1当收到10美元时:找零5美元,面值5张数…

3588 pwm android12 的操作

问题: 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程: 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是, 还不知道,android12 最终包含的 设备树是哪个,但是经过我的…

Meilisearch使用过程趟过的坑

Elasticsearch 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求,极快,单文件,超轻量。 所以,对于中小型项目来说…

使用html和css实现个人简历表单的制作

根据下列要求,做出下图所示的个人简历(表单) 表单要求 Ⅰ、表格整体的边框为1像素,单元格间距为0,表格中前六列列宽均为100像素,第七列 为200像素,表格整体在页面上居中显示; Ⅱ、前…

2024年电工杯数学建模竞赛A题B题思路代码分享

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片链接,那是获取资料的入口! 点击链接加入群聊【2024电工杯】:http://qm.qq.com/cgi-bin/qm/qr?_wv1027&k_PrjarulWZU8JsAOA9gnj_oHKIjFe195&authKeySbv2XM853…

简洁大气APP下载单页源码

源码介绍 简洁大气APP下载单页源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 效果截图 源码下载 简洁大气APP下载单页源码

3D Web轻量化引擎HOOPS Communicator如何处理DWG文件中的图纸?

在当今工程设计和建筑领域,数字化技术已经成为不可或缺的一部分。HOOPS Communicator作为一种强大的三维数据可视化工具,被广泛应用于处理各种CAD文件,其中包括AutoCAD的DWG格式。在这篇文章中,我们将探讨HOOPS Communicator是如何…

【Win10设备管理器中无端口选项】

计算机疑难杂症分享002 Win10设备管理器中无端口选项1、问题现象2、问题原因3、问题解决3.1、驱动精灵(亲测的此方法)3.2、添加过时硬件3.3、官方的方法 Win10设备管理器中无端口选项 1、问题现象 当我调试串口通信时,发现打开设备管理器没有端口,打开…

Centos7安装图形化界面

前言:原文在我的博客网站中,持续更新数通、系统方面的知识,欢迎来访! Centos7安装图形化界面https://myweb.myskillstree.cn/43.html 目录 一、安装GNOME桌面 二、开机自启动修改为命令行模式 三、卸载图形化界面 一、安装GN…

重生奇迹mu再生宝石怎么用有什么用

重生奇迹mu再生宝石有2个用处: 1、在玛雅哥布林处给380装备加PVP属性4追4以上的380级装备,守护宝石一颗,再生宝石一颗,成功得到PVP装备,失败宝石消失,装备无变化; 2、给非套装点强化属性用法跟祝福,灵魂,生命一样直接往装备上敲,成功得到随机强化属性一…

conan2 基础入门(05)-(静态库动态库)(DebugRelease)

conan2 基础入门(05)-(静态库&动态库)(Debug&Release) 文章目录 conan2 基础入门(05)-(静态库&动态库)(Debug&Release)⭐准备预备文件和Code ⭐静态库&动态库静态库动态库 ⭐Debug&ReleaseReleaseDebug END视频教学settings.yml ⭐准备 本文均在windo…

设计模式-创建型-原型模式-prototype

工作经验类 public class WorkExperience implements Cloneable {private String workDate;private String company;public void setWorkDate(String workDate) {this.workDate workDate;}public void setCompany(String company) {this.company company;}Overridepublic Ob…

数据结构与算法学习笔记三---循环队列的表示和实现(C++)

目录 前言 1.为什么要使用循环队列 2.队列的顺序存储方式的实现 1.定义 2.队列初始化 3.销毁 4.清空队列 5.队列是否为空 6.队列长度 7.队头 8.入队 9.出队 10.遍历队列 11.完整代码 3.参考资料 前言 这篇文章介绍循环队列的表示和用法。 1.为什么要使用循环队…

Vue3:路由

1. 路由简介 在Vue3中,路由是一个核心概念,特别是在构建单页面应用程序(SPA)时。以下是Vue3中路由的基本概念: 1. **路由(Route)**:在Vue3中,路由是指根据特定的规则将用…

Leetcode3138. 同位字符串连接的最小长度

Every day a Leetcode 题目来源:3138. 同位字符串连接的最小长度 解法1:枚举同位子串的长度 从小到大枚举字符串 t 的长度 len。 因为字符串 s 由字符串 t 和它的同位字符串连接而成,所以 n % len 0。 然后比较所有首字母下标为 0、len…

HTML/CSS3

1.CSS CSS的作用在于在HTML的基础上(决定网页的内容和结构)对网页进行排版布局 对网页中的元素提供样式 使得网页显得更加精美CSS全称是cascading style sheets 即层叠样式表CSS样式的书写格式:样式名: 样式值 例如:color: red建议:之后进行空格 CSS样式…