MySQL索引命中与失效

news2024/10/6 10:41:43

目录

    • 创建表
    • MySQL执行优化器
    • 索引的命中与失效情况
    • 总结

讨论MySQL索引命中与失效,我们得先来创建表

创建表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(5) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户密码',
  `create_essay` int(5) NOT NULL COMMENT '原创文章',
  `user_visited` int(10) NOT NULL COMMENT '被访问量',
  `user_rank` int(5) NOT NULL COMMENT '用户排名',
  `perms` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `nickname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户昵称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 116856 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

// 创建组合索引
ALTER TABLE `user` ADD INDEX idx_username_password_user_rank (`username`,`password`,`user_rank`)

这里有一个组合索引的最左匹配原则,具体看我另一篇博客:MySQL最左匹配原则

 
 

查看MySQL中索引是否命中可以使用explainh执行优化器来查看

MySQL执行优化器

执行优化器,顾名思义,优化语句的,准确来说是优化查询语句。其实就是在我们写的select语句前加一个Explain关键字。
 
 

索引的命中与失效情况

第一种情况:针对联合索引,是否遵循最左匹配原则;

建立一个组合索引

idx_username_password_user_rank(`username`,`password`,`user_rank`)
// 命中索引跟顺序无关
explain SELECT * from `user` where username =  "liuxiangcheng" and password = "515239" and user_rank = 1
explain SELECT * from `user` where user_rank = 1 and username =  "liuxiangcheng" and password = "515239"  
explain SELECT * from `user` where user_rank = 1 and password = "515239" and username =  "liuxiangcheng"

结果:

在这里插入图片描述

 

第二种情况:去掉大哥,看看索引是否命中;

// 去掉大哥
explain SELECT * from `user` where   password = "515239" and user_rank = 1

去掉大哥之后,索引失效,全表扫描。

在这里插入图片描述

 

第三种情况:在索引列上做了函数操作,会导致索引失效而导致全表扫描

我们先把那个联合索引删除掉,然后在username这一列上建立一个唯一索引:

删除组合索引

drop index idx_username_password_user_rank on `user`

创建唯一索引

alter table `user` ADD UNIQUE key (`username`)

查看索引

在这里插入图片描述

 

explain SELECT * from `user` where  username= 'user110819'

在这里插入图片描述

 

explain SELECT * from `user` where  concat(username,'')= 'user110819'

在这里插入图片描述

 

第四种情况:模糊查询前缀是以%开头的,索引失效

explain SELECT * from `user` where   username like '%user11081'

在这里插入图片描述

 

第五种情况:模糊查询中后缀是以%,可以命中索引

explain SELECT * from `user` where   username like 'user11081%'

在这里插入图片描述

 

第六种情况:使用is not null 会导致索引失效

explain SELECT * from `user` where   username is not null

在这里插入图片描述
 

第六种情况:使用and时,其中有一个条件查询带有索引而另一个不带索引,不会导致索引失效。而使用or时,如果条件查询中其中一个不带索引,导致索引失效,必须全部带有索引。

and情况:

explain SELECT * from `user` where   username = "liuxiangcheng" and password = "515239"

在这里插入图片描述
 

or情况:

explain SELECT * from `user` where   username = "liuxiangcheng" or user_rank = 1

在这里插入图片描述

我们给user_rank加上索引

alter table `user` ADD  index (`user_rank`)

在这里插入图片描述
再次查询:

explain SELECT * from `user` where   username = "liuxiangcheng" or user_rank = 1

在这里插入图片描述

 

第七种情况:使用不等于(!= 或者<>)的时候,会导致索引失效

explain SELECT * from `user` where   user_rank != 1

or 

explain SELECT * from `user` where   user_rank <> 1

在这里插入图片描述

 
第八种情况:使用范围查询之后索引失效

explain SELECT * from `user` where   user_rank >(<,>=,<=) 1

在这里插入图片描述

 
第八种情况:隐式转换可能会导致我们的索引失效

varchar类型,如果用int类型来查询,索引失效
数据库user表中我们的password是varchar类型
如果我们在条件查询中使用整形来替代,那么这个时候索引就会失效,where varchar = int 索引失效

// password is varchar type

explain SELECT * from `user` where password = 515239

explain SELECT * from `user` where password = '515239'

explain SELECT * from `user` where password = "515239"

在这里插入图片描述

 

如果是int类型,我们使用varchar来替代,索引命中

// user_rank is int type

explain SELECT * from `user` where user_rank = "1"

explain SELECT * from `user` where user_rank = '1'

explain SELECT * from `user` where user_rank = 1

在这里插入图片描述

总结隐式转换

  1. 当操作符左右两边的数据类型不一致时,会发生隐式转换
  2. 当 where 查询操作符左边为数值类型时发生了隐式转换,但是索引会命中,对查询效率影响不大,但还是不推荐这么做
  3. 当 where 查询操作符左边为字符类型时发生了隐式转换,这样会导致索引失效,造成全表扫描。
  4. 字符串转换为数值类型时,非数字开头的字符串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。

 
 

总结

(1)MySQL中索引失效的情况

1、组合索引中不遵循最左匹配原则,带头大哥不在,导致索引失效,全表扫描。
2、在索引列上做了函数操作,导致索引失效,全表扫描。
3、模糊查询前缀是以%开头的,导致索引失效,全表扫描。
4、使用is not null 会导致索引失效。
5、使用or时,如果条件查询中其中一个不带索引,导致索引失效,全表扫描。
6、使用不等于(!= 或者<>)的时候,会导致索引失效。
7、使用范围查询(>、<、>=、<=)之后索引失效。
8、隐式转换可能会导致我们的索引失效。

(2)查看MySQL中索引是否命中可以使用explainh执行优化器来查看。

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

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

相关文章

java动态规划算法

使用场景 动态规划最重要的是转移方程&#xff0c;而转移方程需要递归和记忆化搜索产生的表&#xff0c;因此直接贴出转移方程是没什么用的&#xff0c;不探究如何从递归到记忆化搜索再到转移方程&#xff0c;还是很难想到怎么去得到转移方程。下面我们将从例子中探寻如何三步走…

四、Gradle项目的生命周期

文章目录四、Gradle项目的生命周期【尚硅谷】Gradle教程-讲师&#xff1a;刘辉 生活明朗&#xff0c;万物可爱&#xff0c;人间值得&#xff0c;未来可期 四、Gradle项目的生命周期 Gradle 项目的生命周期分为三大阶段&#xff1a;Initialization -> Configuration -> E…

Maestro 薛定谔软件简单分子对接案例

##参考&#xff1a; Maestro 薛定谔软件使用&#xff1a; https://www.bilibili.com/video/BV1RN411X7Te https://www.youtube.com/watch?vNkM8jjHr7f4&listPL3dxdlKx_PcfuvHwJ0RjpZFt4HjwyTr7f Maestro 薛定谔对接&#xff1a; https://www.bilibili.com/video/BV17p…

【Java多线程】线程的常用方法

测试Thread中的常用方法1.start():启动当前线程&#xff1b;调用当前线程的run()2.run():通常需要重写Thread类中的此方法&#xff0c;将创建的线程要执行的3.currentThread():静态方法&#xff0c;返回当前代码的线程4.getName():获取当前线程的名字5.setName():设置当前线程的…

MySQL逻辑删除+Mybatis-Plus = 墙裂推荐

目录前言逻辑删除使用Mybatis-Plus逻辑删除它做了什么注意写在后面的一些话前言 一般情况下&#xff0c;我们要删除一条数据&#xff0c;直接使用 delete 即可&#xff0c;就像这样&#xff1a;delete from user where id 1&#xff0c;这样做的好处是&#xff1a; 符合我们…

C进阶_字符串库函数

目录 求字符串长度 strlen 常规实现 递归实现 指针-指针实现 长度不受限制的字符串函数 strcpy 模拟实现strcpy strcat 模拟实现strcat strcmp 模拟实现strcmp 长度受限制的字符串函数 strncpy strncat strncmp 求字符串长度 strlen size_t strlen ( const c…

前端工具(运用造型)

CSS预处理器的使用方法 1、什么是css预处理器 CSS预处理器是一种专门的编程语言&#xff0c;用来为CSS增加一些编程特性&#xff08;CSS本身不是编程语言&#xff09;不需要考虑浏览器兼容问题&#xff0c;因为CSS预处理器最终编译和输出的仍是标准的CSS样式。可以在CSS预处理…

磨金石教育摄影技能干货分享|简述特效在影视制作中的四大作用

近三年因为疫情的原因&#xff0c;极少去影院去看电影。 想起来上次看电影还是去年八月份&#xff0c;当时上映的是科幻大作《沙丘》。看科幻电影&#xff0c;最大的期待就是导演编剧们对外星球与外太空场景的塑造。那些逼真的场景与炫酷的战舰航天器&#xff0c;满足了我对未知…

设计模式_结构型模式 -《适配器模式》

设计模式_结构型模式 -《适配器模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 如果去欧洲国家去旅游的话&#xff0c;他们的插座如下图最左边&#xff0c;是欧洲标准。而我们使用的插头如下图…

Kindle 可旋转桌面时钟

前言 自己的 Kindle 吃灰很久了&#xff0c;想做个时钟用&#xff0c;但是网上可选的时钟网站比较少&#xff0c;这些时钟网站里面&#xff0c;要么太简单 界面也比较丑陋&#xff0c;要么内容太多 有些本末倒置了&#xff0c;要么网址特别长 输入网址的时候太麻烦。 干脆自己…

【ROS】—— 机器人导航(仿真)—导航原理(十七)

文章目录前言1. 导航模块简介1.1 全局地图1.2 自身定位1.3 路径规划1.4 运动控制1.5 环境感知2. 导航之坐标系前言 &#x1f4e2;本系列将依托赵虚左老师的ROS课程&#xff0c;写下自己的一些心得与笔记。 &#x1f4e2;课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ …

Min_25筛详解

概述 Min_25是日本一个ACM选手的ID&#xff0c;这个筛法是他发明的&#xff0c;所以称之为Min_25筛。它能在亚线性复杂度求出一类积性函数的 fff 的前缀和&#xff0c;前提 是这个积性函数在质数和质数的幂位置的函数值比较好求。借助埃拉托色尼筛的思想 将原问题转化成与质因…

Allegro如何导出和导入设计规则操作指导

Allegro如何导出和导入设计规则操作指导 当需要借用另外一款PCB的设计规则时候,Allegro支持把PCB设计规则导入到另外一块PCB中,如下图 具体操作如下 打开规则管理器打开后如下图

2023.1.15 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.PROPOSED METHOD5.1 Problem Formulation5.2 Personalized Time Intervals5.3 Embedding Layer5.4 Time Interval-Aware Self-Attention5.4.1 Time Interval-Aware Self-attention Layer5.4.2 Causality5.4.3 Point-Wise Fe…

QT可直接安装的离线版最后版本5.14.2

以前用c#来做组态&#xff0c;自定义控件开发起来也还过得去&#xff0c;但QT的控件和graphics view貌似更有优势&#xff0c;个人观点吧&#xff01;工控领域的组态用上QT还是不错的选择。 从2000前开始使用qt&#xff0c;算起来也有20多年了。个人感觉用起来最顺手的应该时Q…

【PHP】一文详解如何连接Mysql数据库(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

24考研——专业院校选报指南(3步决定专业选择、11大类本科对应考研专业简析、6步决定目标院校)

文章目录一、专业选择指导1.1 考研整体形势1.2 考研专业选报1.2.1 专业设置1.2.2 专硕专业设置1.2.3 专业代码含义1.2.4 区分“学硕和专硕”1.2.5 专业选择步骤&#xff08;跨专业考研难度&#xff09;1.2.6 跨专业考研简析&#xff08;法硕/教育/会计、审计、图书情报/思想政治…

汇编【王爽】实验3、4

实验3 编程、编译、链接、跟踪 assignment 1 编译链接生成可执行文件 assignment 2 debug将程序载入内存&#xff0c;设置CS:IP&#xff1a;程序所在内存段的段地址为DS075CDS075CDS075C&#xff0c;则PSP的地址为075C:0075C:0075C:0&#xff0c;程序的地址为076C:0(075C1…

C++ 初了解模板

一. 泛型编程 我们若是想实现一个需要对各类数据通用的功能&#xff0c;在C语言中是不太现实的&#xff0c;而在C中&#xff0c;我们可以运用函数重载&#xff0c;但我们依然需要写出多个内容极其类似的函数&#xff0c;例如想要实现交换 void Swap(int& a, int& b…

2022这特殊的一年,再见!

望着窗外的夕阳以及还未完全融化的积雪&#xff0c;我想是时候给这特殊的一年写篇总结了。于是我翻看了2021年的&#xff0c;发现文末所定的2022年目标。终于明白为什么老人不玩手机可以坐一下午了&#xff0c;因为往事回想起来就和电视连续剧一样。年初参加了开运跑&#xff0…