今天和大家看下关于in索引的问题.
我本地是5.7版本

这是我的数据结构和表定义
CREATE TABLE test (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
name varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
display_name varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (id),
KEY keyname (display_name),
KEY name (name(4))
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

现在有一个需求,统计id小于并且name出现超过2次的数据.
1.使用in
select id,name from test as test1 where id in(
select id from test where id<10 group by name having count(id)>2
)
外层表没有用到索引.

2.使用join,外层表使用到了索引

mysql 子查询直接使用直接值也是走索引的

之前有见网上说or语句在innodb下不走索引是在含5.5版本之下,5.7中是可以的.

关联子查询
select * from film where file_id in (select film_id from film_actor where actor_id=1);
一般会认为mysql会先执行子查询返回所有包含actor_id为1的film_id.我们会认为上面的查询会这样执行:--select group_concat(film_id) from film_actor where actor_id=1--result: 1,23,25
很不幸,mysql不是这样做的.mysql会将相关的外层表压到子查询,它认为这样可以更高效地查找到数据行.也就是说,mysql会将查询改写成下面的样子:
select * from film where exists(select * from film_actor where actor_id=1and film_actor.film_id=film.film_id
)
这时,子查询需要根据film_id来关联外表film,因为需要film_id字段,所以mysql认为无法先执行这个子查询.通过explain可以看到子查询是一个相关子查询(dependent subquery)
mysql先选择对film进行全表扫描,然后根据返回的film_id逐个执行子查询,这个查询性能会非常糟糕.
改写:
select film.* from film inner join film_actor using(film_id) where actor_id=1;

这个是之前in查询的执行,查询优化器5.6版本以后,以更高的效率完成,我本地5.7没有出现in的这个相关子查询. 大家有兴趣可以尝试切换mysql版本来运行此类sql.

欢迎修正补充.

mysql关于in子查询索引相关推荐

  1. MySQL入门 (九) : 子查询 Subquery

    1 一个叙述中的查询叙述 子查询(subquery)是一种很常见的应用,不论是查询.新增.修改或删除都有可能出现. 子查询是一个放在左右刮号中的「SELECT」叙述,而这个查询叙述会放在另一个SQL叙 ...

  2. mysql update from 子查询

    2019独角兽企业重金招聘Python工程师标准>>> mysql update from 子查询 mssql 子查询更新 update log set uin= b.uin fro ...

  3. any在mysql语句中用法,MySQL中,子查询中可以使用运算符ANY,它表示的意思是______。...

    MySQL中,子查询中可以使用运算符ANY,它表示的意思是______. 答:至少一个值满足条件 According to your textbook, the main purpose of a s ...

  4. mysql左连接代码,mysql多表子查询与左连接的代码

    摘要 腾兴网为您分享:mysql多表子查询与左连接的代码,字体配置,邮币在线,英语字典,携程抢票等软件知识,以及cad弱电,adobe全套2018,万能格式转换器,360dns优选,音频制作app,上 ...

  5. MySQL中嵌套子查询删除出错解决方案

    MySQL中嵌套子查询做删除操作会出错,例如下面的SQL: delete from table1 where number in (select number from table2) 执行提示: Y ...

  6. mysql嵌套子查询索引_SQL 子查询,索引优化

    场景 索引优化 单列索引 多列索引 索引覆盖 排序 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KE ...

  7. 三天学会MySQL(八)子查询 索引

    目录 一.子查询介绍 二.单行子查询 三.多行子查询 四.子查询练习 五.索引介绍 六.普通索引 七.唯一索引 八.主键索引 九.组合索引 一.子查询介绍 用子查询解决问题 假如要写一个查询来找出挣钱 ...

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

    测试表如下: CREATE TABLE`test_table` ( `id`int(11) NOT NULLAUTO_INCREMENT, `pay_id`int(11) DEFAULT NULL, ...

  9. mysql 子查询索引失效_mysql 索引失效的情况

    索引失效的几种情况 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用 ...

最新文章

  1. 同是程序员,不小心发现优点在于工作上10来年都保持【积极主动】的心态
  2. Django 在test.py 中测试文件的配置
  3. 基于按annotation的hibernate主键生成策略
  4. 从零开始入门 K8s | 应用编排与管理:Job DaemonSet
  5. 查询英文缩写形式(缩写词)的网站工具梳理
  6. vue todolist
  7. oracle sql 转小写转大写,OracleSQL金额小写转大写函数
  8. cvpr 注意力机制_视频人员重识别:关系引导空间注意力 + 时间特征提取模型
  9. java redirect 超时_会话超时后,Spring安全性不会重定向到上次请求的页面登录
  10. 小程序的购物商城源码(前端+后端)
  11. 绿盟扫漏出现的Web常规漏洞
  12. html站点文件命名规范,HTML制作中的文件夹及文件命名规范(二)
  13. python 判断数字是奇数还是偶数
  14. GCC编译过程及使用
  15. 操作系统中的故障恢复控制台意义非凡
  16. 一家计算机专卖店A型计算器,A型计算器谱子 | 手游网游页游攻略大全
  17. android动态扩容数组,ArrayList 扩容 Android Java 真的不一样
  18. jquery前端简单分页_如何使用jQuery创建简单的分页
  19. 【名企秋招】360公司2017年秋季校招开始喽~ 立即报名
  20. 键盘录入长方形的长和宽,定义方法计算该长方形的周长,并在main方法中打印周长

热门文章

  1. vivo 服务端监控体系建设实践
  2. labVIEW cmd执行多行命令 Python
  3. 快捷方式‘*.lnk’指向的驱动器或网络连接不可用,笔记本读不到机械硬盘
  4. 西工大c语言大作业题目,西工大c语言大作业.ppt
  5. 深划痕需要大面积补漆吗_什么程度的划痕才需补漆? 小心亏大了!
  6. dsx-600ch怎么操作测试光纤损耗
  7. 我为虎嗅设计APP(一)-逻辑梳理
  8. S32K144学习笔记:23 看门狗
  9. 燃料电池压缩机系统学习
  10. 一个7年老员工的离职总结:如何打造一个最强大的“自我”(转载)