2013-04-09 37 views
13

我有臺這樣的2個不同的小的查詢VS 1項的查詢與子查詢

name  | personal_number 
----------------------------------------- 
Jon  | 222 
Alex  | 555 
Jon  | 222 
Jimmy  | 999 

我需要讓每一個名字,這personal_number表超過1 repeates,那就是結果一定是:

Jon   
Jon   

所以,變體1):

SELECT name FROM mytable WHERE personal_number IN (
     SELECT personal_number FROM mytable GROUP BY personal_number 
     HAVING COUNT(*) > 1 
) 

變體2):

SELECT personal_number FROM mytable GROUP BY personal_number 
     HAVING COUNT(*) > 1 
) 

然後,使用PHP,檢索personal_numbers加入爲字符串(soemthing這樣'222', '222'),並運行其他查詢

SELECT name FROM mytable WHERE personal_number IN(here joined string) 

變2項工程大約快10倍,比變種1,這是驚喜對我來說,我在想,一個查詢會更快,但是......

(在表500個000行,列personal_number沒有索引)

所以,你的意思是這樣的情況嗎?爲什麼變體2比變體1快多了?

+2

+1的好問題並且在運行一些基準測試之前不要求。 – enenen 2013-04-09 10:22:42

+2

解釋這兩個查詢應該顯示它 – 2013-04-09 10:34:59

+0

如果名稱和個人編號相互依賴,則應該將您的表格移至第二個標準格式 – Argeman 2013-04-09 10:40:51

回答

0

這應該是更快:

SELECT name FROM mytable join (
     SELECT personal_number FROM mytable GROUP BY personal_number 
     HAVING COUNT(*) > 1 
)a using (personel_number) 

編輯:如果這是比變體1快,那麼就意味着在變體1個MySQL的一次又一次再現每個記錄的內部表。

+2

這不能解釋性能差異。 – Bart 2013-04-09 10:29:49

+0

@禁止,它不。 – palindrom 2013-04-09 10:30:38

0

由於索引編制沒有完成,因此1很慢,因爲它必須匹配來自所選個人編號的個人編號。如果建立索引,它會比以前消耗更少的時間。 變體2是一個直接查詢,因此它的速度更快。

1

第一個查詢具有沉重的子查詢。你必須避免這一點。 有關問題的最佳解決方案是隻有一個查詢:

SELECT name FROM mytable GROUP BY personal_number HAVING COUNT(*) > 1; 

這個查詢將返回你每次重複的名字只有一次。如果你想顯示重複多次的名字,因爲他們遇到了你必須使用一個查詢:

SELECT name, COUNT(*) AS count FROM mytable GROUP BY personal_number HAVING COUNT(*) > 1; 

然後在PHP做這樣的事情:

foreach ($rows as $row) { 
    for ($i = 0; $i++; $i < $row['count']) { 
    echo $row['name'] . "\n"; 
    } 
}