【MySQL】IN的执行与优化

【MySQL】IN的执行与优化


1、OR与IN对比

引用《高性能MySQL》第三版:

在很多数据库系统中,IN( )完成等同于多个OR条件的子句,因为这两者时完全等价的。在MySQL中这点是不成立的,MySQL将IN( )列表中的数据先进行排序,然后通过二分查找的方式来确定列表中的值是否满足条件,这是一个O(log n)复杂度的操作,等价地转换OR查询的复杂度为O(n),对于IN( )列表中有大量取值的时候,MySQL的处理速度将会更快。

结论(MySQL)

  1. IN查询结果是有序的,OR不是
  2. 查询速度 IN >= OR,子句数据越多。

2、IN 子查询

在MySQL 5.6 之前的版本,建议使用关联查询代替IN子查询。目前在MySQL 8.0.25中测试,发现查询优化器,将IN子查询优化JOIN语句

select SQL_NO_CACHE id,user_id from A  where USER_ID in (
select USER_ID from user where csrq > '2021-10-28');

/* select#1 */ select `test`.`A`.`ID` AS `id`,`test`.`A`.`ORG_ID` AS `ORG_ID`,`test`.`A`.`USER_ID` AS `user_id` from `test`.`user` join `test`.`A` where ((`test`.`A`.`USER_ID` = `test`.`user`.`USER_ID`) and (`test`.`user`.`csrq` > TIMESTAMP'2021-11-28 00:00:00'))

备注:通过 show warnings;查看查询优化器优化后的SQL。

3、MySQL IN 支持查询匹配多个字段

SELECT * FROM A WHERE (A.A1,A.A2) IN (('1','2'),('1','3'))
posted @   二月无雨  阅读(3034)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2018-12-08 【centos】CentOS6.8设置开机直接进入命令行模式(转)
2018-12-08 【Http】HTTP状态码介绍
2018-12-08 【Linux】Centos7 防火墙命令
2018-12-08 【nginx】Nginx命令
点击右上角即可分享
微信分享提示