簡體   English   中英

加快mysql更新查詢

[英]speed up mysql update query

我正在運行我認為可以在相當大(65,000行)數據集上進行財務收益的直接計算。 我已經在較小的數據集上運行了查詢,並且工作正常,但是在較大的數據集上,大約20小時后我終止了查詢。

該查詢將計算約20年月度數據中Universe中500支股票中每支股票的3、6、12、18和24個月的回報。

UPDATE 
  master_backup AS curr
  LEFT OUTER JOIN
      master AS mo3
      ON 
        ((curr.new_date = LAST_DAY(mo3.new_date - INTERVAL 3 MONTH)) AND (curr.sedol = mo3.sedol))
  LEFT OUTER JOIN 
      master AS mo6
      ON 
        ((curr.new_date = LAST_DAY(mo6.new_date - INTERVAL 6 MONTH)) AND (curr.sedol = mo6.sedol))
  LEFT OUTER JOIN 
      master AS mo12
      ON 
        ((curr.new_date = LAST_DAY(mo12.new_date - INTERVAL 12 MONTH)) AND (curr.sedol = mo12.sedol))
  LEFT OUTER JOIN 
      master AS mo18
      ON 
        ((curr.new_date = LAST_DAY(mo18.new_date - INTERVAL 18 MONTH)) AND (curr.sedol = mo18.sedol))
  LEFT OUTER JOIN 
      master AS mo24  
      ON 
        ((curr.new_date = LAST_DAY(mo24.new_date - INTERVAL 24 MONTH)) AND (curr.sedol = mo24.sedol))
SET 
    curr.ret_3mth = (mo3.price - curr.price)/curr.price,
    curr.ret_6mth = (mo6.price - curr.price)/curr.price,
    curr.ret_12mth = (mo12.price - curr.price)/curr.price,
    curr.ret_18mth = (mo18.price - curr.price)/curr.price,
    curr.ret_24mth = (mo24.price - curr.price)/curr.price;

表“主人”

'master', 'CREATE TABLE `master` (
  `mdate` date NOT NULL,
  `new_date` date DEFAULT NULL,
  `id_connah` varchar(45) DEFAULT NULL,
  `ticker` varchar(45) NOT NULL,
  `pnum` varchar(45) NOT NULL,
  `sedol` varchar(45) NOT NULL,
  `cusip` varchar(45) NOT NULL,
  `price` double DEFAULT NULL,
  `mcap` double DEFAULT NULL,
  `ret` double DEFAULT NULL,
  `ebit` double DEFAULT NULL,
  `debt_st` double DEFAULT NULL,
  `debt_lt` double DEFAULT NULL,
  `cash` double DEFAULT NULL,
  `assets_total` double DEFAULT NULL,
  `assets_intang` double DEFAULT NULL,
  `assets_curr` double DEFAULT NULL,
  `ev` double DEFAULT NULL,
  `ey` double DEFAULT NULL,
  `roce` double DEFAULT NULL,
  `ret_3mth` double DEFAULT NULL,
  `ret_6mth` double DEFAULT NULL,
  `ret_12mth` double DEFAULT NULL,
  `ret_18mth` double DEFAULT NULL,
  `ret_24mth` double DEFAULT NULL,
  `rank_ey` int(11) DEFAULT NULL,
  `rank_roce` int(11) DEFAULT NULL,
  `rank_combined` int(11) DEFAULT NULL,
  `rank_final` int(11) DEFAULT NULL,
  `fractile` int(11) DEFAULT NULL,
  KEY `sedol` (`sedol`),
  KEY `cusip` (`cusip`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8'

我絕不是MySQL專家,並且使用默認的cnf文件設置來設置數據庫。 任何建議將不勝感激。 我以為內存可能是個問題,但是該過程看起來比CPU占用更多的內存。

謝謝

您是否嘗試過在new_date字段上創建索引?

此外,我認為您也可以只使用1個LEFT JOIN ,間隔為24個月,然后根據您當前連接這些表的條件,使用if()函數更新字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM