我需要将一个包含 2000 万行和 2 列的 csv 文件导入数据库,但是当我尝试使用 MySQL Workbench 的数据导入向导执行此操作时,速度非常慢,可能需要 1 个月才能完成,查看进度条。
我希望必须有一些更快的方法来做到这一点。
始终使用
Load Data Infile
作为大量数据的首次尝试。
Mysql 手册页面Load Data Infile。
为这个问题写了几个答案,但为了进行同行比较,请参阅这个人的问题和我的答案以及他对 Workbench 与 Load Data Infile 的时间比较。
这是一个替代方案。
将 CSV 数据转储到 SQL 脚本中,您需要为此编写一些代码。
基本上,您的 csv 数据将被转换为类似于以下命令
INSERT INTO TABLE_NAME values(1,2),(1,3),....;
SOURCE
命令如果您不想编写代码,我建议尝试另一个免费的 GUI 客户端,例如 HeidiSQL。它导入 CSV/文本文件的速度比 MySQL Workbench 快得多。
我在 MySQL Workbench 上也遇到了类似的问题。 我找到的替代方案是 Toad for MySQL (https://www.toadworld.com/m/freeware/1469)
我需要 40 分钟才能通过 MySQL 管理连接到远程 MySQL 服务器。在 MySQL 服务器本身上,上传需要几分钟。使用蟾蜍,我可以连接到远程服务器并在几分钟内上传。我确实尝试过 HeidiSQL,但发现它导入起来不太友好。
总是更喜欢load data infile来导入数据集,不方便的是=>你必须在导入之前创建一个表结构。导入向导允许您直接从 csv 或 json 即时创建新表。
我认为这种缓慢的原因是:workbench 使用 python 作为导入向导。可以看到导入向导出现错误时的日志中,是python的控制台日志
如果您出于任何原因不想创建结构,您可以启动该进程,它将从 csv 创建表,然后终止该进程。然后,删除表中的所有内容并将数据加载到文件中。这是一种丑陋的“黑客”,但它对我有用。
您可以使用以下Python代码将csv文件转换为sql插入文件:
import csv
def csv_to_sql_insert(csv_filename, table_name):
with open(csv_filename, 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
columns = csv_reader.fieldnames
for row in csv_reader:
values = [f"'{row[col]}'" if isinstance(row[col], str) else str(row[col]) for col in columns]
sql_insert = f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({', '.join(values)});"
print(sql_insert)
# Replace these values with your actual CSV file and desired table name
csv_filename = 'data.csv'
table_name = 'your_table'
csv_to_sql_insert(csv_filename, table_name)