2

我正在一个相当大的桌子上运行我认为是相当直接的更新。我试图找出为什么这个简单的更新运行如此缓慢。大约花了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);
4

1 回答 1

1

由于您要加入mc.date_base AND m.gvkey = mc.gvkey,因此您需要在两个表上按照加入它们的相同顺序对这些字段进行索引。

如果要将 table1 与 table2 连接,则需要ANDon table1.field1 = table2.field1 AND table1.field2 = table2.field2上的索引。(table1.field1, table1.field2)(table2.field1, table2.field2)

Not null领域是优选的。

此外,由于您是从该字段进行更新,因此mc.mkt_cap如果该字段还不是您之前创建的复合键的第一个字段,则需要在该字段上添加一个 SINGLE 键。

所有其他键或索引都可能会减慢您的查询速度。

请仔细检查您的数据库...

于 2012-06-12T18:00:05.240 回答