【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'))
好学若饥,谦卑若愚