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格式调整
步骤: 1、将全部列表设置成Map<Long, List<Obejct>> map的格式,方便查看每个父级对应的子列表,减少循环次数 2、对这个map进行递归,重新进行级联树的集合调整,将子集放置在对应的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构造函数与原型链:从原理到最佳实践
一、开篇:为什么需要理解原型链? 在JavaScript开发中,90%以上的"诡异"bug都与原型链机制相关。理解构造函数与原型链的运行原理,不仅能帮助我们写出更优雅的代码,还能在框架源码阅读、性能优化等场景中游刃…...
【Linux 指北】常用 Linux 指令汇总
第一章、常用基本指令 # 注意: # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件…...
第27周JavaSpringboot 前后端联调
电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前,需要先掌握如何启动项目。项目启动是整个开发流程的基础,只有成功启动项目,才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…...
QT中的布局管理
在 Qt 中,布局管理器(如 QHBoxLayout 和 QVBoxLayout)的构造函数可以接受一个 QWidget* 参数,用于指定该布局的父控件。如果指定了父控件,布局会自动将其管理的控件添加到父控件中。 在你的代码中,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
一,下载源码 cd hardware/libhardware/tests git clone https://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git 二, 在 i2c-tools 目录添加 Android.mk 编译文件 LOCAL_PATH: $(call my-dir)################### i2c-tools ###############…...
Centos 7 修改语言和输入源为中文+修改终端快捷键复制为Ctrl+C、粘贴为Ctrl+V
目录 修改语言和输入源为中文 1、设置 2、Region & Language(区域和语言) 3、Add an Input Source(添加输入源) 4、修改语言为中文 5、Restart(重启) 6、Log Out (注销) …...
DeepSeek-进阶版部署(Linux+GPU)
前面几个小节讲解的Win和Linux部署DeepSeek的比较简单的方法,而且采用的模型也是最小的,作为测试体验使用是没问题的。如果要在生产环境使用还是需要用到GPU来实现,下面我将以有一台带上GPU显卡的Linux机器来部署DeepSeek。这里还只是先体验单…...
疯狂安卓入门,crayandroid
系列文章目录 文章目录 系列文章目录第一组 ViewGroup 为基类帧布局约束布局 第二组 TextView 及其子类button时钟 AnalogClock 和 TextClock计时器 第三组 ImageView 及其子类第四组 AdapterView 及其子类AutoCompleteTextView 的功能和用法ExapndaleListViewAdapterViewFlipp…...
批量测试IP和域名联通性
最近需要测试IP和域名的联通性,因数量很多,单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境,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”的缩写,即“互联网协议”。它是用于计算机网络通信的基础协议之一,属于TCP/IP协议族中的网络层协议。IP协议的主要功能是负责将数据包从源主机传输到目标主机,并确保数据能够在复杂的网络环境中正…...
一招解决Pytorch GPU版本安装慢的问题
Pytorch是一个流行的深度学习框架,广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力,加速模型的训练和推理过程。接下来,我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…...
股票交易所官方api接口有哪些?获取和使用需要满足什么条件
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...
MoonSharp 文档五
目录 13.Coroutines(协程) Lua中的协程 从CLR代码中的协程 从CLR代码中的协程作为CLR迭代器 注意事项 抢占式协程 14.Hardwire descriptors(硬编码描述符) 为什么需要“硬编码” 什么是“硬编码” 如何进行硬编码 硬编…...
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
最近在思考一个问题:如何能够更好的分享主流框架源码学习笔记(主要是源码部分)?让有缘刷到的同学既可以有所收获,还能保持对相关技术架构探讨学习热情和兴趣。以及自己也保持较高的分享热情和动力。 今天尝试用一个SQL查询作为引…...
如何重置 MySQL root 用户的登录密码?
重置 MySQL root 密码的核心步骤是绕过权限验证登录数据库并更新密码字段。以下是具体方法: 方法一:通过 --SKIP-GRANT-TABLES 模式修改密码 停止 MySQL 服务 Windows:在命令行执行 net stop mysql(服务名可能为 mysql80 或 mysql…...
ArrayList底层结构和源码分析笔记
参考视频:韩顺平Java集合 ArrayList特点 ArrayList 可以加入 null,包括多个。 ArrayList 是由数组来实现数据存储的 ArrayList 基本等同于 Vector,除了 ArrayList 是线程不安全(执行效率高)。在多线程情况下…...
Centos离线安装gcc
文章目录 Centos离线安装gcc1. gcc是什么?2. gcc下载地址3. gcc的安装4. 安装结果验证 Centos离线安装gcc 1. gcc是什么? GCC(GNU Compiler Collection)是 GNU 项目下的开源编译器套件,主要用于将 C、C 等编程语言的源…...
flutter 图片资源路径管理
1. 创建统一资源管理类 创建一个单独的 Dart 文件(比如 manager.dart),将所有图片路径集中管理。这样在引用图片时,不需要每次都手动输入完整路径,只需通过常量引用即可。 //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优化
参考: https://blog.csdn.net/qq_47012987/article/details/140169024 内存泄露排查 使用chrome测试cocos creator内存泄漏问题手游内存优化cocos creator优化Creator资源自动释放逻辑:所有 cc.Asset 实例都拥有成员函数 addRef 和 decRef,分…...
MySQL 企业版 TDE加密后 测试和问题汇总
一、测试keyring file 1.1 当keyring file文件丢失或者被篡改 结论:不影响当前正在运行的数据库,但是在重启服务后会启动失败出现报错。 tail -n 100 /var/log/mysql/error.log 报错信息如下: 2025-03-12T08:04:54.668847Z 1 [ERROR] [M…...
