2012-06-12 142 views
2

我正在運行我認爲是相當直接的更新在一個相當大的表上。我試圖找出爲什麼這個簡單的更新運行得如此之慢。花了大約5個小時才完成。這個簡單的更新爲什麼這麼慢運行?

master表:約2米行和90場。 builder表:約1.5米行和15個字段

我最初曾嘗試直接插入:

-- Update master table with newly calculated mcap 
update master as m 
inner join 
    (select b.date_base, b.gvkey, sum(b.sec_cap) as sum_sec_mkt 
    from builder as b 
    group by b.gvkey, b.date_base) as x 
on x.gvkey = m.gvkey AND 
    x.date_base = m.date_base 
set m.mcap = x.sum_sec_mkt; 

可惜這跑了數個小時,等待4小時後,我終於把它打死了。 然後我想我會創建一個臨時表並將最初選擇的結果插入到它中。

CREATE TABLE `temp_mkt_cap` (
    `date_base` date NOT NULL, 
    `gvkey` varchar(15) DEFAULT NULL, 
    `mkt_cap` double DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

-- insert market cap values in to temporary table 
insert into temp_mkt_cap 
select b.date_base, b.gvkey, sum(b.sec_cap) as sum_sec_mkt 
from builder as b 
group by b.gvkey, b.date_base; 

ALTER TABLE temp_mkt_cap 
add primary key (date_base, gvkey); 

插入工作正常與temp_mkt_cap有1.4m左右行,但最終更新了5個小時才能完成。

-- Update master table with newly calculated mcap 
update master as m 
inner join temp_mkt_cap as mc 
on m.date_base = mc.date_base AND m.gvkey = mc.gvkey 
set m.mcap = mc.mkt_cap; 

'主' 具有 'date_base' 和gvkey_iid作爲PRIMARY KEYS和gvkey作爲KEY。 我已經在表格上完成了更復雜的插入和更新,並且無法解決爲什麼這不起作用。

任何幫助將不勝感激。 謝謝,

更新:在主表的鍵是:

ALTER TABLE master 
    ADD PRIMARY KEY (gvkey_iid,date_base), 
    ADD KEY date_offset (date_offset), 
    ADD KEY gvkey (gvkey), 
    ADD KEY iid (iid); 

更新我添加了一個新的密鑰對主表和更新跑93.6secs,5個小時下來。感謝大家的幫助。

ALTER TABLE master 
    ADD KEY 'date-gvkey' (date_base, gvkey); 
+0

什麼都在'temp_mkt_cap'的鑰匙? – Sebas

+0

@Sebas - 插入後我添加date_base和gvkey作爲主鍵 –

+0

你需要date_offset,gvkey和iid上的這些單個鍵嗎?如果我遵循你的問題,你只需要你的主鍵。相同的temp_mkt_cap! – Sebas

回答

1

既然你是在mc.date_base AND m.gvkey = mc.gvkey加盟,你需要以相同的順序,這些字段的索引要加入他們,這兩個表。

如果您要加入table1與表2 on table1.field1 = table2.field1 AND table1.field2 = table2.field2,則需要(table1.field1, table1.field2)(table2.field1, table2.field2)上的索引。

Not null字段是優選的。

此外,因爲您正在從mc.mkt_cap字段進行更新,所以如果該字段不是您之前創建的組合鍵的第一個字段,則需要在該字段上使用SINGLE鍵。

所有其他鍵或索引都可能會降低查詢速度。

請仔細檢查你的數據庫...

+0

所以,儘管date_base是主鍵的一部分,gvkey是主表中的一個鍵,我需要創建一個包含兩個字段的新鍵?或者最好將它們分成單獨的密鑰。我假設temp_mkt_cap沒問題,因爲date_base和gvkey都是主鍵?對不起,我對MySQL很新。我會去做更多關於鑰匙的閱讀。謝謝你的幫助。 –

+0

如果您在連接中一起使用字段,那麼是的,可能會以相同順序在相同字段上添加索引,並將它們設置爲非空,這會增加(最大幅度地)表現。 – Sebas

+0

沒有,個別鍵是不夠的 – Sebas