2016-10-23 68 views
1

我正在運行node-mysql將數據插入到運行DynamoDB的MySQL數據庫中。單個批處理查詢或映射查詢的效率?

我有內部進行「小」插入查詢for循環的選擇:

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數組也將非常大。

哪種方法最有效?

+0

'INSERT INTO mytable(key,value)VALUE' ...這甚至不會運行,因爲它應該是'VALUES'。但是,除此之外,你是否計劃在兩種'INSERT'語法中包含多個記錄?如果是這樣,爲什麼你會期望一個比另一個顯着更快/更慢? –

回答

1

在這樣的情況下,如果性能很重要,那麼在您打算運行應用程序的硬件上進行自己的測試是一個不錯的主意。網絡延遲,磁盤延遲和可用RAM等因素起作用 - 以及數據庫服務器與其他查詢或任務的繁忙程度。

在許多情況下,您會希望前面的操作最快,因爲它只需要經過一次MySQL查詢分析器,數據可以批量寫入持久性存儲器,而不是像許多小寫入一樣 - 儘管再次這取決於您的數據庫和操作系統正在使用的flush配置選項。

大寫的缺點是數據庫需要等到它有整個查詢才能處理它,因爲它必須檢查整個寫入是否有效,並且根據MySQL表格格式,它可能會鎖定該表防止其他操作繼續進行。較小的寫入可能會更快地完成工作。

還要注意,MySQL有一個max_allowed_packet,這個設置對於真正的大寫操作來說需要增加。

TLDR - 如果重要,請測試兩者並使用適用於您的特定應用程序的內容。

+0

目前我運行較小的查詢方法,但是由於長時間處理查詢導致行被鎖定,因此我在查詢隊列中遇到了重大問題。你之前有過這種經歷嗎? –

+0

不具體。但是,在爲克隆數據庫創建查詢時,mysql_dump使用「嵌套」方法。所以'嵌套'可能是要走的路。也許每個查詢插入20-50行,但這實際上取決於數據的大小。如果超過max_allowed_pa​​cket,則插入將被拒絕。 –