2013-03-14 89 views
0

當我用LEFT JOIN運行我的查詢時,它需要20秒。當我將它分成2個查詢時,它會在4秒內運行。但是,如您所想,這使得以特定順序顯示結果變得非常困難。 我最初的查詢有什麼問題,我可以將2合併爲1嗎?MySQL左連接運行速度非常慢,分裂成2個查詢要快得多

Table1有〜400,000行,而表2有〜200,000行。

Field3Table2中的主鍵,並且索引在Table1中。

查詢返回大約100k行。

SELECT Table1.Field1, Table2.Field4 
FROM 
    Table1 
    LEFT JOIN 
     Table2 USING (Field3) 
WHERE Table1.Field1 = 'Example' 

當我按查看的方式運行查詢時,平均需要20秒才能運行。但是如果我運行沒有LEFT JOIN的查詢,並運行第二個查詢來獲取該數據,則所有內容都會在大約4秒內運行。

SELECT Table1.Field1, Table1.Field3 
FROM Table1 
WHERE Table1.Field1 = 'Example' 

//PHP 
$first = true; 
while ($row = mysql_fetch_assoc($query)) 
{ 
    if (!$first) 
    { 
     $field3Values .= ","; 
    } 
    $field3Values .= "'" . mysql_real_escape_string($row['Field3']) . "'"; 
    $first = false; 
} 

//Now run the 2nd query 
SELECT Field4 
FROM People 
WHERE Field3 IN (" . $field3Values . ") 

編輯:根據要求,EXPLAIN第一個查詢: enter image description here

+0

你試過,而不是使用? – 2013-03-14 18:52:39

+0

@raheelshan是的,沒有什麼區別。 – 2013-03-14 18:53:33

+0

table1是否被'Field1'索引? – danihp 2013-03-14 18:59:22

回答

1

約翰和我在聊天想通了這一點。單個查詢很慢,因爲查詢優化器沒有爲Table1選擇一個好的索引。通過將FORCE INDEX (Field1)添加到查詢中,使用Table1.Field1上的索引來篩選結果,而不是執行全表掃描。我們並不完全確定爲什麼這兩種查詢方法運行得更快,但我的猜測是,由於某種原因,查詢優化器在單個查詢的第一個中使用了索引,但在單個查詢中沒有。

相關問題