MySQL如何导入大量数据?

有时我们会遇到需要将大量数据导入MySQL的需求,一般数据存储在csv或者txt中,数据由","分隔。这里提供两种方案供大家选择。

一、创建测试表

为了测试,我们先创建数据库和表,并创建一个用户。

create database loaddata;

use loaddata

CREATE TABLE `test` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `sp_name` varchar(50) NOT NULL DEFAULT '' COMMENT '服务商名称',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='服务商类型';

CREATE USER 'loader'@'%' IDENTIFIED BY '1234Abcd*';
GRANT ALL PRIVILEGES ON loaddata.* TO 'loader'@'%';

二、方案一:load data infile

2.1说明

load data infile其实有两种形态,load data infile和load data local infile。

  • load data infile:只能在MySQL服务器上执行,且需要文件存放到指定位置,可以使用show variables like ‘%secure%’; 查看

  • load data local infile:可以在本地执行

2.2操作

2.2.1开启local_infile

首先我们需要在MySQL服务器开启local_infile

# 查看
show variables like 'local_infile';
# 开启
set global local_infile=on;

如果不开启的话,执行load data local infile会报ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides。

2.2.2执行上传

通过如下命令进行上传。load data local infile会将数据一块一块的上传,但对这块数据是作为整个事务进行上传的。

load data local infile "/Users/bytedance/Downloads/1.csv" into table loaddata.test fields terminated by',';

执行效果为:

图片

查看表里的数据:

图片

三、方案二:mysql shell

load data infile 不够灵活,另外可能因为事务导致性能出现问题,我们可以用mysql shell实现上传,底层使用的也是load data infile,但提供了更高的灵活性。

3.1安装

下载地址为:https://downloads.mysql.com/archives/shell/

我们可以从该地址选择合适的版本,mysql shell的版本需要和OS的版本匹配。

3.2使用

3.2.1连接mysql

对于mysql操作,我们可以通过如下命令连接到mysql

mysqlsh loader@127.0.0.1:3306

图片

3.2.2更改编程语言

如上图所示,连接后的js表示现在是JavaScript,我们可以切换成python或者sql,命令为:

\sql
\py

图片

3.3.3导入数据

导入数据我们使用python语言,命令如下:

util.import_table(  
        "/Users/bytedance/Downloads/1.csv",
    {
        "schema": "loaddata", 
        "table": "test",
        "dialect": "csv-unix",
        "skipRows": 0,
        "showProgress": True,
        "bytesPerChunk": "1M",
        "threads":2,
        "maxRate": "2M",
        "columns": ["id", "sp_name"]
        });

几个重要参数说明一下:

schema:数据库名

table:表名

showProgress:展示进度

bytesPerChunk:默认的 chunk 大小为 50M,我们可以调整 chunk 的大小,减少事务大小,如我们将 chunk 大小调整为 1M

threads:使用几个线程来导入数据,这次设置2个

maxRate:每个线程的速率为 M/s,这次设置为2M/s,这意味最高不会超过 2*2=4M/s。

图片

图片

其它参数大家可以参考这篇文章:https://dev.mysql.com/doc/dev/mysqlsh-api-python/8.0/group__util.html#ga14b9db6de5a13f78a1a41a537ed07887

资料

  1. MySQL 执行load data infile时同步原理及注意事项

  2. 将CSV文件快速导入MySQL中

  3. 13.2.5. LOAD DATA INFILE语法

  4. 请教 关于 load data local infile 导入10G左右文本 到导入3G左右速度就特别慢

  5. 对MySQL load data infile的一点想法

  6. mysql load file 权限_Mysql 命令 load data infile 权限问题

  7. 使用 LOAD DATA LOCAL INFILE,sysbench 导数速度提升30%

  8. 技术分享 | MySQL Shell import_table 数据导入

  9. mac mysql shell 安装_mysql for mac 安装和基本操作

  10. mysql shell是什么意思_MYSQL SHELL 到底是个什么局 剑指 “大芒果”

  11. shell下载地址

  12. 教你使用MySQL Shell连接数据库的方法

  13. https://dev.mysql.com/doc/dev/mysqlsh-api-javascript/8.0/group__util.html#gaa1ee4527bdb71fa736f6cbe168064079 官网

  14. https://dev.mysql.com/doc/dev/mysqlsh-api-python/8.0/group__util.html

  15. https://www.yisu.com/zixun/598441.html

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式

  2. 招聘

  3. 思考

  4. 存储

  5. 算法系列

  6. 读书笔记

  7. 小工具

  8. 架构

  9. 网络

  10. Go语言

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
当你在MySQL导入大量数据时,可能会遇到一些问题。一个常见的问题是导入速度很慢,导致耗时较长。这可能是由于默认的配置限制了导入数据的大小。在MySQL中,有一个配置项叫做`max_allowed_packet`,它控制了一次网络传输的最大数据包大小。默认情况下,这个值是4MB。 为了解决这个问题,你可以尝试修改`max_allowed_packet`的值,使其适应你正在导入数据量。你可以在`my.ini`配置文件中找到这个选项,并将其增加到一个更大的值,例如10MB或更大。修改完成后,记得重启MySQL服务,以使修改生效。 此外,如果你面临的是导入速度过慢的问题,你还可以考虑优化数据库的插入性能。一种常见的方法是使用批量插入,即将多条记录一起插入到数据库中,而不是每条记录都进行一次单独的插入操作。这样可以减少插入操作的次数,从而提高插入速度。 总结起来,当你在MySQL导入大量数据时,你可以尝试以下步骤来解决问题: 1. 修改`max_allowed_packet`配置项的值,使其适应你正在导入数据量。 2. 重启MySQL服务,使修改生效。 3. 考虑使用批量插入的方式来提高插入速度。 希望以上信息对你有帮助,如果还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [mysql快速导入大量数据问题](https://blog.csdn.net/weixin_28761455/article/details/113158471)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [MySQL导入数据量过大报错解决办法](https://blog.csdn.net/qq_42846807/article/details/114304995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值