加快mysql更新查询速度
我在一个相当大(65000行)的数据集上运行我认为相当直接的财务回报计算。我在一个较小的数据集上运行了这个查询,它运行得很好,但在大数据集上,我在大约20小时后终止了它 该查询在大约20年的月度数据中计算宇宙中500只股票的3、6、12、18和24个月回报加快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
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
),KEYdate
,sedol
),并且正在重新运行测试。它在某种程度上加快了速度(在宇宙的一个子集上)。我对您只使用一个左JOIN
和一个if()的想法很感兴趣。我不太明白怎么做。我在第三个时间间隔做这件事不是更好吗?因为有23个月的结果没有24个月的回报,但其他回报确实存在吗?我还假设我最初的假设是错误的,JOIN
比if()
?@大多数情况下-将索引添加到new_date
字段大约在10分钟内完成。非常感谢,大部分是莫斯塔科