mysql中索引的null值问题

2023-11-03

在mysql中,对含有null值的索引列,以及is null、is not null的查询条件是否会走索引这点,网上有很多说法,为此我自己单独做了个实验:

首先创建两张表,一张表所有字段默认为null,另一张表所有字段默认为not null。

CREATE TABLE a_achievement  ( 
	s_id   	int(11) NULL,
	Math   	decimal(4,1) NULL,
	English	decimal(4,1) NULL,
	Chinese	float NULL 
	);


CREATE TABLE a_achievement_t  ( 
	s_id   	int(11) not NULL,
	Math   	decimal(4,1)not NULL,
	English	decimal(4,1)not NULL,
	Chinese	float not NULL 
	);

然后向表中插入数据:

insert into a_achievement(s_id,Math,English,Chinese)
values(1,100,95,88),(2,98,92,100),(3,99,100,80),(4,100,95,99),(5,90,96,100);

insert into a_achievement_t(s_id,Math,English,Chinese)
values(1,100,95,88),(2,98,92,100),(3,99,100,80),(4,100,95,99),(5,90,96,100);

接下来创建索引:

create index s_id_index on a_achievement(s_id);
create index s_id_index on a_achievement_t(s_id);

然后执行查询:

explain 
select * from a_achievement where s_id is not null 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3RuxLKl-1604991386336)(https://img-blog.csdnim.cn/20201110145143595.png#pic_center)]

这里可以看到表中字段默认为null时使用is not null是不可以走索引的,接下来看下另外一张表:

explain 
select * from a_achievement_t where s_id is not null 

在这里插入图片描述
另外一张表是没有走索引的,也就是说默认为not null的字段在使用is not null的时候是不走索引的,接下来看下 is null:

explain 
select * from a_achievement where s_id is null 

在这里插入图片描述
上图中可以看到,默认为null的字段在使用is null的时候是走索引的,看下另外一张表:

explain 
select * from a_achievement_t where s_id is null 

在这里插入图片描述
默认为not null的字段在使用is null的条件的时候还是没有走索引。

接下来还有另外一种情况,查询时将select * 换成select s_id

explain 
select s_id  from a_achievement where s_id is null 

在这里插入图片描述

explain 
select s_id  from a_achievement_t where s_id is null 

在这里插入图片描述

explain 
select s_id  from a_achievement where s_id is not null 

在这里插入图片描述

explain 
select s_id  from a_achievement_t where s_id is not null 

在这里插入图片描述

这次经过以上四个实验可以看出,当索引列作为查询列时,只有 select s_id from a_achievement_t where s_id is null ;并未走索引,其他三种情况是因为可以直接从索引中通过where条件获取到所要查询的列,所以才走了索引,而未走索引的这种情况,想要知道是什么情况就要了解一下sql的执行过程是要先执行where,后执行select ,因为s_id本就定义为not null的情况,所以在执行where的时候,就获取不到数据,就不会走索引了。

通过以上实验可以得出结论:
1、当索引字段不可以为null 时,只有使用is not null 返回的结果集中只包含索引字段时,才使用索引
2、当索引字段可以为空时,使用 is null 不影响覆盖索引,但是使用 is not null 只有完全返回索引字段时才会使用索引

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql中索引的null值问题 的相关文章

随机推荐

  • 搭建docker+sonarqube并使用scanner、maven分析项目

    一 搭建docker sonarqube 步骤1 进入服务器 创建一个文件夹sonarqube ssh root ip mkdir sonarqube cd sonarqube 可以选用临时或者正式部署方案 临时部署方案 通用部署 dock
  • 厂房效果图制作

    关于厂房 工厂园区规划 及钢结构类项目效果图制作过程中所经常遇到的一些问题 在这里予以汇总整理 并对场景搭建的流程给予简述 三维场景创建 首先需要把CAD平面规划图纸 或是PDF电子版文档 或是手绘稿等弄清楚 场地占地多少亩 有多少厂房 办
  • 1.1 初识基准测试(Benchmark)

    基准测试 Benchmark 是Go语言中用于衡量代码性能的重要工具 通过编写基准测试函数 并使用testing B提供的方法来记录执行时间和其他指标 我们可以准确地评估代码的性能表现 在开发过程中 合理使用基准测试可以帮助我们优化代码 提
  • 面试系列之基础篇

    强引用 软引用 弱引用 虚引用 一般面试官会这样问 你知道Java中对象的引用类型有哪几种吗 分别讲讲这几种之间的区别 强引用 只要强引用还存在 垃圾收集器永远不会回收被引用的对象 软引用 描述一些还有用但是并非必需的对象 将要发生内存溢出
  • 深度学习与人脸识别系列(3)__基于VGGNet的人脸识别系统

    作者 wjmishuai 出处 http blog csdn net wjmishuai article details 50854155 声明 版权所有 转载请联系作者并注明出处 1 引言 本文中介绍的人脸识别系统是基于这两篇论文 Ver
  • java高qps接口设计_高并发后端设计-限流篇

    系统在设计之初就会有一个预估容量 长时间超过系统能承受的TPS QPS阈值 系统可能会被压垮 最终导致整个服务不够用 为了避免这种情况 我们就需要对接口请求进行限流 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限
  • leetcode刷题:最大子序积

    1 题目 题解 实现上面的过程 class Solution public int maxProduct vector
  • 删除gitlab上的分支

    好久没有更新了 今天记录一下删除gitlab上的分支的操作 登录仓库后 依次点击 project gt home gt Readme gt repository gt branches 会看到所有master和所有分支 点击右侧删除即可 看
  • 剑指Offer(一):二维数组中查找最大值

    题目 这个题目说的是 给你一个二维数组 matrix 和一个目标值 target 你要在数组里找到这个目标值 然后返回它的行 列下标 如果找不到 则返回 1 1 这个数组的每一行都是从左向右递增 每一列都是从上到下递增 和 二维数组的二分搜
  • 首届《产业数字化金铲奖》榜单来袭

    出品 产业家 2021年 产业数字化是绝对的主题 在这个变幻莫测的一年里 越来越多的企业开始寻求数字化转型方向 它们在工业 农业 医疗 教育等等方向都在努力作出自己的数字化尝试 个体寻找数字进化之路 企业构建新的技术底层 产业定义互联网下半
  • 相机的坐标系转换(1)

    前言 常言道 工欲善其事 必先利其器 如欲明其理 必先定其义 后一句是我编的 不过 这句话还是有道理的 如果要想明白相机的坐标系之间的转换 那么必须明白相机有哪几个坐标系 并对它们下一个明确的定义 只有这样 我们接下来的工作才好开展 正文
  • Rose(双机热备)服务配置

    安装步骤省略 下面只讲配置 1 一般会设置两个job iis 及 sql 此次选择的是SqlServer 版本没有要求 大概流程是 两台服务器 都有不同的ip 内网或者外网 然后虚拟一个ip出来 比如 服务器A 192 168 100 1
  • Leetcode每日一题:面试题02.02.kth-node-from-end-of-list-lcci(返回倒数第k个节点)

    思路 典型得快慢指针问题 快指针与慢指针中间隔着k 2个节点 那么同时 快慢指针 当快指针指向链表结尾节点时 慢指针指向倒数第k个节点 struct ListNode int val ListNode next ListNode int x
  • Java:基于注解对类实例字段进行通用校验

    前言 后台服务处理前端的请求时 会有这样的一种需求 即校验请求中的参数是否符合校验规则 校验参数是否符合的一种方法是 罗列请求参数 基于校验规则一个一个的校验参数 如果存在不符合的 就返回字段值不符合规则的提示 通过就向下执行 这种方法是可
  • CSS线性渐变linear-gradient

    线性渐变是多种颜色沿着一条直线即渐变线过渡 发生渐变依靠渐变线和色标 其中渐变线来控制发生渐变的方向 色标包括颜色值和位置来控制渐变的色彩变化 创建一个线性渐变 需要指定两种颜色 还可以实现不同方向 指定为一个角度 的渐变效果 如果不指定方
  • 文件上传-.user.ini的妙用

    小伙伴们大家好 本期为大家带来的是 user ini在文件上传漏洞中的妙用 目录 user ini user ini的妙用原理 利用 user ini的环境 实战演示 1 先尝试直接上传webshell 2 看是否能够上传除php和png外
  • img标签和p标签是行内元素还是块级元素?以及p标签中可以放img标签吗?

    img标签 行内块元素 类似于 inline block 可以被p标签包裹 比如p是居中 图片也中了 p标签 块级元素 默认宽度占满一行 HTML p 是段落标签 除了可以添加文字内容外 完全可以添加其他html标签也包括IMG图片标签 其
  • 十大热门编程语言的介绍

    小编给大家分享一篇关于现阶段十大热门编程语言的文章 经过流行的搜索引擎 如谷歌 必应 雅虎 维基百科 亚马逊 YouTube和百度 用于计算评级 得出十大热门编程语言排行榜的榜单 根据百度百科以及网上查阅总结分析以上十大热门编程语言的介绍
  • 安全体系建立标准

    随着我国企业信息化的普及 信息化给我国企业带来积极影响的同时 也带来了信息安全方面的消极影响 一方面信息化在企业发展的过程中 对节约企业成本和达到有效管理起到了积极的推动作用 另一方面伴随着全球信息化和网络化进程的发展 与此相关的信息安全问
  • mysql中索引的null值问题

    在mysql中 对含有null值的索引列 以及is null is not null的查询条件是否会走索引这点 网上有很多说法 为此我自己单独做了个实验 首先创建两张表 一张表所有字段默认为null 另一张表所有字段默认为not null