1

I have a MySQL database that I use only for logging. It consists of several simple look-alike MyISAM tables. There is always one local (i.e. located on the same machine) client that only writes data to db and several remote clients that only read data.

What I need is to insert bulks of data from local client as fast as possible.

I have already tried many approaches to make this faster such as reducing amount of inserts by increasing the length of values list, or using LOAD DATA .. INFILE and some others.

Now it seems to me that I've came to the limitation of parsing values from string to its target data type (doesn't matter if it is done when parsing queries or a text file).

So the question is:

does MySQL provide some means of manipulating data directly for local clients (i.e. not using SQL)? Maybe there is some API that allow inserting data by simply passing a pointer.

Once again. I don't want to optimize SQL code or invoke the same queries in a script as hd1 adviced. What I want is to pass a buffer of data directly to the database engine. This means I don't want to invoke SQL at all. Is it possible?

4

8 回答 8

1

使用mysql的LOAD DATA命令:

将数据以 CSV 格式写入文件,然后执行以下 OS 命令:

LOAD DATA INFILE 'somefile.csv' INTO TABLE mytable

有关更多信息,请参阅文档

于 2013-05-28T12:50:20.603 回答
1

除了 LOAD DATA INFILE,我不确定是否有任何其他方法可以在不使用 SQL 的情况下将数据导入 MySQL。如果要避免多次解析,则应该使用支持参数绑定的客户端库,查询可以解析和准备一次,并使用不同的数据多次执行。

但是,我非常怀疑解析查询是您的瓶颈。这是专用的数据库服务器吗?使用什么样的硬盘?他们快吗?您的 RAID 控制器是否有电池支持的 RAM?如果是这样,您可以优化磁盘写入。你为什么不使用 InnoDB 而不是 MyISAM?

于 2013-05-28T13:35:07.393 回答
0

使用 MySQL,您可以使用一个插入语句插入多个元组。我没有一个例子,因为我几年前就做过了,现在已经没有来源了。

于 2013-05-28T07:26:46.943 回答
0

考虑如上所述使用INSERT具有多个值的一个:

INSERT INTO table_name (col1, col2) VALUES (1, 'A'), (2, 'B'), (3, 'C'), ( ... )

这导致您只需使用一个更大的查询而不是几个较小的查询来连接到您的数据库。一次通过门把整个沙发拿进去比把沙发的所有拆卸部件来回跑,每次都打开门要容易得多。:)

除此之外,您还可以LOCK TABLES table_name WRITE在之前INSERTUNLOCK TABLES之后运行。这将确保在此期间没有插入任何其他内容。

锁定表

于 2013-05-28T07:45:57.863 回答
0

INSERT into foo (foocol1, foocol2) VALUES ('foocol1val1', 'foocol2val1'),('foocol1val2','foocol2val2')等等应该排序你。更多信息和示例代码将在此处找到。如果您还有其他问题,请发表评论。

更新

如果您不想使用 SQL,请尝试使用此 shell 脚本执行任意数量的插入,将其放入文件中,例如 insertToDb.sh,然后继续您的白天/晚上:

#!/bin/sh
mysql --user=me --password=foo dbname -h foo.example.com -e "insert into tablename (col1, col2) values ($1, $2);"

调用为sh insertToDb.sh col1value col2value. 如果我仍然误解了您的问题,请发表另一条评论。

于 2013-05-28T07:33:25.700 回答
0

经过一番调查,我发现无法将数据直接传递给 mysql 数据库引擎(不解析它)。

我的目标是尽可能加快本地客户端和数据库服务器之间的通信。这个想法是,如果客户端是本地的,那么它可以使用一些 api 函数将数据传递给数据库引擎,从而不使用(即解析)其中的 SQL 和值。bobwienholt提出了唯一最接近的解决方案(使用准备好的语句和绑定参数)。但LOAD DATA .. INFILE在我的情况下似乎要快一些。

于 2013-05-30T05:48:27.817 回答
-1

在不使用插入语句的情况下,使用“Sqllite Studio”在 mysql 中插入数据。它是免费和开源的,所以你可以下载和检查。

于 2013-05-28T10:15:24.013 回答
-1

在不使用 insert into 或 update 查询的情况下在 MS SQL 上插入数据的最佳方法就是访问 MS SQL 接口。右键单击表名并选择“编辑前 200 行”。然后,您只需键入每个单元格即可直接在数据库中添加数据。要启用搜索或使用 select 或其他 sql 命令,只需右键单击您选择的 200 行中的任何一行。转到窗格然后选择 SQL,您可以添加 sql 命令。一探究竟。:D

于 2013-05-28T08:17:40.017 回答