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

MySQL每日批量入库慢,分表/删外键方案是否可行?

MySQL InnoDB批量入库性能优化问题

表结构与业务背景

我有一个MySQL InnoDB表table(表名及列名已修改),列信息如下:

  • date(主键,DATE类型)
  • var_a(主键、外键,INT类型)
  • var_b(主键、外键,INT类型)
  • rel_ab(DECIMAL类型)

rel_ab用于记录指定日期下var_a与var_b的关联关系,var_a和var_b分别关联其他两张不同的表。

补充细节

  • 数据按每日批量上传,单日数据量约700万行,仅几周后每日入库耗时就达到数小时,急需优化
  • 表启用了COMPRESSION="zlib"压缩配置
  • 除复合主键外,因外键约束要求,var_a和var_b分别单独建了索引
  • 查询仅执行SELECT * FROM table WHERE date = <date>,耗时仅数分钟
  • 几乎可以确定关联表other_table_a、other_table_b不会删除数据
  • 入库流程:用pandas的df.to_sql('temp', con, if_exists='replace', index=False, method='multi')上传到临时表,再通过INSERT IGNORE写入主表,最后删除临时表

表创建语句:

CREATE TABLE table (
  date date NOT NULL,
  var_a int NOT NULL,
  var_b int NOT NULL,
  rel_ab decimal(19,16) NOT NULL,
  PRIMARY KEY (date,`var_a`,`var_b`),
  KEY a_idx (var_a),
  KEY b_idx (var_b),
  CONSTRAINT a FOREIGN KEY (var_a) REFERENCES other_table_a (var_a) ON DELETE RESTRICT ON UPDATE CASCADE,
  CONSTRAINT b FOREIGN KEY (var_b) REFERENCES other_table_b (var_b) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMPRESSION="zlib"

现有方案疑问

我考虑了两种优化方案,但不确定是否合理:

  1. 删除外键约束:依赖数据上传流程保证数据正确性(当前场景下单独的var_a、var_b索引并未提升查询速度)。优点是能提升入库速度、降低磁盘占用,但可能威胁数据完整性。
  2. 按日期分表:创建如table_230501这类按日期命名的表,表结构包含var_a、var_b、rel_ab(因为查询只按单日期进行)。优点同样是提升入库速度、减少磁盘占用,但会导致Schema混乱,且我没见过这类分表案例。

请问这两种方案是否合理?除此之外,还有哪些批量入库速度的优化方案?


内容的提问来源于stack exchange,提问作者cw3498

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:42:48