【MySQL】IN的执行与优化
【MySQL】IN的执行与优化
1、OR与IN对比
引用《高性能MySQL》第三版:
在很多数据库系统中,IN( )完成等同于多个OR条件的子句,因为这两者时完全等价的。在MySQL中这点是不成立的,MySQL将IN( )列表中的数据先进行排序,然后通过二分查找的方式来确定列表中的值是否满足条件,这是一个O(log n)复杂度的操作,等价地转换OR查询的复杂度为O(n),对于IN( )列表中有大量取值的时候,MySQL的处理速度将会更快。
结论(MySQL)
- IN查询结果是有序的,OR不是
- 查询速度 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'))
好学若饥,谦卑若愚
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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命令