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"
现有方案疑问
我考虑了两种优化方案,但不确定是否合理:
- 删除外键约束:依赖数据上传流程保证数据正确性(当前场景下单独的
var_a、var_b索引并未提升查询速度)。优点是能提升入库速度、降低磁盘占用,但可能威胁数据完整性。 - 按日期分表:创建如
table_230501这类按日期命名的表,表结构包含var_a、var_b、rel_ab(因为查询只按单日期进行)。优点同样是提升入库速度、减少磁盘占用,但会导致Schema混乱,且我没见过这类分表案例。
请问这两种方案是否合理?除此之外,还有哪些批量入库速度的优化方案?
内容的提问来源于stack exchange,提问作者cw3498
相关产品推荐
相关产品推荐

