我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中使用IN()查询到底走不走索引?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中使用IN()查询到底走不走索引?

MySQL中使用IN()查询到底走不走索引?

看数据量

  • EXPLAINSELECT * from users WHERE is_doctor in (0,1); 
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F46PnJDg-1681257665213)(C:%5CUsers%5Cquyanliang%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1681257531822.png)]

  • 很明显没走索引,下面再看一个sql。

  • EXPLAINSELECT * from users WHERE is_doctor in (2,1);
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CecVqr47-1681257665214)(C:%5CUsers%5Cquyanliang%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1681257554058.png)]

  • 又走索引了,所以IN查询走不走索引需要看rows的数据量,in (0,1)时查询出52万多数据量,全表才54万数据量,in (2,1)时只有1万多数据量。

  • EXPLAINSELECT * from users WHERE (is_doctor=0 or is_doctor=1); 与 EXPLAINSELECT * from users WHERE (is_doctor=2 or is_doctor=1);

IN后面是不是有子查询

  • EXPLAINSELECT * from users WHERE is_doctor in (SELECT is_doctor from test_in_subselect);
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntJpMJnu-1681257665215)(C:%5CUsers%5Cquyanliang%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5C1681257606234.png)]

总结

  • IN通常是走索引的,当IN后面的数据在数据表中超过*30%*的匹配时是全表扫描,不走索引,因此IN走不走索引和后面的数据量有关系。
  • 根据实际的情况,需要控制IN查询的范围。原因有以下几点
  • IN 的条件过多,会导致索引失效,走索引扫描
  • IN 的条件过多,返回的数据会很多,可能会导致应用堆内内存溢出。所以必须要控制好IN的查询个数

来源地址:https://blog.csdn.net/Andrew_Chenwq/article/details/130097985

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中使用IN()查询到底走不走索引?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

varchar int 查询 到底什么情况下走索引?

一个字符类型的、一个int类型的,查询的时候到底会不会走索引,其实很多工作了几年的开发人员有时也会晕,下面就用具体事例来测试一下。1.  准备工作先准备2张表,以备后续测试使用。表1:创建表test1,总共3列,其中id 是主键(int),c_no 为int型
varchar  int 查询 到底什么情况下走索引?
2015-12-17

mysql哪些查询情况不走索引

这篇文章主要介绍“mysql哪些查询情况不走索引”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql哪些查询情况不走索引”文章能帮助大家解决问题。mysql哪些查询情况不走索引1、索引列参与计算
2023-06-30

delete in子查询不走索引问题分析

目录引言问题复现原因分析优化方案为什么加个别名就可以走索引了呢?总结引言文章开篇前,先问大家一个问题:delete in子查询,是否会走索引呢?很多伙伴第一感觉就是:会走索引。最近我们有个生产问题,就跟它有关。本文将跟大家一起探讨这个问题
2022-07-06

delete in子查询不走索引问题怎么解决

本文小编为大家详细介绍“delete in子查询不走索引问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“delete in子查询不走索引问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题复
2023-07-02

记mysql中delete操作中使用in不会走索引的问题

目前负责的一个项目,需要维护一个电话号码对比库,表名为phone_bak1,以下称为a表,量级为3000万条。还有另外一张表存储电话白名单,表名为phone_delete,以下称为b表,量级为3000条左右。  目的呢,是要从a表中排除掉在b表中的电话号码。 
记mysql中delete操作中使用in不会走索引的问题
2020-05-20

MySQL索引失效原因及SQL查询语句不走索引原因是什么

这篇“MySQL索引失效原因及SQL查询语句不走索引原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL索引失
2023-03-07

MySQL索引失效原因以及SQL查询语句不走索引原因详解

目录前言1. 隐式的类型转换,索引失效2. 查询条件包含 or,可能导致索引失效3. like 通配符可能导致索引失效4. 查询条件不满足联合索引的最左匹配原则5. 在索引列login_time上使用 mysql 的内置函数6. 对索引列a
2023-03-06

Mysql IN子句后面的时间范围查询到底能不能用到索引

​经常在网上看到 “IN” 子句用不到索引,或者 “IN” 后面的字段用不到索引,这里做个简单的测试。步骤如下:一、准备资料1.表定义​商品表:t_orderID商家ID(int)店铺ID(int)编码名称创建时间(datetime)idmerchant_id
Mysql IN子句后面的时间范围查询到底能不能用到索引
2021-09-11

使用 MySQL 中的复合索引使慢速查询变得更快

让我们首先看看什么是复合索引 -复合索引是在多个列上使用的索引。 也称为多列索引。MySQL 允许用户创建复合索引,该索引最多可以包含16 列。查询优化器使用复合索引进行查询,这将测试索引中的所有列。它也可用于测试第一列、前两列等的查询。如
2023-10-22

MySQL全文索引在数据库中的应用和优势(模糊查询不用like+%)

目录前言创建全文索引使用全文索引Natural LanguageBooleanQuery Expansion删除全文索引总结前言我们都知道 InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效,但有时需求就是如此,类似这样的需求
MySQL全文索引在数据库中的应用和优势(模糊查询不用like+%)
2024-09-08

编程热搜

目录