我正在运行我认为在相当大的表上进行相当简单的更新。我试图找出为什么这个简单的更新运行如此缓慢。大约需要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.4米,但最后更新需要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;
'master'的'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.6秒内运行,从5小时开始。感谢大家的帮助。
ALTER TABLE master
ADD KEY 'date-gvkey' (date_base, gvkey);
答案 0 :(得分:1)
由于您正在加入mc.date_base AND m.gvkey = mc.gvkey
,因此您需要在这两个表上按照与加入它们相同的顺序对这些字段建立索引。
如果您要将table1与table2 on table1.field1 = table2.field1 AND table1.field2 = table2.field2
相关联,则需要(table1.field1, table1.field2)
和(table2.field1, table2.field2)
上的索引。
Not null
字段更可取。
另外,因为您要从mc.mkt_cap
字段进行更新,所以如果该字段不是您之前创建的复合键的第一个字段,则需要在该字段上使用SINGLE键。
所有其他键或索引可能会减慢您的查询速度。
请仔细检查您的数据库...