单个批处理查询或映射查询以提高效率?
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 - 如果它很重要,请测试两者并使用在您的特定应用程序中有效的方法。
我是 运行 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 - 如果它很重要,请测试两者并使用在您的特定应用程序中有效的方法。