32

有时,我必须为一个项目重新导入数据,从而将大约 360 万行读入 MySQL 表(目前是 InnoDB,但我实际上并不局限于这个引擎)。“Load data infile...”已被证明是最快的解决方案,但它有一个折衷: - 在没有密钥的情况下导入时,导入本身需要大约 45 秒,但创建密钥需要很长时间(已经运行了 20 分钟.. .)。- 使用表上的键进行导入会使导入速度变慢

表的 3 个字段上有键,引用数字字段。有什么办法可以加速这个吗?

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

非常感谢 DBa

4

3 回答 3

54

如果您使用的是 innodb 和批量加载,这里有一些提示:

将您的 csv 文件排序为目标表的主键顺序:记住 innodb 使用聚集的主键,因此如果排序它会加载得更快!

我使用的典型加载数据文件:

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
于 2010-03-23T22:54:23.940 回答
7

这篇博文已经快 3 年了,但它仍然具有相关性,并且对优化“LOAD DATA INFILE”的性能有一些很好的建议:

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

于 2010-03-17T19:25:36.403 回答
1

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

于 2013-03-13T12:23:52.660 回答