MySQL索引可能失效之or、is null、is not null、不等于(!=,<>)、联合索引

1、如果 A,B 两列都有索引,那么 

select * from Table where A=a or B=b; 

会走索引吗?

答案:会,因为 A,B都有索引;

2、如果 A,B有索引,但是C没有索引;

select * from Table where A=a or B=b or C =c;

会走索引吗?

答案:不会走,因为C是or的形式,且没有索引

3、如果 建了A B联合索引,但是查询的时候 是B A,会走索引吗?

select * from Table where  B=b and A=a ;

答案: 会走索引,mysql会自动优化;

4、如果 建了A B联合索引,也建了 B,A 联合索引,但是查询的时候 是B A,会走那个索引吗?

select * from Table where  B=b and A=a ;

答案: 不一定走 BA 索引,走那个索引,需要mysql会把sql优化,看 A列的数据过滤多,还是B的过滤多;如果 A的列数据能过滤更多数据,那么会走AB,如果B的列能过滤更多数据,则走BA;

5、给主键name字段、card字段加上索引,

select * from user where name !='123';

select * from user where name not in (7,8);

select * from user where age !='18' ;

select * from user where age not in (7,8);

答案: name字段为主键,索引不失效(range索引) ;age字段不是主键,即使age字段设索引也会失效。另外mysql5.7和5.8不同的版本效果不一样,5.7中sql执行结果是全表扫描,而5.8中使用了 range 类型索引。5.7中如果想使用索引将where条件后的不等于用大于和小于代替。

6、给单个name字段、单个card字段加上索引,查询name为非空的语句(card同样)

select * from user where name is not null

答案: 会走索引

7、给单个name字段、单个card字段加上索引,查询name为非空或card为非空的语句

select * from user where name is not null or card is not null;

答案: 不会走索引。它两用or连接起来,索引就失效了。很多时候,也是因为数据量问题,导致了MySQL优化器放弃走索引。同时,平时我们用explain分析SQL的时候,如果type=range,要注意一下哈,因为这个可能因为数据量问题,导致索引无效。

8、给单个name字段加上索引,

select * from user where name is not null索引是否失效?

答案:如果name字段不允许为空, is null 和 is not null这两种情况索引都会失效(索引一般加在非空列!)

如果name字段允许为空,则is null走 ref 类型的索引,而is not null走 range 类型的索引(如果返回数据量过大,也会索引失效)

补充:

导致索引失效而全表扫描的通常是因为一次查询中回表数量太多。mysql计算认为使用索引的时间成本高于全表扫描,于是mysql宁可全表扫描也不愿意使用索引。使用索引的时间成本高于全表扫描的临界值(10%~30% 左右)。而is null、is not null、!=这些判断条件经常会出现在这些回表范围很大的场景,然后被人误解为是这些判断条件导致的索引失效。

9、联合索引不满足最左匹配原则相关

建立一个联合索引:idx_code_age_name( code , age , name )

#where 条件后的字段包含了联合索引的所有索引字段,并且顺序是按照: code 、 age 、name
explain  select * from test1 where code='001' and age=18  and  name='张飞'
#可以看出已经走了联合索引idx_code_name_age,索引是使用充分的,索引使用效率最佳#where 条件后的字段包含了联合索引的所有索引字段,顺序是不按照: code 、 age 、name。
explain  select * from test1 where code='001' and  name='张飞' and age=18
#可以看出执行结果跟第一种情况一样。注意:这种情况比较特殊,在查询之前mysql会自动优化顺序#where 条件后的字段包含了联合索引中的: code 字段
explain  select * from test1 where code='001'
#也走了索引,但是索引长度有所变化,现在变成了 92 , 92 = 30*3 + 2 ,只用到了一个索引字段code,索引使用不充分#where 条件后的字段包含了联合索引中的: age 字段 或者 name 字段
explain  select * from test1 where age=18
explain  select * from test1 where name='张飞';
#全表扫描,所有的索引都失效了#where 条件后的字段包含了联合索引中的: code 和 age 字段
explain  select * from test1 where code='001' and age=18;
#走了索引,但是索引长度变成了: 96 , 96 = 30*3 + 2 + 4 ,只用到了两个索引字段code和age,索引使用也不充分。#where 条件后的字段包含了联合索引中的: code 和 name 字段
explain  select * from test1 where code='001' and  name='张飞';
#索引长度跟第3种情况一样,长度也是 92 。也就是说只用到了一个索引字段 code ,而 age 字段的索引失效了#where条件后的字段包含了联合索引中的:age 和 name 字段
explain  select * from test1 where age=18  and  name='张飞';
#全表扫描,所有的索引都失效了

10、联合索引的范围查询放到最后

例如联合索引 name,age,height 其中 age需要范围查询(14-18)岁的学生,这时候,要把age放到联合索引列的最后(联合索引中的age列放在最后,不是指where条件中的age放最后。如果联合索引中的范围列放在最后了,即使where条件中的范围列没放最后也能正常走到索引)

摘抄于:

https://www.cnblogs.com/aspirant/p/16166851.html

MySQL 索引失效详解_is not null 索引失效_王林-wlin的博客-CSDN博客

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

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

相关文章

线程与进程,你真得理解了吗

线程与进程,你真得理解了吗 1 进程与线程的关系和区别2 并行与并发3 线程共享了进程哪些资源 相信大家面试时一定没少被一个问题刁难,那就是进程和线程的区别是什么?这个问题延申开来并不像表面那么简单,今天就来深入一探。 开始…

无涯教程-PHP - 标量函数声明

在PHP 7中,引入了一个新函数,即标量类型声明。标量类型声明有两个选项- Coercive - 强制性是默认模式。Strict - 严格模式必须明确提示。 可以使用上述模式强制执行以下类型的函数参数- intfloatbooleanstringinterfacesarraycallable 强制模…

【Unity】如何制作小地图

我们为什么要制作小地图呢? 原因很简单: 导航和定位:小地图可以显示玩家当前位置以及周围环境的概览。这使得玩家能够更好地导航和定位自己在游戏中的位置,找到目标或避开障碍物。场景了解:通过小地图,玩…

Windows10上VS2022单步调试FFmpeg 4.2源码

之前在 https://blog.csdn.net/fengbingchun/article/details/103735560 介绍过通过VS2017单步调试FFmpeg源码的方法,这里在Windows10上通过VS2022单步调试FFmpeg 4.2的方法:基于GitHub上ShiftMediaProject/FFmpeg项目,下面对编译过程进行说明…

渗透测试面试题汇总(附答题解析+配套资料)

注:所有的资料都整理成了PDF,面试题和答案将会持续更新,因为无论如何也不可能覆盖所有的面试题。 一、思路流程 1、信息收集 a、服务器的相关信息(真实ip,系统类型,版本,开放端口,…

vue 实现腾讯地图搜索选点功能(附加搜索联想功能)

注意&#xff1a;开发环境、正式环境需在腾讯地图配置ip地址白名单、域名白名单 封装map组件&#xff1a; <template><iframe width"100%" style"border: none;width: 100%;height: 100%;" :src"map_src"></iframe> </t…

新服务器基本环境下载conda + docker + docker-compose + git

文章目录 Ubuntu 允许root用户登录 centos无所谓condadockerubuntucentos docker-compose官方下载docker-compose国内镜像 gitUbuntuCentos Ubuntu 允许root用户登录 centos无所谓 # 以普通用户登录系统&#xff0c;创建root用户的密码 sudo passwd root# SSH 放行 sudo sed -…

Java免费自学网站墙裂推荐!!!!

最近&#xff0c;常有一些读者问我&#xff1a;“有没有什么推荐的Java学习网站啊&#xff1f;” 因为一直没有时间&#xff0c;所以我之前也是让大家上知乎、搜索引擎搜一下就好了。 但是&#xff0c;我深知不能这样&#xff0c;应该拿出更真诚的态度带来优质的内容。 于是…

uni-app开启gzip配置

指令&#xff1a;npm install webpack4.46.0 --save-dev 指令&#xff1a;npm install compression-webpack-plugin6.1.1 --save-dev vue.config.js const CompressionWebpackPlugin require(compression-webpack-plugin);module.exports {configureWebpack: config > {…

IntelliJ IDEA 编辑器的全局搜索中使用正则表达式

打开 IntelliJ IDEA 编辑器。 使用快捷键 Ctrl Shift F&#xff08;Windows / Linux&#xff09;或 Cmd Shift F&#xff08;Mac&#xff09;打开全局搜索窗口。在搜索框中输入要搜索的内容&#xff0c;例如&#xff1a;“设备【】已经绑定网关”。在搜索框旁边的 “.*” …

轻松搭建远程Node.js服务端,让你的应用在公共网络中畅行无阻!

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

linux安装 MySQL8 并配置开机自启动

目录 1.下载 mysql 安装包 2.上传并解压 mysql 3.修改 mysql 文件夹名 4.创建mysql 用户和用户组 5.数据目录 &#xff08;1&#xff09;创建目录 &#xff08;2&#xff09;赋予权限 6.初始化mysql &#xff08;1&#xff09;配置参数 &#xff08;2&#xff09;配置环…

ChatGPT应用于高职教育的四大潜在风险

目前&#xff0c;ChatGPT还是一种仍未成熟的技术&#xff0c;当其介入高职教育生态后&#xff0c;高职院校师生在享受ChatGPT带来的便利的同时&#xff0c;也应该明白ChatGPT引发的风险也会随之进入高职教育领域&#xff0c;如存在知识信息、伦理意识与学生主体方面的风险与挑战…

爬虫异常处理:异常捕获与容错机制设计

作为一名专业的爬虫程序员&#xff0c;每天使用爬虫IP面对各种异常情况是我们每天都会遇到的事情。 在爬取数据的过程中&#xff0c;我们经常会遇到网络错误、页面结构变化、被反爬虫机制拦截等问题。在这篇文章中&#xff0c;我将和大家分享一些关于如何处理爬虫异常情况的经…

ChatGpt 从入门到精通

相关资源下载地址: 基于ChatGPT的国际中文语法教学辅助应用的探讨.pdf 生成式人工智能技术对教育领域的影响-关于ChatGPT的专访.pdf 电子-从ChatGPT热议看大模型潜力.pdf 从图灵测试到ChatGPT——人机对话的里程碑及启示.pdf 正文 ChatGPT 是一种强大的自然语言处理模型&…

SpringBoot(二)

###SpringBoot原理分析 ###SpringBoot监控 ###SpringBoot项目部署 #SpringBoot自动配置 Condition&#xff1a;&#xff08;条件&#xff09; Condition是在Spring4.0增加的条件判断功能&#xff0c;通过这个功能可以实现选择性的创建Bean操作 SpringBoot是如何知道要创建…

隧道vs免费爬虫ip:为何要选择隧道爬虫ip?

在网络爬虫的世界中&#xff0c;爬虫ip是一项关键技术&#xff0c;它可以帮助我们隐藏身份、突破限制、提高抓取效率。但是&#xff0c;在选择爬虫ip时&#xff0c;我们常常会面对隧道爬虫ip和免费爬虫ip之间的抉择。在本文中&#xff0c;我们将探讨隧道爬虫ip相对于免费爬虫ip…

ROS_LINUX入门学习笔记=2=

B站ros机器人工匠阿杰入门教程 rqt_robot_steering 控制小乌龟 在index ros .rog中查找相关的包&#xff1a;ros_index 下图是rqt_robot_steering的简介 其中可以查看github源码地址 website可以查看效果图 下载相关的包 sudo apt install ros-kinetic-rqt-robot-steering …

WSL 配置 Oracle 19c 客户端

Windows WSL 登陆后显示如下: Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantageSystem information as…

学习内容--

C后台开发_c做后台_人面桃花相映红的博客-CSDN博客 C/C后端开发学习路线总结&#xff08;附带实习学习经历分享&#xff09;_c后端开发需要学什么_Linux后台开发狮的博客-CSDN博客 学到什么程度才可以面试大厂&#xff1f;c/c后台开发进阶指南 后端开发&#xff08;超全&…