You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

6500万行大表Trade_type计算SQL执行过慢,3、4类型查询耗时极长咨询

问题根因分析
  • 缺失必要的联合索引
    你当前tmp_holdings_all只有主键id的索引,mlha表也没有针对关联字段的索引,两个表做JOIN时只能走全表扫描,6500万级数据下关联的时间复杂度会达到O(M*N),这是执行超时的核心原因。
  • 计算逻辑冗余
    你计算Trade_type=0/1/2时已经完成了两个表的匹配,未匹配到的tmp_holdings_all记录天然就是Trade_type=3的场景,不需要再做一次RIGHT JOIN再过滤的重复计算。
  • 低效的语法选择
    REPLACE INTO本质是先删除冲突记录再插入,会产生额外的索引维护和行锁开销,远不如直接使用INSERT + NOT EXISTS的组合高效。
优化方案

第一步:新增必要索引

在执行所有计算前先给两个表创建关联用的联合索引:

-- 给当日临时表加联合索引
CREATE INDEX idx_fund_ticker ON tmp_holdings_all(Fund, Ticker);
-- 给前一交易日数据表加联合索引,数据量小的话可以设为唯一索引进一步提速
CREATE UNIQUE INDEX idx_mlha_fund_ticker ON mlha(Fund, Ticker);

如果mlha表是你每次任务新建的临时表,建议提取数据时只取需要的Fund、Ticker、SharesOwned三个字段即可,不需要全量字段,进一步缩小数据扫描范围。

第二步:简化Trade_type计算逻辑

计算0/1/2类型(直接关联更新,省去子查询临时表开销)

UPDATE tmp_holdings_all tha
JOIN mlha ON tha.Fund = mlha.Fund AND tha.Ticker = mlha.Ticker
SET tha.Trade_type = CASE
    WHEN mlha.SharesOwned = tha.SharesOwned THEN 0
    WHEN mlha.SharesOwned > tha.SharesOwned THEN 1
    ELSE 2
END;

计算3类型(直接更新未匹配记录,无需再次JOIN)

UPDATE tmp_holdings_all SET Trade_type = 3 WHERE Trade_type IS NULL;

计算4类型(替换REPLACE为INSERT,用NOT EXISTS优化匹配逻辑)

INSERT INTO tmp_holdings_all(Fund, Ticker, SharesOwned, Trade_type, DateAdded)
SELECT 
    mlha.Fund, 
    mlha.Ticker, 
    mlha.SharesOwned, 
    4,
    -- 这里替换为你实际的当日日期取值逻辑
    CURDATE()
FROM mlha
WHERE NOT EXISTS (
    SELECT 1 FROM tmp_holdings_all tha 
    WHERE tha.Fund = mlha.Fund AND tha.Ticker = mlha.Ticker
);

内容的提问来源于stack exchange,提问作者H Aßdøµ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:00:02