我正在一个相当大的桌子上运行我认为是相当直接的更新。我试图找出为什么这个简单的更新运行如此缓慢。大约花了5个小时才完成。
master
表:大约 2m 行和 90 个字段。
builder
表:大约 150 万行和 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
大约有 140 万行,但最终更新需要 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_iidPRIMARY 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);