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