当前位置: 首页 > article >正文

MySQL中 IN 到底走不走索引?

文章目录

  • 前言
  • 数据库表结构
  • 查询sql
  • EXPLAIN介绍
    • EXPLAIN 的输出每列解释
  • 强制走索引
  • 查询时添加条件(复合索引字段)
    • 查询小时
    • 查询分钟
  • 总结


前言

在 MySQL 中,IN 语句是否能够利用索引取决于多个因素,包括但不限于查询的具体形式、表的统计信息、索引的选择度等。以下通过几个案例来帮助理解 IN 语句与索引使用的关系。

数据库表结构

CREATE TABLE `device_record_gongdi` (`id` varchar(32) NOT NULL COMMENT '主键',`device_code` varchar(32) NOT NULL COMMENT '设备code',`device_type` tinyint(1) NOT NULL COMMENT '设备类型(0:微站设备 1:工地扬尘监测)',`time_type` tinyint(1) DEFAULT NULL COMMENT '时间类型(1:一分钟 2:五分钟 3:一小时)',`cn` varchar(4) DEFAULT NULL COMMENT '时间类型编码: 2011 分钟、2051 5分钟、2061 小时',`aqi` int(11) DEFAULT NULL,`level` varchar(50) DEFAULT NULL COMMENT '等级',`pollutions` varchar(255) DEFAULT NULL COMMENT '首要污染物',`zhzs` double(11,3) DEFAULT NULL COMMENT '综合指数',`pm25_avg` double(6,2) unsigned DEFAULT NULL COMMENT 'PM25 指定时间内平均值',`pm10_avg` double(6,2) unsigned DEFAULT NULL COMMENT 'PM10 指定时间内平均值',`so2_avg` double(6,2) unsigned DEFAULT NULL COMMENT 'SO2 指定时间内平均值',`no2_avg` double(6,2) unsigned DEFAULT NULL COMMENT 'NO2 指定时间内平均值',`co_avg` double(6,2) unsigned DEFAULT NULL COMMENT 'CO 指定时间内平均值',`data_time` datetime DEFAULT NULL COMMENT '数据采集时间',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`),KEY `gd_data_code_type_time` (`device_code`,`time_type`,`data_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='工地数据表';

复合索引(联合索引):(device_code,time_type,data_time)

查询sql

使用EXPLAIN查看是否走索引

 EXPLAINSELECT *FROM device_record_gongdiWHERE device_code in ('ZR802241106062','ZR802240801012');

在这里插入图片描述
可以看到没有走索引

EXPLAIN介绍

EXPLAIN 关键字在 MySQL 中是一个非常有用的工具,它可以帮助我们了解 MySQL 如何执行SQL语句。通过使用 EXPLAIN,可以获取 MySQL 执行查询的计划,这包括如何连接表、使用哪些索引、是否进行了文件排序或临时表等详细信息。

EXPLAIN 的输出每列解释

  • id: 表示查询中每个部分的选择标识符。如果查询比较简单,可能只有一个 id。对于复杂查询(如子查询),可能会有多个 id。
  • select_type: 显示对应行是简单还是复杂 SELECT 类型。例如:
    • SIMPLE: 简单查询,不包含子查询或 UNION。
    • PRIMARY: 最外层的查询。
    • SUBQUERY: 子查询中的第一个 SELECT。
    • DERIVED: 派生表(在 FROM 子句中的子查询)。
  • table: 显示该行引用的表名。
  • type: 显示连接类型,从最佳到最差依次为:system, const, eq_ref, ref, range, index, 和 ALL。理想情况下,应尽量避免 ALL 类型,因为它表示全表扫描。
  • possible_keys: 显示 MySQL 在查询过程中可以使用的索引。
  • key: 实际上被 MySQL 选择用来加速查询的索引。如果没有索引被使用,则值为 NULL。
  • key_len: 被选中索引使用的字节数,可以通过这个值来判断是否使用了复合索引的部分字段。
  • ref: 显示与索引比较的列或常量。
  • rows: 估算出找到所需的记录所需要读取的行数,值越小越好
  • Extra: 包含不适合在其他列中显示的额外信息,比如“Using where”, “Using index”, “Using temporary”, “Using filesort”等。

本文主要观察type、key和rows列。

强制走索引

通过使用force index让sql强制走索引

 EXPLAINSELECT *FROM device_record_gongdi force index (gd_data_code_type_time)WHERE device_code in ('ZR802241106062','ZR802240801012');

在这里插入图片描述
可以看到强制走索引后,rows值没有减少,仍然为382258行。
继续向下看

查询时添加条件(复合索引字段)

表中time_type为时间类型,1代表一分钟数据,2代表五分钟数据,3代表一小时数据。
表中创建了复合索引:(device_code,time_type,data_time)

查询小时

 EXPLAINSELECT *FROM device_record_gongdiWHERE device_code in ('ZR802241106062','ZR802240801012')AND time_type = 3;

在这里插入图片描述
可以看到in又走了索引,rows扫描的行数降到了3013

查询分钟

 EXPLAINSELECT *FROM device_record_gongdiWHERE device_code in ('ZR802241106062','ZR802240801012')AND time_type = 1;EXPLAINSELECT *FROM device_record_gongdi force index (gd_data_code_type_time)WHERE device_code in ('ZR802241106062','ZR802240801012')AND time_type = 1;

重点观察rows扫描的行数
在这里插入图片描述
在这里插入图片描述
这里可以发现,在执行sql时,in一般是走索引的。只有当mysql的查询优化器认为走索引时也需要扫描大量的数据时,就会变为全表扫描。(有些地方写的是当走索引查询后,rows值在数据表中的占比不超过 30% 时,大概率会走索引)

分别执行这两条sql
在这里插入图片描述
在这里插入图片描述
从这里也可以看出,当使用索引和不使用索引查询时间相差无几时,in就会不走索引。
注意:查询出的条数不同是因为查询时有数据插入

总结

MySQL 中IN语句不一定会走索引,具体取决于多种因素:

  • IN一般是走索引的。只有当mysql的查询优化器认为走索引时也需要扫描大量的数据时,就会变为全表扫描。
  • 当索引覆盖了IN查询的所有列,即查询所需的数据都能从索引中获取,MySQL 可以使用这个索引来加速查询。
  • IN值列表中的值在索引的前缀位置,MySQL 能够利用索引加速查询。若IN值列表的值不在索引的前缀位置,MySQL 无法借助索引加速查询。
  • 也可以使用EXISTS替代IN,在某些场景下能显著提升查询性能。

相关文章:

MySQL中 IN 到底走不走索引?

文章目录 前言数据库表结构查询sqlEXPLAIN介绍EXPLAIN 的输出每列解释 强制走索引查询时添加条件(复合索引字段)查询小时查询分钟 总结 前言 在 MySQL 中,IN 语句是否能够利用索引取决于多个因素,包括但不限于查询的具体形式、表的统计信息、索引的选择…...

centos没有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc...

腾讯云低代码开发应用

创建客户端应用 如上所示,登录腾讯云微搭低代码业务控制台,开始搭建企业官网应用 如上所示,在腾讯云微搭低代码业务控制台中,开始创建企业官网应用 如上所示,在腾讯云微搭低代码业务控制台中,开始编辑企业官…...

医疗APP开发如何实现跨机构数据互通

医疗APP开发如何实现跨机构数据互通 在数字化医疗时代,医疗APP开发已成为连接医疗机构、患者和医疗资源的重要桥梁。然而,如何实现跨机构的数据互通,成为医疗APP开发中的一大挑战。本文将探讨如何通过医疗APP开发实现跨机构数据互通,提升医疗服务效率和患者体验。我们将涵…...

深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 如果说最经典的神经网络,ResNet肯定是一个,从ResNet发布后,很多人做了修改,denseNet网络无疑是最成功的…...

级联树SELECTTREE格式调整

步骤&#xff1a; 1、将全部列表设置成Map<Long, List<Obejct>> map的格式&#xff0c;方便查看每个父级对应的子列表&#xff0c;减少循环次数 2、对这个map进行递归&#xff0c;重新进行级联树的集合调整&#xff0c;将子集放置在对应的childs里面。 public Dyna…...

编译RTTR 0.9.6 (CMake + vs2019)解决std::iterator对rapidjson编译事项

RTTR编译 使用CMake和VS2019 x64编译RTTR 0.9.6指南一、下载RTTR 0.9.6并配置CMake二、在VS2019上编译RTTR 0.9.6解决rapidjson与C17兼容性问题 三、安装RTTR四、最简单的还是用vcpkg 使用CMake和VS2019 x64编译RTTR 0.9.6指南 本文将指导您完成从下载RTTR 0.9.6到使用CMake生…...

深入理解JavaScript构造函数与原型链:从原理到最佳实践

一、开篇&#xff1a;为什么需要理解原型链&#xff1f; 在JavaScript开发中&#xff0c;90%以上的"诡异"bug都与原型链机制相关。理解构造函数与原型链的运行原理&#xff0c;不仅能帮助我们写出更优雅的代码&#xff0c;还能在框架源码阅读、性能优化等场景中游刃…...

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意&#xff1a; # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xf…...

第27周JavaSpringboot 前后端联调

电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前&#xff0c;需要先掌握如何启动项目。项目启动是整个开发流程的基础&#xff0c;只有成功启动项目&#xff0c;才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…...

QT中的布局管理

在 Qt 中&#xff0c;布局管理器&#xff08;如 QHBoxLayout 和 QVBoxLayout&#xff09;的构造函数可以接受一个 QWidget* 参数&#xff0c;用于指定该布局的父控件。如果指定了父控件&#xff0c;布局会自动将其管理的控件添加到父控件中。 在你的代码中&#xff0c;QHBoxLa…...

.net 6.0 webapi支持 xml返回xml json返回json

// 添加控制器并配置格式化器 var builder WebApplication.CreateBuilder(); builder.Services.AddControllers(options > {options.Filters.Add<ContentTypeFilter>();options.ReturnHttpNotAcceptable true; // 强制要求Accept头匹配// 添加 XML 格式化器options.…...

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境 docker-compose.yml services:mysql-8.0:container_name: mysql-8.0image: mysql:8.0restart: always#ports:#- "3306:3306"volumes:- ./etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro- ./var/log…...

Android7上移植I2C-tools

一&#xff0c;下载源码 cd hardware/libhardware/tests git clone https://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git 二&#xff0c; 在 i2c-tools 目录添加 Android.mk 编译文件 LOCAL_PATH: $(call my-dir)################### i2c-tools ###############…...

Centos 7 修改语言和输入源为中文+修改终端快捷键复制为Ctrl+C、粘贴为Ctrl+V

目录 修改语言和输入源为中文 1、设置 2、Region & Language&#xff08;区域和语言&#xff09; 3、Add an Input Source&#xff08;添加输入源&#xff09; 4、修改语言为中文 5、Restart&#xff08;重启&#xff09; 6、Log Out &#xff08;注销&#xff09; …...

DeepSeek-进阶版部署(Linux+GPU)

前面几个小节讲解的Win和Linux部署DeepSeek的比较简单的方法&#xff0c;而且采用的模型也是最小的&#xff0c;作为测试体验使用是没问题的。如果要在生产环境使用还是需要用到GPU来实现&#xff0c;下面我将以有一台带上GPU显卡的Linux机器来部署DeepSeek。这里还只是先体验单…...

疯狂安卓入门,crayandroid

系列文章目录 文章目录 系列文章目录第一组 ViewGroup 为基类帧布局约束布局 第二组 TextView 及其子类button时钟 AnalogClock 和 TextClock计时器 第三组 ImageView 及其子类第四组 AdapterView 及其子类AutoCompleteTextView 的功能和用法ExapndaleListViewAdapterViewFlipp…...

批量测试IP和域名联通性

最近需要测试IP和域名的联通性&#xff0c;因数量很多&#xff0c;单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境&#xff0c;Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...

Python——计算机网络

一.ip 1.ip的定义 IP是“Internet Protocol”的缩写&#xff0c;即“互联网协议”。它是用于计算机网络通信的基础协议之一&#xff0c;属于TCP/IP协议族中的网络层协议。IP协议的主要功能是负责将数据包从源主机传输到目标主机&#xff0c;并确保数据能够在复杂的网络环境中正…...

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架&#xff0c;广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力&#xff0c;加速模型的训练和推理过程。接下来&#xff0c;我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…...

股票交易所官方api接口有哪些?获取和使用需要满足什么条件

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

MoonSharp 文档五

目录 13.Coroutines&#xff08;协程&#xff09; Lua中的协程 从CLR代码中的协程 从CLR代码中的协程作为CLR迭代器 注意事项 抢占式协程 14.Hardwire descriptors&#xff08;硬编码描述符&#xff09; 为什么需要“硬编码” 什么是“硬编码” 如何进行硬编码 硬编…...

框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性

最近在思考一个问题&#xff1a;如何能够更好的分享主流框架源码学习笔记&#xff08;主要是源码部分&#xff09;?让有缘刷到的同学既可以有所收获&#xff0c;还能保持对相关技术架构探讨学习热情和兴趣。以及自己也保持较高的分享热情和动力。 今天尝试用一个SQL查询作为引…...

如何重置 MySQL root 用户的登录密码?

重置 MySQL root 密码的核心步骤是绕过权限验证登录数据库并更新密码字段。以下是具体方法&#xff1a; 方法一&#xff1a;通过 --SKIP-GRANT-TABLES 模式修改密码 停止 MySQL 服务 Windows&#xff1a;在命令行执行 net stop mysql&#xff08;服务名可能为 mysql80 或 mysql…...

ArrayList底层结构和源码分析笔记

参考视频&#xff1a;韩顺平Java集合 ArrayList特点 ArrayList 可以加入 null&#xff0c;包括多个。 ArrayList 是由数组来实现数据存储的 ArrayList 基本等同于 Vector&#xff0c;除了 ArrayList 是线程不安全&#xff08;执行效率高&#xff09;。在多线程情况下&#xf…...

Centos离线安装gcc

文章目录 Centos离线安装gcc1. gcc是什么&#xff1f;2. gcc下载地址3. gcc的安装4. 安装结果验证 Centos离线安装gcc 1. gcc是什么&#xff1f; GCC&#xff08;GNU Compiler Collection&#xff09;是 GNU 项目下的开源编译器套件&#xff0c;主要用于将 C、C 等编程语言的源…...

flutter 图片资源路径管理

1. 创建统一资源管理类 创建一个单独的 Dart 文件&#xff08;比如 manager.dart&#xff09;&#xff0c;将所有图片路径集中管理。这样在引用图片时&#xff0c;不需要每次都手动输入完整路径&#xff0c;只需通过常量引用即可。 //manager.dartclass Manager { static co…...

[内网渗透] 红日靶场2

环境配置 靶场地址: http://vulnstack.qiyuanxuetang.net/vuln/wiki/ 环境配置可以看这个: https://www.bilibili.com/video/BV1De4y1a7Ps/?spm_id_from333.337.search-card.all.click&vd_sourcecf73ac8de9b7c0322b1bccf77de91c5dNAT模式分配111段, DHCP也要更改 再添加…...

【cocos creator】游戏优化,内存,性能,包体积大小,加载,drawcall优化

参考&#xff1a; https://blog.csdn.net/qq_47012987/article/details/140169024 内存泄露排查 使用chrome测试cocos creator内存泄漏问题手游内存优化cocos creator优化Creator资源自动释放逻辑&#xff1a;所有 cc.Asset 实例都拥有成员函数 addRef 和 decRef&#xff0c;分…...

MySQL 企业版 TDE加密后 测试和问题汇总

一、测试keyring file 1.1 当keyring file文件丢失或者被篡改 结论&#xff1a;不影响当前正在运行的数据库&#xff0c;但是在重启服务后会启动失败出现报错。 tail -n 100 /var/log/mysql/error.log 报错信息如下&#xff1a; 2025-03-12T08:04:54.668847Z 1 [ERROR] [M…...