MySQL-索引篇

news2024/11/24 7:52:55

文章目录

  • 什么是索引?
  • 索引的优缺点
  • 索引底层数据结构选型
    • 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.coloradmin.cn/o/1667277.html

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

相关文章

Linux基础命令(续)

17,wc命令 作用:统计行数、单词数、字符个数 格式: wc 选项 文件 wc passwd 26 36 1159 passwd26:行数 36:单词数 1159:字符数 passwd:文件名wc autofs.conf 426 2604 15137 autofs.conf426…

CentOS7 安装 Kamailio

https://www.kamailio.org/wiki/packages/rpms 官方文档说 yum -y install yum-utils yum-config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo 但目前这样其实行不通 需要这样做: yum install --disablerepokamailio --enablerepokamai…

在Linux操作系统中LVM逻辑券管理指令

1.PV物理券相关指令 1.查看机器中的PV pvscan 命令 这个叫做/dev/sda2 的PV,被加入到了名叫centos的卷组中,并且这个券组的大小是小于19.51GB 2.创建物理券 pvcreate 磁盘/分区名称 pvcreate /dev/sdc 3.删除物理券 pvremove 磁盘/分区名称 2.…

微信授权登录02-移动端

目录 ## 前言 1.准备工作 1.1 网站域名 1.2 微信公众号 2.授权登录开发 2.1 前端开发 2.1.1 调起微信授权页面 ## 调起微信授权页面效果图 2.1.2 用户允许授权后回调处理 2.2 后端开发 2.2.1 根据code查询用户信息 2.2.2 自动注册登录 ## 后记 ## 前言 上一篇写…

力扣HOT100 - 295. 数据流的中位数

解题思路&#xff1a; 小顶堆 大顶堆 class MedianFinder {Queue<Integer> A, B;public MedianFinder() {A new PriorityQueue<>();B new PriorityQueue<>((x, y) -> (y - x));}public void addNum(int num) {if (A.size() ! B.size()) {A.add(num);B…

HCIP的学习(14)

过滤策略—filter-policy ​ 思科中&#xff1a;分发列表 ​ 过滤策略是只能够针对于路由信息进行筛选&#xff08;过滤&#xff09;的工具&#xff0c;而无法针对于LSA进行过滤。 在R4的出方向上配置过滤策略&#xff0c;使得R1不能学习到23.0.0.0/24路由信息1、抓取流量 […

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同&#xff1a; 1&#xff09;、web、openfeign 2&#xff09;、每一个服务&#xff0c;包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3&#xff09;、模块名&#x…

ABAP ZCL_EXCEL 实际用的案例 对账单

ABAP ZCL_EXCEL 实际用的案例 FORM GETITEMSANDOUTPUT USING PGS_HEAD TYPE GSHEAD.DATA:FILENAME TYPE STRING.DATA:LKUNNR TYPE KNA1-KUNNR.DATA:PROW TYPE I.DATA:LSDATE TYPE STRING.DATA:SUMXSJE TYPE DMBTR,ZYMYE TYPE DMBTR, "月末余额SUMBYXSYE TYPE DMBT…

java项目之英语知识应用网站源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的英语知识应用网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 英语知识应用网站的主要…

文心一言 VS 讯飞星火 VS chatgpt (257)-- 算法导论19.2 1题

一、给出图19-4(m)中的斐波那契堆调用 FIB-HEAP-EXTRACT-MIN 后得到的斐波那契堆。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 由于我不能直接画出图19-4(m)中的斐波那契堆&#xff0c;我将基于斐波那契堆的基本结构和操作FIB-HEAP-EXTRACT-MIN的一般行为来…

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 DreamGaussian是第一个使用gaussian splatting方法进行3d生成的工作。论文最先使用gaussian splatting替代原来用nerf表示3d。整体架构依然保留了原来的…

探索数据结构:树与二叉树

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 树 1.1. 树的定义 树是一种非线性的数据结构&#xff0c;它是由n&a…

nodejs复习笔记

最近在复习nodejs&#xff0c;整理了一些笔记来记录和分享。 非常惭愧&#xff0c;我之前关于nodejs学习的一篇文章《nodejs全栈开发学习笔记》已经是2019年6月份的时候了&#xff0c;大概浏览了一下&#xff0c;发现当时很多不明白的地方&#xff0c;现在通过复习&#xff0c…

【MySQL数据库开发设计规范】之表设计规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人姑苏老陈 &#xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关注&…

Java反射(含静态代理模式、动态代理模式、类加载器以及JavaBean相关内容)

目录 1、什么是反射 2、Class类 3、通过Class类取得类信息/调用属性或方法 4、静态代理和动态代理 5.类加载器原理分析 6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得…

【计算机毕业设计】基于微信小程序文章管理系统

随着 计算机技术的成熟&#xff0c;互联网的建立&#xff0c;如今&#xff0c;PC平台上有许多关于文章管理方面的应用程序&#xff0c;但由于使用时间和地点上的限制&#xff0c;用户在使用上存在着种种不方便&#xff0c;而开发一款基于微信小程序的文章管理系统&#xff0c;能…

基于机器学习的网络流量识别分类(完整资源收米)NetFlow-Sentry

项目介绍 这是一个名为NetFlow-Sentry的项目&#xff0c;项目实现了对网络流量的实时检测&#xff0c;特征抓取&#xff0c;内置了基于Pytorch的深度学习模型来进行流量分类。该项目除可以进行实时特征提取&#xff0c;还提供了网络流量数据的输入口&#xff0c;可以直接识别分…

并发——进程

1. 程序 程序&#xff08;program&#xff09;是什么&#xff1f; 计算机程序&#xff08;computer program&#xff09;一般是指以某些程序设计语言编程&#xff0c;能够运行于某种目标体系结构上 程序 数据结构 算法 数据结构&#xff1a;用来表示人们思维对象的抽…

mysql的存储结构

一个表就是一个ibd文件 .ibd文件大小取决于数据和索引&#xff0c;在5.7之后才会为每个表生成一个独立表空间即一个ibd文件&#xff0c;在此之前&#xff0c;所有表默认下都会存储在“系统表空间”&#xff08;共享表空间&#xff09;&#xff0c;所有表都在一个ibd文件。 inn…

我的全新官网

科技语者-探索未来的语言和沟通 (chgskj.cn) 另外我还开放了一个网站科技语者-介绍页 (null.fit)