2010-06-16 38 views
1

我知道這裏有類似的線程,但這是我第一次意識到查詢速度可能會影響我 - 所以對於我來說,真正實現從其他的傳輸並不那麼容易人們的問題。提高MySQL中JOIN的速度

這就是說,我已經用較小的數據成功地使用了下面的查詢,但如果我用它在輕度大表(大約120,000條記錄)上。我在等待幾個小時。

INSERT INTO anothertable 
    (id,someint1,someint1,somevarchar1,somevarchar1) 
    SELECT DISTINCT md.id,md.someint1,md.someint1,md.somevarchar1,pd.somevarchar1 
    FROM table1 AS md 
    JOIN table2 AS pd 
    ON (md.id = pd.id); 

表1和表2包含約120,000條記錄。該查詢已運行近2個小時。這是正常的嗎?我只需要等待。我真的不知道,但我非常肯定,可以做得更好,因爲這是我第一次嘗試。

我讀了索引,但不知道在我的情況下索引什麼?

感謝您的任何建議 - 隨時指向我的初學者指南!

回答

1

假設id是一個自動增量PK,DISTINCT是無用的,因爲每一行都是唯一的。在這種情況下,刪除它也應該提高性能,因爲SELECT DISTINCT可能非常慢。

如前所述,請確保id字段在兩個表上都有索引(如果是PK,它的確會有索引)。

+0

抱歉不提這個事實。 Id不是一個auto_increment PK id,這些表確實有一些auto_increment id PK,但這裏沒有用到,因爲我不能使用這兩個數據匹配數據。 – 2010-06-16 09:41:32

1

索引你加入的東西。在這種情況下,請在table1.id和table2.id上創建索引。您應該也可以從一個表到另一個表中有一個外鍵,但沒有有意義的名稱,很難就方向提出建議。

0

唯一認爲你可以索引,也許你得到一些速度是聯接(md.id和pd.id)的關鍵。由於它們很可能是主鍵,它們應該已經被索引。也許聚集索引會帶來一些東西。

DISTINCT是否真的有必要?它只是刪除重複項,並且只有在源表中存在重複的項時纔可能。我認爲DISTINCT是這裏最大的問題。

+0

thx。此處需要DISTINCT,因爲我所做的是彙總數據。 table1包含來自不同時間點的觀測值,而table2包含一些觀測元數據 。 「anothertable」是彙總信息的表格,所以每個人只需要一次,這就是我使用DISTINCT的原因。 – 2010-06-16 09:48:59