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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM