2012-04-05 91 views
0

我試過解決方案here,但它不起作用。選擇哪裏在(子查詢)慢

我的表是這樣的:

`Index` uid dept 
........................... 
     1 001 dept1 
     2 001 dept2 
     3 001 dept3 
     4 002 dept2 
     5 002 dept3 
     6 002 dept4 
     7 003 dept1 
     8 003 dept5 
     9 004 dept1 
     10 004 dept6 

我想檢索所有與特定dept行。也就是說,如果我想檢索dept1,我想檢索除uid = 002之外的所有行,因爲對於uid = 002沒有dept1

SELECT id FROM table WHERE uid IN 
(SELECT uid WHERE dept='dept1') 

我以前的版本,而無需使用WHERE IN是如下:使用索引,即使

查詢字符串很慢

首先檢索所有與部門= DEPT1的UID。
然後對第一個查詢中檢索到的所有uid使用for-loop。

該方法對於第一個查詢中檢索到的少量(100)行非常快。然而,它似乎並不是一個好的解決方案,因爲它會產生很多查詢(它們中的每一個都非常快)。

+0

感謝編輯。 – benck 2012-04-05 16:46:40

+0

This is similar with this http://stackoverflow.com/questions/6135376/mysql-select-where-field-in-subquery-extremely-slow-why – 2014-09-25 03:59:19

回答

8

試試這個:

select a.id from Table1 a 
inner join Table1 b on a.uid = b.uid and b.dept = 'dept1'; 

演示:http://sqlfiddle.com/#!2/05774/4

+0

[什麼時候是'IN(SELECT ...)'performance有待改進?](http://datacharmer.blogspot.com/2008/09/drizzling-mysql.html) – 2012-04-05 06:14:19

+1

好消息:[MariaDB 5.3](http://kb.askmonty.org/en/what- is-mariadb-53)已經是一個穩定的版本。和MySQL 5.6(不穩定,但很快我認爲)將有這些或類似的改進。 – 2012-04-05 06:16:48

+0

感謝您的鏈接:) – 2012-04-05 06:37:27