かなり大きなテーブルで、かなり単純な更新だと思っていたものを実行しています。この単純な更新の実行速度が非常に遅い理由を突き止めようとしています。完了するまでに約 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_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);
更新マスター テーブルに新しいキーを追加したところ、更新は 5 時間から 93.6 秒で実行されました。みんなの助けに感謝します。
ALTER TABLE master
ADD KEY 'date-gvkey' (date_base, gvkey);