select * from user where user.id in (1,2,3,4,5,6,7,8)
mysql對這種語句的執行效率是很高的,他的執行分幾步來實現。
第一步:
將in中的資料排序,
第二步:
將user表中的行中的id用二分法在排序後的序列中查詢,這樣的查詢速度非常高
再來看第二種情況
select * from user where user.id in (select id from user where user.id>0 and user.id <10);
這種情況下,mysql會優化的很差,在高效能mysql的180頁有非常詳細的說明,就是mysql優化這種查詢的時候試圖將外面的查詢和裡面的查詢產生某種關聯。
會優化成
select * from user u1 where exists(select id from user u2 where u2.id>0 and u2.id<10 and u1.id=u2.id );
這樣當然會非常慢
解決辦法是自己寫連線查詢
select * from user u1 inner join user u2 using(id) where u1.id>0 and u1.id<10;
mysql中or和in的效率問題
分三中情況進行測試,分別是 第一種情況 in和or所在列為主鍵的情形。第二種情況 in和or所在列建立有索引的情形。第二種情況 in和or所在列沒有索引的情形。每種情況又採用不同的in和or的數量進行測試。由於測試語句的資料量有4種情況,我這裡就稱為a組 b組 c組 d組,其中a組為3個值,b組為1...
mysql中IN和EXITS效率
mysql中的in語句是把外表和內錶作hash 連線。而exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直大家都覺得exists比in語句的效率要高。這樣的說法事實上是不準確的。這個是要區分環境的。假設查詢的兩個表大小相當,那麼用in和exists區別不大。假設兩個表中乙...
MySql中in和exists效率
詳見 mysql中的in語句是把外表和內錶作hash 連線,而exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直大家都認為exists比in語句的效率要高,這種說法其實是不準確的。這個是要區分環境的。如果查詢的兩個表大小相當,那麼用in和exists差別不大。如果兩個表中...