2013-02-28 96 views
0

我有這個簡單的連接,但工作很好,但可怕的慢,我認爲,因爲科技表是非常大的。有很多uid的實例,因爲它跟蹤uid的時間戳,因此是獨特的。提高查詢速度的最佳方法是什麼?改進JOIN查詢速度

SELECT DISTINCT tech.uid, 
       listing.empno, 
       listing.firstname, 
       listing.lastname 
FROM tech, 
     listing 
WHERE tech.uid = listing.empno 
ORDER BY listing.empno ASC 
+1

請,向我們展示了'EXPLAIN'和你的表結構。這就像引入檢查引擎燈的汽車,而不是讀取診斷信息。使用明確的'JOIN'語法也是更好的和*標準的*練習 – Kermit 2013-02-28 20:45:43

+0

您是否研究過使用任何索引? – 2013-02-28 20:48:15

+3

起初 - 如果沒有索引,您可以在tech.uid和listing.empno上添加索引。 – Kamil 2013-02-28 20:50:20

回答

4

首先對它們各自的表添加一個索引來tech.UID和listing.EmpNo。 後你肯定有索引,你可以嘗試重新寫你的查詢是這樣的:

SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName 
FROM listing INNER JOIN tech ON tech.uid = listing.EmpNo 
ORDER BY listing.EmpNo ASC; 

如果它仍然不夠快,把查詢之前的字EXPLAIN,以獲取有關的執行計劃的一些提示查詢。

EXPLAIN SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName 
    FROM listing INNER JOIN tech ON tech.uid = listing.EmpNo 
    ORDER BY listing.EmpNo ASC; 

張貼解釋結果,以便我們可以得到更好的見解。

希望它能幫助,

+0

完美,我已經根據說明添加了索引,並且您的回答很快就會吸菸。感謝解釋提示,我將在未來使用它。 – 2013-02-28 20:59:50

1
  1. 這是非常簡單的查詢。只有你可以在SQL中執行 - 如果沒有索引,則可以在JOIN/WHERE和ORDER BY子句(tech.uid,listing.empno)中使用的字段上添加索引

  2. 如果有JOIN字段值爲NULL值 - 他們可能會毀了你的表現。您應該在WHERE條款(WHERE tech.uid is not null and listing.empno not null)中過濾它們。如果在NULL字段上有JOIN的許多行 - 該數據可能會產生笛卡爾的結果(不確定這是如何在英語中稱爲),可能包含大量的行。

  3. 您可能會更改MySQL配置。有對性能調節的許多選項,如key_buffer_size的,sort_buffer_size的值,tmp_table_size的,max_heap_table_size,read_buffer_size等

+0

回覆:你的#2。你是說使用顯式內連接可以產生比隱式連接更快的性能? – 2013-02-28 21:03:57

+0

@ PM77-1也許你是對的。我通過回答糾正並添加了另一個提示。 – Kamil 2013-02-28 21:14:01