测试表如下:

CREATE TABLE`test_table` (

`id`int(11) NOT NULLAUTO_INCREMENT,

`pay_id`int(11) DEFAULT NULL,

`pay_time`datetime DEFAULT NULL,

`other_col`varchar(100) DEFAULT NULL,PRIMARY KEY(`id`),KEY`idx_pay_id` (`pay_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

第一步:建一个存储过程插入测试数据,测试数据的特点是pay_id可重复,这里在存储过程处理成,循环插入300W条数据的过程中,每隔100条数据插入一条重复的pay_id,时间字段在一定范围内随机

存储过程:执行 call test_insert(3000000); 插入303000行数据

CREATE DEFINER=`root`@`%` PROCEDURE `test_insert`(IN `loopcount` INT)

COMMENT'往test_insert表中插入数据'

BEGIN

declare cnt int;set cnt = 0;while cnt

insert into test_table (pay_id,pay_time,other_col) values (cnt,date_add(now(), interval floor(300*rand()) day),uuid());end if;set cnt = cnt + 1;end while;END

两种子查询的写法:查询某个时间段之内的业务Id大于1的数据

方法一:IN子查询中是某段时间内业务统计大于1的业务Id,外层按照IN子查询的结果进行查询,业务Id的列pay_id上有索引,逻辑也比较简单,这种写法,在数据量大的时候确实效率比较低,用不到索引

注:In子查询的执行计划,发现外层查询是一个全表扫描的方式,没有用到pay_id上的索引,如果想对第一种查询方式使用强制索引,虽然是不报错的,但是发现根本没用,如果子查询是直接的值,则是可以正常使用索引的。

SELECT * FROM test_table2 FORCE INDEX(idx_pay_id)WHEREpay_idIN(SELECTpay_idFROMtest_table2WHERE pay_time >= "2019-06-01 00:00:00" AND pay_time <= "2020-07-03 12:59:59"GROUP BYpay_idHAVING count(pay_id) > 1);

方法二:与子查询进行join关联,这种写法相当于上面的IN子查询写法,下面测试发现,效率确实有不少的提高

注:join自查的执行计划,外层(tpp1别名的查询)是用到pay_id上的索引的。

SELECT tpp1.* FROMtest_table2 tpp1,

(SELECTpay_idFROMtest_table2WHERE pay_time>="2019-07-01 00:00:00"AND pay_time<="2020-07-03 12:59:59"GROUP BYpay_idHAVING count(pay_id) > 1) tpp2WHERE tpp1.pay_id=tpp2.pay_id;

方法三:加一个使用临时表的情况,虽然比不少join方式查询的,但是也比直接使用IN子查询效率要高,这种情况下,也是可以使用到索引的,不过这种简单的情况,是没有必要使用临时表的。

DROP TABLE IF EXISTSt_pay_id;CREATE TEMPORARY TABLE t_pay_id(pay_id INT);INSERT INTOt_pay_idSELECT pay_id FROMtest_table2WHERE pay_time>="2019-07-01 00:00:00" AND pay_time<="2020-07-03 12:59:59"GROUP BYpay_idHAVING count(pay_id) > 1;SELECT * FROMtest_table2WHERE pay_id IN (SELECT pay_id FROM t_pay_id);

mysql子查询为什么不走索引_解决MySQL中IN子查询会导致无法使用索引问题相关推荐

  1. mysql查询字段纯字母_解决MySQL之中一个字段中无法精准的查询多语言语言字母的问题...

    解决MySQL之中一个字段中无法精准的查询多语言语言字母的问题 解决MySQL之中一个字段中无法精准的查询多语言语言字母的问题 目录 1.使用场景 2.实现过程及展示结果 2.1.修改字段排序规则为u ...

  2. 装mysql最后一步没响应_解决MySQL安装到最后一步未响应的三种方法

    这种情况一般是你以前安装过MySQL数据库服务项被占用了. 解决方法: 方法一:安装MySQL的时候在这一步时它默认的服务名是"MySQL" 只需要把这个名字改了就可以了.可以把默 ...

  3. mysql整型无符号 大小_解决mysql无符号整型自减运算时溢出的问题

    溢出通常是指的数字类型的一个溢出问题了,对于这个问题小编整理了一篇关于解决mysql无符号整型自减运算时溢出的问题的教程,希望对各位同学会有所帮助. 在mysql中给一个无符号整型字段做自减运算时,如 ...

  4. mysql命令行不支持中文_解决MySQL命令行不支持中文的问题

    MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以UTF-8为例来说明 需要注意的是,要修改的地方非常多,相应的修改方法也很多.下面是一种最简单最彻底的方法: ...

  5. mysql in 排序 无数据混乱_解决 mysql in 查询排序问题

    Bad Request - Request Too Long Bad Request - Request Too Long HTTP Error 400. The size of the reques ...

  6. mysql统计出每个姓氏的人数_基于SQL中的数据查询语句汇总

    where条件表达式 --统计函数 Select count(1) from student; --like模糊查询 --统计班上姓张的人数 select count(*) from student ...

  7. mysql开通远程连接不上去_解决MySQL远程连接不上的问题

    其实这个问题对于熟手来说根本就不是什么问题,远程连接不上mysql 只需要下面123就可以搞定了: 1. 首先要排查网络问题和防火墙的问题 这个是必须的, 你要是连mysql的服务器都连不上, 那还访 ...

  8. es java 删除索引_使用java中的elasticSearch 2.3.3按索引名称和类型删除索引

    我在java中有一个项目,我使用弹性搜索2.3.3索引数据.索引有两种类型. 我的索引文档看起来像: { "took": 10,"timed_out": fal ...

  9. 查询没有走索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!...

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

最新文章

  1. 又一个放弃P10千万年薪出走阿里的CTO!
  2. 推理集 —— 物质与成分及性质的研究
  3. python 中 try、except、finally的用法(异常处理)
  4. java相册_精致小巧的java相册制作方法
  5. 机器学习高级篇:解密微信视频号推荐机制
  6. 基于Django的博客系统
  7. ansys流固耦合分析与工程实例_ansys workbench 流固耦合教程
  8. WordPress 5.0禁用古滕堡编辑器的方法
  9. 候选公示!高工智能汽车金球奖第二批入围年度产品/方案亮相
  10. CE教程第九关——处理共用代码
  11. matlab评价模型和预测模型
  12. 面试官问:你在项目中做过哪些安全防范措施?
  13. 党团学系统前后端接口文档
  14. php获取buttonid,asp获取当前id
  15. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标
  16. JDK的下载、安装、环境配置教程(2021年,win10、win11都可)
  17. vue项目中如何设置ico图标
  18. 苹果联通 VoLTE 来了!
  19. Python简单写接口
  20. Indy:Connection Closed Gracefully

热门文章

  1. php 无法输出图像,ThinkPHP里无法输出图片 设置响应头
  2. sybase数据库导出mysql_sybase导出数据库的表结构命令
  3. 在html中引用css样式表,怎么引用css样式?
  4. 算法设计与分析 2 二维递推间接递推递归分析
  5. FPGA逻辑设计回顾(6)多比特信号的CDC处理方式之异步FIFO
  6. 前端学习笔记(五)-JavaScript语法基本概念
  7. js获取验证码倒计时效果
  8. Visual Studio 2017 15.8概览
  9. sql根据年月日查询注册数或者和值
  10. DotNet并行计算的使用误区(二)