首页 > 技术文章 > 【MySQL】IN的执行与优化

wsx2019 2021-12-08 23:17 原文

【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'))

推荐阅读