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_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);
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 に答える