浅谈mysql中的null - 能不能用索引

浅谈mysql中的null - 能不能用索引

照旧,在开始前,先附上本次试验的ddl, 然后插入数据,随机抽取几条幸运数据的name设为null

CREATE TABLE `user` (`id` int NOT NULL COMMENT 'id',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',`age` int NOT NULL COMMENT '年龄',`sex` tinyint(1) NOT NULL COMMENT '性别',`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '电话',PRIMARY KEY (`id`),KEY `idx_name_age_sex` (`name`,`age`,`sex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

MySQL中IS NULL、IS NOT NULL、!= 等能不能用索引?

先说结论,能!能!能!(重要的事情说三遍)

1. is null

EXPLAIN SELECT * FROM user WHERE name IS NULL

  1. 表中满足筛选条件的数据量较多时, 不走索引

    当表中只有1条数据name不为null,其余数据均为null时

    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null) A L L \color{#f56c6c}{ALL} ALLidx_name_age_sex ( N u l l ) \color{#f56c6c}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) 99 \color{#f56c6c}{99} 9998.99Using where
  2. 表中满足筛选条件的数据量较少时, 走索引

    当表中只有17条数据name为null时

    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null)ref i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex1023const 17 \color{#f56c6c}{17} 17100.00Using index condition

2. is not null

EXPLAIN SELECT * FROM user WHERE name IS NOT NULL

  1. 表中满足筛选条件的数据量较多时, 不走索引

    当表中只有17条数据name为null,其余数据均不为null时

    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null) A L L \color{#f56c6c}{ALL} ALLidx_name_age_sex ( N u l l ) \color{#f56c6c}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) 99 \color{#f56c6c}{99} 9982.83Using where
  2. 表中满足筛选条件的数据量较少时, 走索引

    当表中只有1条数据name不为null时

    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null)ref i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex1023const 1 \color{#f56c6c}{1} 1100.00Using index condition

3. !=

EXPLAIN SELECT * FROM user WHERE name  != 'user1'
  1. 表中为null数据较多时, 走索引

    当表中只有1条数据name不为null,其余数据均为null时

    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null)range i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex1023 ( N u l l ) \color{#909399}{(Null)} (Null) 2 \color{#f56c6c}{2} 2100.00Using index condition
  2. 表中为null数据较少时, 不走索引

    当表中只有17条数据name为null,其余数据均不为null时

    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null) A L L \color{#f56c6c}{ALL} ALLidx_name_age_sex ( N u l l ) \color{#f56c6c}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) 99 \color{#f56c6c}{99} 9982.83Using where

4. =

EXPLAIN SELECT * FROM user WHERE name  != 'user1'

不管为null数据量多少,都走索引

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null)ref i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex1023const 1 \color{#f56c6c}{1} 1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)

综述

当索引列运行为null时,还是能走索引的,但具体走不走索引,还得取决于 走索引和不走索引哪个都成本较小
注意,这里说的走不走索引,都是指的非聚簇索引

非聚簇索引的扫描成本由两部分组成:

  1. 读取索引记录成本
  2. 回表成本 (通过非聚簇索引得到的主键到聚簇索引中查询)

如果查询读取的非聚簇索引越多,需要回表查询的次数就越多,当达到一定比例后,走索引的成本比不走索引的成本还高时,最终的查询就不走索引了,这也就是索引失效的原因

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

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

相关文章

docker- 购建服务镜像并启动

文章目录 前言docker- 购建服务镜像并启动1. 前期准备2. 构建镜像3. 运行容器4. 验证 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实…

软考中级嵌入式系统设计师知识点

主要介绍一些软考中级嵌入式系统设计师涉及到的一些考点。 文章目录 前言 一、嵌入式系统设计师 二、知识点 总结 前言 主要介绍一些软考中级嵌入式系统设计师涉及到的一些考点。 提示:以下是本篇文章正文内容,下面案例可供参考 一、嵌入式系统设计师 …

宝塔面包安装搭建Flarum开源论坛程序 文档教程

一、服务器环境说明 宝塔 7.0.3 或更新版本 Linux Server(本文用的是 CentOs 7.4.6 64位) Apache 或者 Nginx(本文用的是 Nginx 1.16.0) MySQL 5.6(本文使用 MySQL 5.7,原因请看下方引用) PHP 7…

IPFS矿机托管使用普通专线跟IDC机房托管对比分析

IPFS矿机托管使用普通专线跟IDC机房托管对比分析 1 、可靠性高,灵活性好 选择多路由网络稳定,安全性能更高。重要网络设备采用双机备份 2、提供365天全天候运营服务 如果在idc机房进行托管服务器的话,出现服务器遭受攻击数据丢失以及系统…

Java如果系统要使用超大整数(超过long长度范围)请设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)

要设计一个数据结构来存储超过long长度范围的超大整数(也称为大数或高精度数),我们可以使用数组来模拟多位数的表示。通常,我们会选择一个固定大小的整数类型(如int或short)来作为数组的每个元素&#xff0…

产品经理交接规范及流程

一、交接内容 1.1产品整体情况 交接人员需了解产品的整体情况,包括产品的定位、目标用户、主要功能、特点等。 1.2产品文档交接 交接人员需确保所有关于产品的文档的完整性和准确性,包括产品需求文档(PRD)、产品原型、交互文档…

音视频--音频实时传输

1. 音频质量提升 实时音频的传输中为了提升音频质量,一般要对音频做特殊处理:降噪、回声消除、自动增益(3A算法)。通过编解码器自身的的算法特性可以实现上述内容。但是也有专门的库来帮助实现对音频质量的提升。speexdsp库可以对…

项目集成SkyWalking,基于k8s搭建

一、搭建SkyWalking 官方文档(英文):skywalking/docs at master apache/skywalking 中文可以使用:GitHub - SkyAPM/document-cn-translation-of-skywalking: [已过期,请使用官网AI文档] The CN translation version of Apache…

使用 Python 发送 TRON-USDT 和 TRX 交易

文章目录 一、前提准备1.1 环境设置1.2 获取钱包地址和私钥二、发送USDT(TRC-20)交易2.1 流程2.2 USDT交易脚本三、发送TRX交易3.1 流程3.2 TRX交易脚本四、注意事项4.1 注意事项4.2 改进后的USDT和TRX交易脚本本文档介绍如何使用Python和tronpy库发送TRON网络上的USDT(TRC-…

Python SSL root certificates

Python3.12安装好之后,pip仍然指向旧的3.11版本: ~ % pip --version pip 23.3.1 from /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/pip (python 3.11) 需要删除旧的3.11路径 (MAC 版本&#x…

解决脚本刷服务器导致卡顿宕机的问题

在互联网服务领域,自动化脚本的不当使用或恶意攻击可能会导致服务器资源被过度消耗,从而引发服务响应缓慢甚至系统崩溃。特别是在电商、游戏、社交平台等领域,这种现象尤为常见。本文将深入探讨脚本刷服的常见形式、其对服务器性能的影响&…

在Spring Boot项目中集成和使用MQTT

在物联网(IoT)应用中,MQTT(消息队列遥测传输)协议因其轻量级和高效性被广泛使用。在Spring Boot项目中,我们可以通过集成org.springframework.integration:spring-integration-mqtt依赖来实现对MQTT的支持。…

Android 日志等级设置

一、LOG等级设置 1、Java设置 系统Log等级 public static final String LOG_CMD_TAG = "persist.log.tag";public static void setSystemLogLevel(String level) {Log.d(TAG, "setSystemLogLevel: " + level);SystemProperties.set(LOG_CMD_TAG, level)…

计算机专业实习生应该去哪实习?

计算机专业实习生可以选择在各种不同类型的公司和组织中实习。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 这取…

Harmony学习笔记一——项目创建及配置

文章基于Harmony Next Preview2 进行学习,其他版本可能会稍有不同 准备工作 由于目前Harmony Next仅有Preview版本,想要进行Harmony Next开发需要向华为申请权限,具体操作参考: https://developer.huawei.com/consumer/cn/forum/topic/02081…

MySQL查询---单、多表实例

目录 一、素材准备 建表 插入数据: 二、单表查询 三、多表查询 要求: 步骤: 1、建立新的数据库db_calss,以及按照要求建立student表 2.查看已经建立表的属性,并按照要求修改年龄字段属性 3.按照要求建立SC表 …

AI播客下载:Create Like the Greats(主题是AI和市场营销)

《Create Like the Greats》是由Ross Simmonds主持的播客,旨在深入探讨创业、创造过程中的各种问题和挑战。该播客专注于揭示成功创作者的背后故事和策略。 该播客的第一集详细讲述了MasterClass如何建立起一个价值28亿美元的教育科技帝国。这一集不仅展示了Master…

数据科学的守护者:数据治理与安全在大规模数据提取项目中的角色

数据科学的守护者:数据治理与安全在大规模数据提取项目中的角色 随着数据科学的迅猛发展,大规模数据提取项目已成为企业、研究机构和政府等各个领域不可或缺的一部分。然而,伴随着数据的快速增长和复杂性的增加,数据治理与安全问…

stm32学习-光敏传感器控制蜂鸣器

接线 GPIO配置 初始化GPIO 1.使用RCC开启GPIO时钟 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 作用:外设时钟控制(根据外设连接的总线选择要开启的时钟) RCC_AHBPeriph/RCC_APB2Periph/RCC_APB1Periph&#x…

视觉里程计的融合方法及优缺点分析

视觉里程计是视觉slam的一部分,即前端部分,用于前端跟踪并建立局部地图。多用于重定位或辅助定位,常用的有特征点法,光流法和直接法,其区别和优缺点如下。 特征点法,需要计算特征点和描述子,计算…