1. 程式人生 > >MYSQL中IN與EXISTS的區別

MYSQL中IN與EXISTS的區別

目錄

3、結論:

在MYSQL的連表查詢中,最好是遵循‘小表驅動大表的原則

一、IN與EXISTS的區別

1、IN查詢分析

SELECT   *  FROM A WHERE id IN (SELECT id FROM B);

等價於:1、SELECT id FROM B ----->先執行in中的查詢

              2、SELECT *  FROM A  WHERE A.id = B.id

以上in()中的查詢只執行一次,它查詢出B中的所有的id並快取起來,然後檢查A表中查詢出的id在快取中是否存在,如果存在則將A的查詢資料加入到結果集中,直到遍歷完A表中所有的結果集為止。

以下用遍歷結果集的方式來分析IN查詢

通過以上程式可以看出,當B表的資料較大時不適合使用in()查詢,因為它會將B表中的資料全部遍歷一次

例如:

1、A表中有100條記錄,B表中有1000條記錄,那麼最多可能遍歷100*1000次,效率很差

2、A表中有1000條記錄,B表中有100條記錄,那麼最多可遍歷1000*100此,內迴圈次數減少,效率大大提升

結論:IN()查詢適合B表資料比A表資料小的情況,IN()查詢是從快取中取資料

2、EXISTS查詢分析

語法:SELECT  欄位 FROM  table WHERE EXISTS(subquery);

SELECT * FROM a WHERE EXISTS(SELECT 1 FROM b WHERE B.id  = A.id);

以上查詢等價於:

1、SELECT * FROM A;

2、SELECT I FROM B WHERE B.id = A.id;

EXISTS()查詢會執行SELECT * FROM A查詢,執行A.length次,並不會將EXISTS()查詢結果結果進行快取,因為EXISTS()查詢返回一個布林值true或flase,它只在乎EXISTS()的查詢中是否有記錄,與具體的結果集無關。

EXISTS()查詢是將主查詢的結果集放到子查詢中做驗證,根據驗證結果是true或false來決定主查詢資料結果是否得以儲存。

以下用遍歷結果集的方式來分析EXISTS查詢

從以上程式可以看出:

當B表的資料比A表的資料大時適合使用EXISTS()查詢,因為它不用遍歷B操作,只執行一次查詢就OK了

例如:

1、A表有100條記錄,B表有1000條記錄,那麼EXISTS()會執行100次去判斷A表中的id是否與B表中的id相等.因為它只執行A.length次,可見B表資料越多,越適合EXISTS()發揮效果.

2、A表有10000條記錄,B表有100條記錄,那麼EXISTS()還是執行10000次,此時不如使用in()遍歷10000*100次,因為IN()是在記憶體裡遍歷資料進行比較,而EXISTS()需要查詢資料庫,我們都知道查詢資料庫所消耗的效能更高,而記憶體比較很快.

3、結論:

exists()適合B表比A表資料大的情況

當A表資料與B表資料一樣大時,in與exists效率差不多,可任選一個使用

相關推薦

MYSQLINEXISTS區別

目錄 3、結論: 在MYSQL的連表查詢中,最好是遵循‘小表驅動大表的原則’ 一、IN與EXISTS的區別 1、IN查詢分析 SELECT   *  FROM A WHERE id IN (SELECT id FROM B); 等價於:1、SELECT

mysqlinexists效率比較

這條語句適用於a表比b表大的情況 select * from ecs_goods a where cat_id in(select cat_id from ecs_category); 這條語句適用於b表比a表大的情況select * from ecs_goods

mysqlinexists的效能效率對比

有一種說法,說exists效能比in要好,其實不全然。哪個效能更好,需要看具體的需求場景。1、如何選擇使用in 或者 exists?1)子表資料量比外表資料量少,使用in。2)子表資料量比外表資料量大

面試被問之-----sql優化inexists區別 Mysql in or exists not exists not in區別 (網路整理) Sql語句INexists區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

mysql inexists區別

有兩張表:student 和 studentcource student 表 studentcource 表 需求:查詢所有成績小宇60分的同學 in 原理: 1、先查詢 <60 學生得到student_id列表 select student_id

Mysql in or exists not exists not in區別 (網路整理)

in 和or區別:https://www.cnblogs.com/rainwang/p/4389282.html 如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執行計劃和執行時間都幾乎一樣。 如果in和or所在列沒有 索引的話,效能差別就很大了。在沒有索引的情況下,隨著in或者or後面

ORACLE inexists語句的區別(一)

select * from A where id in(select id from B) 以上查詢使用了in語句,in()只執行一次,它查出B表中的所有id欄位並快取起來.之後,檢查A表的id是否與B表中的id相等,如果相等則將A表的記錄加入結果集中,直到遍歷完A表的所有

in exists區別

相同 子查詢 exists zha tex 結果 sele ext zhang in和existsin 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子

MySQLMyISAMInnoDB區別及選擇,mysql添加外鍵

title 必須 pan 就會 默認 簡化 平臺 兩種 myisam InnoDB:支持事務處理等不加鎖讀取支持外鍵支持行鎖不支持FULLTEXT類型的索引不保存表的具體行數,掃描表來計算有多少行DELETE 表時,是一行一行的刪除InnoDB 把數據和索引存放在表空間裏面

MySQLMyISAMInnoDB區別及選擇

重建 包含 好的 數據 mysql 備份 處理 表空間 種類 InnoDB:支持事務處理等不加鎖讀取支持外鍵支持行鎖不支持FULLTEXT類型的索引不保存表的具體行數,掃描表來計算有多少行DELETE 表時,是一行一行的刪除InnoDB 把數據和索引存放在表空間裏面跨平臺可

MySQLMyISAMInnoDB區別

原文:https://blog.csdn.net/frycn/article/details/70158313?utm_source=copy  InnoDB:支援事務處理等不加鎖讀取支援外來鍵支援行鎖不支援FULLTEXT型別的索引不儲存表的具體行數,掃描表來計算有多少行DELETE 表時,是一

MySQLvarcharchar區別

MySQL中varchar最大長度是多少? 一. varchar儲存規則: 4.0版本以下,varchar(20),指的是20位元組,如果存放UTF8漢字時,只能存6個(每個漢字3位元組)  5.0版本以上,varchar(20),指的是20字元,無論存放的是數字、字母還是UTF8

mysqlnull‘’的區別

Mysql中空字元<''>和空值的區別,一直都知道mysql中空字串(”)和空值(null)之間有區別,但是沒好好研究過。直到專案上,這兩個概念被我搞混了之後才想起來研究一下。 根據網上的說法,空字串(”)是不佔用空間,而空值(null)是佔用空間。(這裡我不太明

MysqlInnodbMysiam區別

1).InnoDB不支援FULLTEXT型別的索引。 2).InnoDB 中不儲存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出儲存好的行數即可。注意的是,當co

MySQLin和=的區別

今天碰到一個關於資料庫查詢的效能問題,平常加一句索引也就過去了,今天多說兩句。 前置條件:MySQL資料庫,uid是主鍵,login_name未建任何索引, T_USER表中資料有8451條; 分別執行下列兩句SQL 1)  SELECT * FROM T_USER WHERE uid IN (SELECT

ORACLE INEXISTS區別

http://trailblizer.blog.163.com/blog/static/59630364201024101539938/ in 是把外表和內表作hash join,而exists是對外表作loop,每次loop再對內表進行查詢。 一直以來認為exi

MySQLMyISAMInnoDB區別、選擇及轉換

區別: InnoDB: 支援事務處理等 不加鎖讀取 支援外來鍵 支援行鎖 支援全文搜尋(5.5以後版本) 不支援FULLTEXT型別的索引 不儲存表的具體行數,掃描表來計算有多少行 DELETE 表時,是一行一行的刪除 InnoDB 把資料和索引存放在表空間裡面 跨平臺可直

SQL查詢inexists、not in、not exists的用法區別

1、in和exists in是把外表和內表作hash(字典集合)連線,而exists是對外表作迴圈,每次迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的,如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中一個較小一

Sql語句INexists區別及應用

應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn   表展示     首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下:     user表:          order表:        in     確定給定的值是否與子查

ORACLE inexists語句的區別(一)

表數 內存 全部 sel 一個 性能 where 情況 lec (轉載:https://www.cnblogs.com/iceword/archive/2011/02/15/1955337.html) select * from Awhere id in(select id