【常见索引使用】⭐️Mysql中索引的类型以及使用方式和失效场景

目录

一、前言

二、数据准备

三、索引的分类

四、索引示例

示例1、主键索引(Primary Key Index)与 唯一索引(Unique Index)

示例2、前缀索引(Prefix Index)

示例3、联合索引(复合索引)

五、索引失效场景(较多,演示两个实例)


一、前言

        朋友们大家好啊,在数据库的性能优化和调优过程中,索引起到了不可小觑的作用,并且索引分为了很多种,本文是在InnoDB存储引擎下测试索引的使用

二、数据准备

        1.创建用例表(这里随便从本地库中找张表,挑了个xxljob的日志表,补充点数据)

CREATE TABLE `xxl_job_log` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `job_group` int NOT NULL COMMENT '执行器主键ID',
  `job_id` int NOT NULL COMMENT '任务,主键ID',
  `executor_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
  `executor_handler` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '执行器任务handler',
  `executor_param` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '执行器任务参数',
  `executor_sharding_param` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
  `executor_fail_retry_count` int NOT NULL DEFAULT '0' COMMENT '失败重试次数',
  `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
  `trigger_code` int NOT NULL COMMENT '调度-结果',
  `trigger_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '调度-日志',
  `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
  `handle_code` int NOT NULL COMMENT '执行-状态',
  `handle_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '执行-日志',
  `alarm_status` tinyint NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

        2、需要借助SQL的explain命令来查看数据执行的结果,先来看下每个参数

  • id: 表示查询中执行 SELECT 语句或子查询的序列号。

  • select_type: 表示查询的类型,常用的值有 SIMPLE、PRIMARY、SUBQUERY、DERIVED 等。

  • table: 指示查询涉及的表名。

  • partitions: 表示查询涉及的分区信息,如果查询中涉及到了分区表,则会显示分区的信息。

  • type: 表示 MySQL 在表中找到所需行的方式,常见的值有 ALL、index、range 等。

  • possible_keys: 表示可能应用在这张表中的索引。

  • key: 实际使用的索引。如果为 NULL,则表示没有使用索引;如果为 PRIMARY,则表示使用了主键索引。

  • key_len: 表示 MySQL 在索引键部分使用的字节数。

  • ref: 显示索引的哪一列被使用了,如果可能的话,是一个常数。

  • rows: 表示 MySQL 从表中找到所需行所需读取的行数。

  • filtered: 表示在表的数据行中,通过条件过滤后,剩下的行所占的比例,范围是 0 到 100。

  • Extra: 提供关于 MySQL 执行查询时的额外信息,比如是否使用了临时表、使用了文件排序等等。

三、索引的分类

四、索引示例

示例1、主键索引(Primary Key Index)与 唯一索引(Unique Index)
  • 主键索引是一种特殊的唯一索引,具有以下特点:
    • 一张表只能有一个主键,用来唯一标识每一行数据。
    • 主键列的值不能为 NULL,确保每行数据都有一个唯一的标识。
    • 主键索引是表的物理排序顺序,通常会自动创建一个主键索引。
    • 主键索引在查询中的速度很快,可以通过主键快速定位到唯一的行。
  • 唯一索引 (Unique Index):

    • 唯一索引是一种约束,确保索引列的值在整个表中是唯一的。
    • 一张表可以有多个唯一索引,不同于主键索引的唯一之处在于允许 NULL 值(除非定义了 NOT NULL 约束)。
    • 唯一索引可以用来确保数据的完整性,防止重复值的插入。
  • 主键索引在定义上有更多的限制和特殊性,用途也不完全相同。主键索引一般用于唯一标识每一行数据,而唯一索引则用于确保某一列或多列的取值唯一性。

        这里根据主键id查找,查看explain命令返回结果,挑两个参数看下

  1. possible_keys: 显示了可能被查询用到的索引,这里显示了 PRIMARY,即主键索引。
  2. type: const,表示使用了常量连接,这是最有效率的一种查询方式。
  3. key: 显示实际使用的索引,也是 PRIMARY,即使用了主键索引。
  4. Extra: 显示了其他额外信息,这里是 "Using index",表示查询过程中使用了索引加速。

示例2、前缀索引(Prefix Index)

        比如 trigger_msg是一个很长的文本字段,通常按照前缀进行查询,可以创建一个前缀索引

未加索引前查询

创建一个前缀索引,再次执行查询看看结果,显示走了索引

alter table xxl_job_log add index i_trigger_msg_prefix (trigger_msg(10));

  1. type: range,表示在索引上进行范围扫描。
  2. possible_keys: 可能被查询用到的索引是 i_trigger_msg_prefix
  3. key: 实际使用的索引是 i_trigger_msg_prefix
示例3、联合索引(复合索引)

先对于group,id这两个列创建一个联合索引,看下结果是走了索引

alter table xxl_job_log add index i_job_group_job_id (job_group,job_id);

  1. type: ref,表示使用了某个索引进行查找,返回匹配某个值的所有行。
  2. possible_keys: 可能被查询用到的索引是 i_job_group_job_id
  3. key: 实际使用的索引是 i_job_group_job_id

注意:

        (1)最左前缀匹配原则:如果查询条件不是按照索引定义的顺序依次使用索引中的列,那么索引失效

比如,只用到了索引的第二个列,索引失效

        如果只查第一个列 正常走索引

        (2)覆盖索引:查询的列均有使用索引

        这个查询使用了索引 i_job_group_job_id,通过索引进行了 ref 查找,同时使用了覆盖索引(Using index),这意味着查询可以直接从索引中获取所需的数据,而无需回表到主表,从而提高了查询效率,这就实现了覆盖索引,也是为什么不推荐 select * ... 的原因。覆盖索引能够显著减少磁盘I/O操作,从而极大提升查询性能。

五、索引失效场景(较多,演示两个实例)

        1、主键索引:对主键列进行了计算操作

        2、前缀索引:like通配符在开头

        3、使用or关键字

        4、使用范围查询中的not in/exists 

        5、索引列使用函数

文章到这里就结束了

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

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

相关文章

智能驾驶规划控制理论学习07-规划算法整体框架

一、解耦合策略 1、路径-速度解耦策略概述 路径-速度解耦指的是将车辆的运动分成路径规划和速度规划两部分,对两个部分分别进行研究。 路径规划: 假设环境是“静态的”,将障碍物投射到参考路径上,并规划一条避开它们的路径&…

2024年【安全员-C证】找解析及安全员-C证模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 安全员-C证找解析是安全生产模拟考试一点通总题库中生成的一套安全员-C证模拟考试,安全生产模拟考试一点通上安全员-C证作业手机同步练习。2024年【安全员-C证】找解析及安全员-C证模拟考试 1、【多选题】…

第十二篇 - IAB 标准技术条款和定义-我为什么要翻译介绍美国人工智能科技巨头IAB公司?

前言 这是2021年IAB公司发布的《市场营销人工智能使用案例及最佳实践报告》的最后一篇译文。翻译工作不难,但是非常考验一个人的态度,需要译者忠于自己的初心,严谨对待所有文字、数据、信息、技术和观点。时代变化如此之快,3年前…

【小黑嵌入式系统第十八课】结课总结(二)——软件部分(系统架构调试测试运行系统软件设计)

上一课: 【小黑嵌入式系统第十七课】结课总结(一)——硬件部分(系统&总线&处理器&外设&通信) 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

js节点操作

js节点操作 一.DOM节点二.查找节点三.增加节点3.1.创建节点3.2.追加节点3.3.克隆节点 四. 删除节点 一.DOM节点 DOM树里每一个内容都称之为节点 节点类型:元素节点(所有的标签 比如 body,div等,html 是根节点) 属性节…

前缀和+哈希表:联手合击Leetcode 560.和为k的子数组

题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2: 输入:nums [1,2…

C++指针(四)

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三) 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…

YOLOSHOW - YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 基于 Pyside6 的图形化界面

YOLOSHOW 是一个基于 PySide6(Qt for Python)开发的图形化界面应用程序,主要用于集成和可视化YOLO系列(包括但不限于YOLOv5、YOLOv7、YOLOv8、YOLOv9)的目标检测模型。YOLOSHOW 提供了一个用户友好的交互界面&#xff…

遥感分析时什么情况下需要做大气校正?

经常会遇到这样的问题:什么情况需要做大气校正产生?这个问题取决于传感器和应用目标,总的来说,如果要做光谱分析,那么大气校正是必须要做的。本文对于在什么情况下选择什么样的大气校正方法,给出了一些依据…

算法48:动态规划专练(力扣221:最大正方形面积)

题目: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。 示例 1: 输入:matrix [["1","0","1","0","0"],["1","0&quo…

MySQL下实现纯SQL语句的递归查询

需求 有一个部门表,部门表中有一个字段用于定义它的父部门; 在实际业务中有一个『部门中心』的业务; 比如采购单,我们需要显示本部门及子部门的采购单显示出来。 结构 数据如下: 实现方式如下: WITH RECUR…

打造智慧足球社区:Java+SpringBoot实战

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

【vue3之组合式API及其新特性】

组合式API及其新特性 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1.侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、…

vue 总结

1.vue 的生命周期 1. es6 2. vue 基本属性指令 <template><div><!--<h1>vue基本指令的使用方式</h1><a :href"url">v-bind使用链接</a><img :src"srcUrl" /><div>解决闪烁问题<p v-cloak>{{…

【word】引用文献如何标注右上角

一、在Word文档中引用文献并标注在右上角的具体步骤如下 1、将光标移动到需要添加文献标注的位置&#xff1a; 2、在文档上方的工具栏中选择“引用”选项&#xff1a; 3、点击“插入脚注”或“插入尾注”&#xff1a; ①如果选择的是脚注&#xff0c;则脚注区域会出现在本页的…

Object.keys()的用法

1、语法 Object.keys(obj) 参数&#xff1a;要返回其枚举自身属性的对象 返回值&#xff1a;一个表示给定对象的所有可枚举属性的字符串数组 2、处理对象&#xff0c;返回可枚举的属性数组 let person {name:“张三”,age:25,address:“深圳”,getName:function(){}} Obj…

管理 PostgreSQL 中配置参数的各种方法

管理 PostgreSQL 中配置参数的各种方法 1. 概述 PostgreSQL提供了一个配置文件 postgresql.conf 让用户自定义参数。您可能需要更改一些参数来调整性能或在工作环境中部署 PostgreSQL 服务器。在这篇博文中&#xff0c;我们将探索管理这些参数的不同方法。 2. 以不同方式管理…

大语言模型系列-GPT-3

文章目录 前言一、GTP-3的改进二、GPT-3的表现总结 前言 《Language Models are Few-Shot Learners&#xff0c;2020》 前文提到GPT-2进一步提升了模型的zero shot能力&#xff0c;但是在一些任务中仍可能会“胡说”&#xff0c;GTP-3基于此提出了few shot&#xff0c;即预测…

PnP算法

PnP(Perspective-n-Point)是求解3D到2D点的对应方法。它描述了当知道n个3D空间点及其位置&#xff0c;如何估计相机的位姿。如果两张图像中的一张特征点3D位置已知&#xff0c;那么至少需要3个点对(以及至少一个额外验证点验证结果)就可以计算相机的运动。 PnP的应用范围很广比…