加快mysql更新查询速度

加快mysql更新查询速度,mysql,performance,Mysql,Performance,我在一个相当大(65000行)的数据集上运行我认为相当直接的财务回报计算。我在一个较小的数据集上运行了这个查询,它运行得很好,但在大数据集上,我在大约20小时后终止了它 该查询在大约20年的月度数据中计算宇宙中500只股票的3、6、12、18和24个月回报 UPDATE master_backup AS curr LEFT OUTER JOIN master AS mo3 ON ((curr.new_date = LAST_DAY(mo3.ne

我在一个相当大(65000行)的数据集上运行我认为相当直接的财务回报计算。我在一个较小的数据集上运行了这个查询,它运行得很好,但在大数据集上,我在大约20小时后终止了它

该查询在大约20年的月度数据中计算宇宙中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密集型,而不是内存密集型


谢谢

您是否尝试过在
新建日期
字段上创建索引


此外,我认为您也可以在24个月的时间间隔内只使用1
LEFT JOIN
,然后根据您当前加入这些表的条件,使用if()函数更新字段。

您有什么理由在纯SQL中这样做吗?你能使用PHP甚至是存储过程吗?@Brian我从来没有使用过PHP,我最初想用“R”来做,但我认为SQL会更快。目前,我只是在mysql工作台上运行它,但我希望在它正常工作后将其放入存储过程中。我没有意识到它会影响运行时间。与其说它会影响运行时间,不如说它会影响运行时间,因为您可以运行更小的逻辑查询以更高效地获取数据。您同时在同一张表上进行了大量扫描。将其拆分为多个单独的查询可能会使其更快。@大多数情况下,是的,我刚刚更新了索引
UNIQUE KEY
date&sedol`(
new\u date
sedol
),KEY
date
sedol
),并且正在重新运行测试。它在某种程度上加快了速度(在宇宙的一个子集上)。我对您只使用一个
左JOIN
和一个if()的想法很感兴趣。我不太明白怎么做。我在第三个时间间隔做这件事不是更好吗?因为有23个月的结果没有24个月的回报,但其他回报确实存在吗?我还假设我最初的假设是错误的,
JOIN
if()
?@大多数情况下-将索引添加到
new_date
字段大约在10分钟内完成。非常感谢,大部分是莫斯塔科