单个批处理查询或映射查询以提高效率?

Single batched query or mapped queries for efficiency?

我是 运行 node-mysql 用于将数据插入我的 MySQL 数据库 运行 DynamoDB。

我可以选择在 for 循环中执行 'mini' 插入查询:

var myData= [{"key": "abc", "value": "xyz"},{..},{..}]
var mapData = myData.map(function(data){
    var key = data.key;
    var value = data.value;
    var payload = {
      key: key,
      value: value
    };

    connection.query("INSERT INTO mytable SET ?", payload, function(err,result){
       //Do stuff
    });
});

或者我可以使用嵌套数组方法:

myData = [["key", "value"], [.., ..], [.., ..]]
connection.query("INSERT INTO mytable (key, value) VALUE ?", [myData], function(err, result){
  //Do Stuff..
});

我的数据库很大,myData数组也会很大

哪种方法最有效?

在这种情况下,如果性能很重要,那么最好在打算 运行 应用程序的硬件上进行自己的测试。网络延迟、磁盘延迟和可用 RAM 等因素会产生影响 - 以及数据库服务器处理其他查询或任务的繁忙程度。

在许多情况下,您会认为前一个操作是最快的,因为它只需要通过 MySQL 查询分析器一次,并且可以将数据批量写入持久存储,而不是尽可能多的小数据写入 - 尽管这再次取决于您的数据库和 OS 使用的刷新配置选项。

大写入的缺点是数据库需要等到它拥有整个查询才能处理它,因为它必须检查整个写入是否有效,并且取决于 MySQL table 格式,它可能会锁定 table 以防止其他操作继续进行。短小的写入可能会更快地完成工作。

另请注意 MySQL 有一个 max_allowed_packet 设置,需要为真正的大写入增加。

TLDR - 如果它很重要,请测试两者并使用在您的特定应用程序中有效的方法。