如何像写入常规文件一样写入 MYSQL 数据库
How can I write to MYSQL DB as if i were writing to a regular file
我想以与使用 ofstream 写入常规二进制文件相同的速度写入 MYSQL DB table。
通常情况下,使用 ofstream 向文件写入 100M 字节不到 1 秒。
而在MYSQL中,我插入这100M字节的时间超过9秒,时间非常长(我使用了MYISAM table和多行插入语句)。
换句话说,我想配置 mysql 使其不进行(检查、解析、....等),只是写入 table 就好像它是二进制文件一样文件
那么,有什么方法可以实现吗?
编辑 1:
这是我要填充的table,
create table Frames
(
f1 varchar(8) not null ,
f2 varchar(6) not null ,
f3 varchar(6) not null ,
f4 varchar(2) not null ,
f5 varchar(4),
f6 varchar(16000),
f7 varchar(4) not null
);
编辑 2:
这是用于插入的代码片段,其中 MAX 定义为 10000
for (int c = 0; c < 100; ++c)
{
string query("insert into Frames (f1,f2,f3,f4,f5,f6,f7) values");
for (int i = 1; i <= MAX; ++i)
{
query += "('AAAAAAAA','000001','000002','05','5005','000000000100000000010000000001000000000100','MKJE')";
query += (i==MAX) ? ";" : "," ;
}
if (mysql_query(conn, query.c_str() )) {
fprintf(stderr, "%s\n", mysql_error(conn));
return(1);
}
}
谢谢
您应该尝试以下步骤,直到找到适合您的表现:
- 尝试LOAD DATA INFILE语句
- 试试 Nosql
- 假设您的 mysql 实例已正确调整,您别无选择,只能垂直扩展您的数据库服务器和网络基础设施
最后的想法是,如果您不需要 mysql 索引或 ACID 等功能,为什么不直接写入文件。 因为您永远不会获得与写入文件相同的性能
您可以使用各种技巧来改进 speed of INSERT。 link 是 MySQL 手册,其中涵盖了很多技巧。
但您永远无法接近直接写入文件的速度。 MySQL 在幕后做了很多额外的工作,解析 SQL,强制访问权限,强制数据约束,并将数据转换为数据类型的紧凑表示,然后将数据组织成高效归档,并更新索引。
如果您使用 InnoDB(默认)作为您的存储引擎,您总是至少要更新主键索引。 InnoDB 将 table 数据存储为聚集索引。
真正获得与附加到文件相同速度的唯一方法是使用 CSV storage engine,然后 直接附加到该文件。即根本不用SQL,直接写入数据文件即可。如果文件位于正确的位置并且具有正确的名称,它将成为您 MySQL table.
的数据
我想以与使用 ofstream 写入常规二进制文件相同的速度写入 MYSQL DB table。
通常情况下,使用 ofstream 向文件写入 100M 字节不到 1 秒。
而在MYSQL中,我插入这100M字节的时间超过9秒,时间非常长(我使用了MYISAM table和多行插入语句)。
换句话说,我想配置 mysql 使其不进行(检查、解析、....等),只是写入 table 就好像它是二进制文件一样文件
那么,有什么方法可以实现吗?
编辑 1:
这是我要填充的table,
create table Frames
(
f1 varchar(8) not null ,
f2 varchar(6) not null ,
f3 varchar(6) not null ,
f4 varchar(2) not null ,
f5 varchar(4),
f6 varchar(16000),
f7 varchar(4) not null
);
编辑 2:
这是用于插入的代码片段,其中 MAX 定义为 10000
for (int c = 0; c < 100; ++c)
{
string query("insert into Frames (f1,f2,f3,f4,f5,f6,f7) values");
for (int i = 1; i <= MAX; ++i)
{
query += "('AAAAAAAA','000001','000002','05','5005','000000000100000000010000000001000000000100','MKJE')";
query += (i==MAX) ? ";" : "," ;
}
if (mysql_query(conn, query.c_str() )) {
fprintf(stderr, "%s\n", mysql_error(conn));
return(1);
}
}
谢谢
您应该尝试以下步骤,直到找到适合您的表现:
- 尝试LOAD DATA INFILE语句
- 试试 Nosql
- 假设您的 mysql 实例已正确调整,您别无选择,只能垂直扩展您的数据库服务器和网络基础设施
最后的想法是,如果您不需要 mysql 索引或 ACID 等功能,为什么不直接写入文件。 因为您永远不会获得与写入文件相同的性能
您可以使用各种技巧来改进 speed of INSERT。 link 是 MySQL 手册,其中涵盖了很多技巧。
但您永远无法接近直接写入文件的速度。 MySQL 在幕后做了很多额外的工作,解析 SQL,强制访问权限,强制数据约束,并将数据转换为数据类型的紧凑表示,然后将数据组织成高效归档,并更新索引。
如果您使用 InnoDB(默认)作为您的存储引擎,您总是至少要更新主键索引。 InnoDB 将 table 数据存储为聚集索引。
真正获得与附加到文件相同速度的唯一方法是使用 CSV storage engine,然后 直接附加到该文件。即根本不用SQL,直接写入数据文件即可。如果文件位于正确的位置并且具有正确的名称,它将成为您 MySQL table.
的数据