首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速MySQL导入触发器的执行过程

问加速MySQL导入触发器的执行过程
EN

Database Administration用户
提问于 2018-03-26 22:36:26
回答 1查看 983关注 0票数 -1

我对数据库管理相当陌生。目前我必须解决以下情况。我有一个来自MySQL InnoDB表的256 to转储文件(大约300万条记录),必须加载到数据库中。

问题是,对于转储中的每一条记录,数据库必须运行一系列触发器才能从特定的表中重建数据。我可以这样说明这个过程:

dump.record (inserts) => schema.table_a =>{fires_trigger_a} (inserts)=> schema.table_b =>{fires_trigger_b} (inserts)=> ... {fires_trigger_x}(inserts)=> schema.table_final

我已经尝试过三种方法:

  1. 直接将转储导入到启用状态的所有触发器的初始表。这种方法使记录的插入速度非常快,但没有触发任何触发器。(我认为背后的原因是转储中的LOCK TABLE WRITE语句和/或上述转储开始时的DROP TABLE - CREATE TABLE语句)
  2. 删除LOCK TABLE WRITE和DROP TABLE - CREATE TABLE语句的导入编辑转储,只在转储中保留INSERT INTO语句。(这种方法按预期的方式触发触发器,但使数据导入非常慢,而且数据库在取消后无法使用,仅在30分钟内上传了所有记录的2%。)
  3. 导入用mysqldump创建的txt文件,该文件只包含由选项卡分隔的数据。( 15分钟后,进程被中止,初始表没有得到任何记录。)

上述任何一种方法都没有成功,因为这是几种导入中的第一种,而且目前我不能让服务器运行导入很长一段时间。我在想,也许有一种配置MySQL社区服务器安装的方法,我目前正在使用它来优化流程,但正如我之前所说的,我只是在学习。

感谢您的时间,并为任何拼写错误的单词或语法错误的借口。

EN

回答 1

Database Administration用户

发布于 2018-04-05 02:13:09

为了装一张大桌子(S),我会

  1. 将数据(LOAD DATA或拉入转储)加载到表中--但是没有触发器或外键,至少没有启用。
  2. 执行查询以执行所需的转换。这可能包括修改其他表,等等。但是这会成批地完成,而不是一次一行,因此速度要快得多。
  3. 然后考虑一下触发器/FKs,等等,用于单独插入(或分组)的未来行。

“正常化”是一项工作量很大的共同任务。它可以在两个语句中完成,比300万次触发器调用要快得多:

代码语言:javascript
复制
INSERT IGNORE INTO norm
    SELECT DISTINCT name FROM loaded_table;
UPDATE loaded_table JOIN norm USING(name)
    SET loaded_table.id = norm.id;

这个特别的例子给出了更详细的这里。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/202350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档