MySQL加载数据infile - 加速?

时间:2010-03-17 15:35:42

标签: mysql performance indexing load-data-infile

有时,我必须重新导入一个项目的数据,因此在MySQL表中读取大约360万行(目前是InnoDB,但实际上并不仅限于此引擎)。 “加载数据infile ...”已被证明是最快的解决方案,但它有一个权衡: - 导入时不使用密钥,导入本身大约需要45秒,但密钥创建需要很长时间(已运行20分钟......)。 - 使用表上的键进行导入会导致导入速度变慢

表中有3个字段的键,引用数字字段。 有没有办法加速这个?

另一个问题是:当我终止启动慢查询的进程时,它继续在数据库上运行。有没有办法在不重启mysqld的情况下终止查询?

非常感谢 DBA

3 个答案:

答案 0 :(得分:45)

如果你正在使用innodb和批量加载这里有一些提示:

将csv文件排序为目标表的主键顺序:记住innodb使用 群集主键,如果它已经排序,它将加载更快!

我使用的典型负载数据infile:

truncate <table>;

set autocommit = 0;

load data infile <path> into table <table>...

commit;

可用于增加加载时间的其他优化:

set unique_checks = 0;
set foreign_key_checks = 0;
set sql_log_bin=0;

将csv文件拆分为更小的块

我在批量加载过程中观察到的典型导入统计数据:

3.5 - 6.5 million rows imported per min
210 - 400 million rows per hour

答案 1 :(得分:6)

此博客文章已有近3年的历史,但它仍然具有相关性,并且对于优化“LOAD DATA INFILE”的性能有一些很好的建议:

http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/

答案 2 :(得分:1)

InnoDB是一个非常好的引擎。但是,它高度依赖于“调整”。有一件事是,如果你的插入不是增加主键的顺序,innoDB可能比MyISAM花费更长的时间。通过设置更高的innodb_buffer_pool_size可以轻松克服这个问题。我的建议是在专用的MySQL机器上将其设置为总RAM的60-70%。