MySQL加载数据infile - 加速?
Posted
技术标签:
【中文标题】MySQL加载数据infile - 加速?【英文标题】:MySQL load data infile - acceleration? 【发布时间】:2011-01-28 15:32:58 【问题描述】:有时,我必须为一个项目重新导入数据,从而将大约 360 万行读入 mysql 表(目前是 InnoDB,但我实际上并不局限于这个引擎)。 “加载数据文件...”已被证明是最快的解决方案,但它有一个权衡: - 在没有密钥的情况下导入时,导入本身大约需要 45 秒,但创建密钥需要很长时间(已经运行了 20 分钟......)。 - 使用表上的键进行导入会使导入速度变慢
表格的 3 个字段上有键,引用数字字段。 有什么方法可以加快这个速度?
另一个问题是:当我终止启动慢查询的进程时,它继续在数据库上运行。有什么方法可以在不重启mysqld的情况下终止查询?
非常感谢 DBa
【问题讨论】:
大约 60 到 100 个字节,5 到 8 个字段。没什么大不了的,只是数量庞大让整个事情变得如此缓慢。 【参考方案1】:如果您使用的是 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
【讨论】:
禁用 unique_checks 已经提高了性能,以及按主键排序。谢谢! 10 年前的解决方案仍然适用。通过建议的优化,我从 400k/min 提高到 7M/min。 2021 年 3 月:我正在使用 8.0.17 版中引入到 mySQL 的并行导入实用程序(多线程 LOAD INFILE)util.importTable。除了 sql_log_bin=0,我在这里列出了所有优化。添加 sql_log_bin 可将具有 310 万行的索引 1.1 GB 文件的加载时间从 6:40 缩短到 6:19,缩短了 21 秒。【参考方案2】:这篇博文已经快 3 年了,但它仍然具有相关性,并且对优化“LOAD DATA INFILE”的性能有一些很好的建议:
http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/
【讨论】:
【参考方案3】:InnoDB 是一个相当不错的引擎。但是,它高度依赖于“调整”。一件事是,如果您的插入不是按主键递增的顺序,innoDB 可能需要比 MyISAM 更长的时间。这可以通过设置更高的 innodb_buffer_pool_size 轻松克服。我的建议是在专用 MySQL 机器上将其设置为总 RAM 的 60-70%。
【讨论】:
以上是关于MySQL加载数据infile - 加速?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 加载数据本地 Infile - 路径作为用户变量
使用html表单导入csv数据...使用PHP脚本加载数据infile和MySQL