2013-06-29 69 views
0

我正在使用UPDATE通過將m2與n1匹配,在n2中找到相應的值並將其插入到m3中來填充缺少的值(以m3爲單位)。表mmm有250萬行,而表nnn有55,000行。使用MySQL在大型表上運行更新非常慢

以下兩個查詢都可以工作,但問題在於性能。現在,我正以零碎的方式更新嗯。我已經將nnn減少到第一行10,000行。在這種情況下,這個部分查詢完成了我想在7小時後完成的約18%。這種方法的問題是我必須以這種方式進行10次左右的查找。我知道這是很多計算,但我認爲有更好的方法。

有什麼辦法可以加快這個過程嗎?我很欣賞這些反饋。

查詢#1

UPDATE mmm, nnn 
SET mmm.m3 = nnn.n2 
WHERE mmm.m2 = nnn.n1 

查詢#2

UPDATE mmm a 
    INNER JOIN nnn b 
     ON b.n1 = a.m2 
SET a.m3 = b.n2 
WHERE b.n1 = a.m2 

表MMM(僅組合是唯一的)

m1   m2    m3 
0002-1962  0025117388 
0002-1962  14644418453  
0003-2417  0026708363 

表NNN(n1是唯一的)

n1   n2 
0025117388 1111-2222 
14644418453 1515-2323 
0026708363 1515-2323 

數據庫結構:

CREATE TABLE `mmm` (
    `m1` char(9) NOT NULL DEFAULT '', 
    `m2` varchar(11) NOT NULL DEFAULT '', 
    `m3` char(9) NULL DEFAULT '' 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `nnn` (
    `n1` varchar(11) NOT NULL DEFAULT '', 
    `n2` char(9) NOT NULL DEFAULT '' 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+0

查詢#1 /#2執行後通常會更新多少條記錄? –

回答

4

您可以使用EXPLAIN在查詢前看到MySQL將如何處理執行。如果沒有任何索引,必須對250萬行進行全表掃描以從mmm中選擇。首先指定主鍵,以便mysql可以將它們用作查詢的索引。您可能會發現您還需要在m2列中添加非唯一索引來加速該選擇。

CREATE TABLE `mmm` (
    `m1` varchar(9) NOT NULL DEFAULT '', 
    `m2` varchar(11) NOT NULL DEFAULT '', 
    `m3` varchar(9) NULL DEFAULT '', 
    primary key (m1, m2, m3) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `nnn` (
    `n1` varchar(11) NOT NULL DEFAULT '', 
    `n2` varchar(9) NOT NULL DEFAULT '', 
    primary key (n1) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+0

我做了你所說的一切,它運作得非常棒。 (創建主鍵有幫助,但重要的變化是以m2爲單位創建索引。)我能夠在不到20秒的時間內以nmn的全部50k條記錄更新250萬條記錄!非常感謝。我從來沒有得到這樣有用的建議。 –